From e0caa71d10614b86de27b95eaa4512347ba6831b Mon Sep 17 00:00:00 2001 From: Amaury M <1293565+amaurym@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:40:03 +0100 Subject: [PATCH 1/5] fix(gov): Fix v3 votes migrations --- x/gov/migrations/v3/json_test.go | 5 ++-- x/gov/migrations/v3/store.go | 47 ++++++++++++++++++++++++++++++- x/gov/migrations/v3/store_test.go | 17 +++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/x/gov/migrations/v3/json_test.go b/x/gov/migrations/v3/json_test.go index 7adf946227c1..3801c8d4df85 100644 --- a/x/gov/migrations/v3/json_test.go +++ b/x/gov/migrations/v3/json_test.go @@ -20,6 +20,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) +var voter = sdk.MustAccAddressFromBech32("cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh") + func TestMigrateJSON(t *testing.T) { encodingConfig := moduletestutil.MakeTestEncodingConfig(gov.AppModuleBasic{}) clientCtx := client.Context{}. @@ -27,9 +29,6 @@ func TestMigrateJSON(t *testing.T) { WithTxConfig(encodingConfig.TxConfig). WithCodec(encodingConfig.Codec) - voter, err := sdk.AccAddressFromBech32("cosmos1fl48vsnmsdzcv85q5d2q4z5ajdha8yu34mf0eh") - require.NoError(t, err) - govGenState := v1beta1.DefaultGenesisState() propTime := time.Unix(1e9, 0) contentAny, err := codectypes.NewAnyWithValue(v1beta1.NewTextProposal("my title", "my desc").(proto.Message)) diff --git a/x/gov/migrations/v3/store.go b/x/gov/migrations/v3/store.go index 1e5e531b1f05..26b2b8570e90 100644 --- a/x/gov/migrations/v3/store.go +++ b/x/gov/migrations/v3/store.go @@ -6,7 +6,9 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" + govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" + govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) // migrateProposals migrates all legacy proposals into MsgExecLegacyContent @@ -18,7 +20,7 @@ func migrateProposals(store sdk.KVStore, cdc codec.BinaryCodec) error { defer iter.Close() for ; iter.Valid(); iter.Next() { - var oldProp v1beta1.Proposal + var oldProp govv1beta1.Proposal err := cdc.Unmarshal(iter.Value(), &oldProp) if err != nil { return err @@ -40,6 +42,45 @@ func migrateProposals(store sdk.KVStore, cdc codec.BinaryCodec) error { return nil } +// migrateVotes migrates all v1beta1 weighted votes (with sdk.Dec as weight) +// to v1 weighted votes (with string as weight) +func migrateVotes(store sdk.KVStore, cdc codec.BinaryCodec) error { + votesStore := prefix.NewStore(store, v1.VotesKeyPrefix) + + iter := votesStore.Iterator(nil, nil) + defer iter.Close() + + for ; iter.Valid(); iter.Next() { + var oldVote v1beta1.Vote + err := cdc.Unmarshal(iter.Value(), &oldVote) + if err != nil { + return err + } + + newVote := govv1.Vote{ + ProposalId: oldVote.ProposalId, + Voter: oldVote.Voter, + } + newOptions := make([]*govv1.WeightedVoteOption, len(oldVote.Options)) + for i, o := range oldVote.Options { + newOptions[i] = &govv1.WeightedVoteOption{ + Option: govv1.VoteOption(o.Option), + Weight: o.Weight.String(), // Convert to decimal string + } + } + newVote.Options = newOptions + bz, err := cdc.Marshal(&newVote) + if err != nil { + return err + } + + // Set new value on store. + votesStore.Set(iter.Key(), bz) + } + + return nil +} + // MigrateStore performs in-place store migrations from v2 (v0.43) to v3 (v0.46). The // migration includes: // @@ -47,5 +88,9 @@ func migrateProposals(store sdk.KVStore, cdc codec.BinaryCodec) error { func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec) error { store := ctx.KVStore(storeKey) + if err := migrateVotes(store, cdc); err != nil { + return err + } + return migrateProposals(store, cdc) } diff --git a/x/gov/migrations/v3/store_test.go b/x/gov/migrations/v3/store_test.go index ce5448cbca01..2a3f7cf32abd 100644 --- a/x/gov/migrations/v3/store_test.go +++ b/x/gov/migrations/v3/store_test.go @@ -41,6 +41,15 @@ func TestMigrateStore(t *testing.T) { store.Set(v1gov.ProposalKey(prop1.ProposalId), prop1Bz) store.Set(v1gov.ProposalKey(prop2.ProposalId), prop2Bz) + // Vote on prop 1 + options := []v1beta1.WeightedVoteOption{ + {Option: v1beta1.OptionNo, Weight: sdk.MustNewDecFromStr("0.5")}, + {Option: v1beta1.OptionYes, Weight: sdk.MustNewDecFromStr("0.5")}, + } + vote1 := v1beta1.NewVote(1, voter, options) + vote1Bz := cdc.MustMarshal(&vote1) + store.Set(v1gov.VoteKey(1, voter), vote1Bz) + // Run migrations. err = v3gov.MigrateStore(ctx, govKey, cdc) require.NoError(t, err) @@ -54,6 +63,14 @@ func TestMigrateStore(t *testing.T) { err = cdc.Unmarshal(store.Get(v1gov.ProposalKey(prop2.ProposalId)), &newProp2) require.NoError(t, err) compareProps(t, prop2, newProp2) + + var newVote1 v1.Vote + err = cdc.Unmarshal(store.Get(v1gov.VoteKey(prop1.ProposalId, voter)), &newVote1) + require.NoError(t, err) + // Without the votes migration, we would have 500000000000000000 in state, + // because of how sdk.Dec stores itself in state. + require.Equal(t, "0.500000000000000000", newVote1.Options[0].Weight) + require.Equal(t, "0.500000000000000000", newVote1.Options[1].Weight) } func compareProps(t *testing.T, oldProp v1beta1.Proposal, newProp v1.Proposal) { From 1aba91a6dd32500568f3d3a1cb1ede93159a506e Mon Sep 17 00:00:00 2001 From: Amaury M <1293565+amaurym@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:50:42 +0100 Subject: [PATCH 2/5] Change values --- x/gov/migrations/v3/store_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x/gov/migrations/v3/store_test.go b/x/gov/migrations/v3/store_test.go index 2a3f7cf32abd..d1359de7de00 100644 --- a/x/gov/migrations/v3/store_test.go +++ b/x/gov/migrations/v3/store_test.go @@ -43,8 +43,8 @@ func TestMigrateStore(t *testing.T) { // Vote on prop 1 options := []v1beta1.WeightedVoteOption{ - {Option: v1beta1.OptionNo, Weight: sdk.MustNewDecFromStr("0.5")}, - {Option: v1beta1.OptionYes, Weight: sdk.MustNewDecFromStr("0.5")}, + {Option: v1beta1.OptionNo, Weight: sdk.MustNewDecFromStr("0.3")}, + {Option: v1beta1.OptionYes, Weight: sdk.MustNewDecFromStr("0.7")}, } vote1 := v1beta1.NewVote(1, voter, options) vote1Bz := cdc.MustMarshal(&vote1) @@ -69,8 +69,8 @@ func TestMigrateStore(t *testing.T) { require.NoError(t, err) // Without the votes migration, we would have 500000000000000000 in state, // because of how sdk.Dec stores itself in state. - require.Equal(t, "0.500000000000000000", newVote1.Options[0].Weight) - require.Equal(t, "0.500000000000000000", newVote1.Options[1].Weight) + require.Equal(t, "0.300000000000000000", newVote1.Options[0].Weight) + require.Equal(t, "0.700000000000000000", newVote1.Options[1].Weight) } func compareProps(t *testing.T, oldProp v1beta1.Proposal, newProp v1.Proposal) { From 6d80b8059aec0ba7f90769f603d648f6b21ba7ef Mon Sep 17 00:00:00 2001 From: Amaury M <1293565+amaurym@users.noreply.github.com> Date: Thu, 8 Dec 2022 11:50:54 +0100 Subject: [PATCH 3/5] comment --- x/gov/migrations/v3/store_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/gov/migrations/v3/store_test.go b/x/gov/migrations/v3/store_test.go index d1359de7de00..95612a718547 100644 --- a/x/gov/migrations/v3/store_test.go +++ b/x/gov/migrations/v3/store_test.go @@ -67,7 +67,7 @@ func TestMigrateStore(t *testing.T) { var newVote1 v1.Vote err = cdc.Unmarshal(store.Get(v1gov.VoteKey(prop1.ProposalId, voter)), &newVote1) require.NoError(t, err) - // Without the votes migration, we would have 500000000000000000 in state, + // Without the votes migration, we would have 300000000000000000 in state, // because of how sdk.Dec stores itself in state. require.Equal(t, "0.300000000000000000", newVote1.Options[0].Weight) require.Equal(t, "0.700000000000000000", newVote1.Options[1].Weight) From d784aa65345034156eb29db260c2bb99da05e576 Mon Sep 17 00:00:00 2001 From: Amaury M <1293565+amaurym@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:40:24 +0100 Subject: [PATCH 4/5] fix lint --- x/gov/migrations/v3/store.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/gov/migrations/v3/store.go b/x/gov/migrations/v3/store.go index 26b2b8570e90..7f3cfe76c66e 100644 --- a/x/gov/migrations/v3/store.go +++ b/x/gov/migrations/v3/store.go @@ -7,7 +7,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" ) @@ -51,7 +50,7 @@ func migrateVotes(store sdk.KVStore, cdc codec.BinaryCodec) error { defer iter.Close() for ; iter.Valid(); iter.Next() { - var oldVote v1beta1.Vote + var oldVote govv1beta1.Vote err := cdc.Unmarshal(iter.Value(), &oldVote) if err != nil { return err From 3faf2cfa4e78ab650a22ab96c9296fdea6c86ae7 Mon Sep 17 00:00:00 2001 From: Amaury M <1293565+amaurym@users.noreply.github.com> Date: Thu, 8 Dec 2022 18:42:09 +0100 Subject: [PATCH 5/5] Add cl --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51229f5d15c1..1449fc9e70bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -105,6 +105,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### State Machine Breaking +* (x/gov) [#14214](https://github.com/cosmos/cosmos-sdk/pull/14214) Fix gov v0.46 migration to v1 votes. * (x/group) [#13742](https://github.com/cosmos/cosmos-sdk/pull/13742) Migrate group policy account from module accounts to base account. * (x/group) [#14071](https://github.com/cosmos/cosmos-sdk/pull/14071) Don't re-tally proposal after voting period end if they have been marked as ACCEPTED or REJECTED. * (codec) [#13307](https://github.com/cosmos/cosmos-sdk/pull/13307) Register all modules' `Msg`s with group's ModuleCdc so that Amino sign bytes are correctly generated.