github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v3/store.go (about) 1 package v3 2 3 import ( 4 corestoretypes "cosmossdk.io/core/store" 5 "cosmossdk.io/store/prefix" 6 storetypes "cosmossdk.io/store/types" 7 8 "github.com/cosmos/cosmos-sdk/codec" 9 "github.com/cosmos/cosmos-sdk/runtime" 10 sdk "github.com/cosmos/cosmos-sdk/types" 11 v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" 12 govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 13 govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" 14 ) 15 16 // migrateProposals migrates all legacy proposals into MsgExecLegacyContent 17 // proposals. 18 func migrateProposals(store storetypes.KVStore, cdc codec.BinaryCodec) error { 19 propStore := prefix.NewStore(store, v1.ProposalsKeyPrefix) 20 21 iter := propStore.Iterator(nil, nil) 22 defer iter.Close() 23 24 for ; iter.Valid(); iter.Next() { 25 var oldProp govv1beta1.Proposal 26 err := cdc.Unmarshal(iter.Value(), &oldProp) 27 if err != nil { 28 return err 29 } 30 31 newProp, err := convertToNewProposal(oldProp) 32 if err != nil { 33 return err 34 } 35 bz, err := cdc.Marshal(&newProp) 36 if err != nil { 37 return err 38 } 39 40 // Set new value on store. 41 propStore.Set(iter.Key(), bz) 42 } 43 44 return nil 45 } 46 47 // migrateVotes migrates all v1beta1 weighted votes (with sdk.Dec as weight) 48 // to v1 weighted votes (with string as weight) 49 func migrateVotes(store storetypes.KVStore, cdc codec.BinaryCodec) error { 50 votesStore := prefix.NewStore(store, v1.VotesKeyPrefix) 51 52 iter := votesStore.Iterator(nil, nil) 53 defer iter.Close() 54 55 for ; iter.Valid(); iter.Next() { 56 var oldVote govv1beta1.Vote 57 err := cdc.Unmarshal(iter.Value(), &oldVote) 58 if err != nil { 59 return err 60 } 61 62 newVote := govv1.Vote{ 63 ProposalId: oldVote.ProposalId, 64 Voter: oldVote.Voter, 65 } 66 newOptions := make([]*govv1.WeightedVoteOption, len(oldVote.Options)) 67 for i, o := range oldVote.Options { 68 newOptions[i] = &govv1.WeightedVoteOption{ 69 Option: govv1.VoteOption(o.Option), 70 Weight: o.Weight.String(), // Convert to decimal string 71 } 72 } 73 newVote.Options = newOptions 74 bz, err := cdc.Marshal(&newVote) 75 if err != nil { 76 return err 77 } 78 79 // Set new value on store. 80 votesStore.Set(iter.Key(), bz) 81 } 82 83 return nil 84 } 85 86 // MigrateStore performs in-place store migrations from v2 (v0.43) to v3 (v0.46). The 87 // migration includes: 88 // 89 // - Migrate proposals to be Msg-based. 90 func MigrateStore(ctx sdk.Context, storeService corestoretypes.KVStoreService, cdc codec.BinaryCodec) error { 91 store := storeService.OpenKVStore(ctx) 92 93 if err := migrateVotes(runtime.KVStoreAdapter(store), cdc); err != nil { 94 return err 95 } 96 97 return migrateProposals(runtime.KVStoreAdapter(store), cdc) 98 }