github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/migrations/v4/store.go (about) 1 package v4 2 3 import ( 4 "fmt" 5 "sort" 6 7 corestoretypes "cosmossdk.io/core/store" 8 "cosmossdk.io/store/prefix" 9 storetypes "cosmossdk.io/store/types" 10 11 "github.com/cosmos/cosmos-sdk/codec" 12 "github.com/cosmos/cosmos-sdk/runtime" 13 sdk "github.com/cosmos/cosmos-sdk/types" 14 "github.com/cosmos/cosmos-sdk/x/gov/exported" 15 v1 "github.com/cosmos/cosmos-sdk/x/gov/migrations/v1" 16 "github.com/cosmos/cosmos-sdk/x/gov/types" 17 govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1" 18 ) 19 20 func migrateParams(ctx sdk.Context, store storetypes.KVStore, legacySubspace exported.ParamSubspace, cdc codec.BinaryCodec) error { 21 dp := govv1.DepositParams{} 22 vp := govv1.VotingParams{} 23 tp := govv1.TallyParams{} 24 legacySubspace.Get(ctx, govv1.ParamStoreKeyDepositParams, &dp) 25 legacySubspace.Get(ctx, govv1.ParamStoreKeyVotingParams, &vp) 26 legacySubspace.Get(ctx, govv1.ParamStoreKeyTallyParams, &tp) 27 28 defaultParams := govv1.DefaultParams() 29 params := govv1.NewParams( 30 dp.MinDeposit, 31 defaultParams.ExpeditedMinDeposit, 32 *dp.MaxDepositPeriod, 33 *vp.VotingPeriod, 34 *defaultParams.ExpeditedVotingPeriod, 35 tp.Quorum, 36 tp.Threshold, 37 defaultParams.ExpeditedThreshold, 38 tp.VetoThreshold, 39 defaultParams.MinInitialDepositRatio, 40 defaultParams.ProposalCancelRatio, 41 defaultParams.ProposalCancelDest, 42 defaultParams.BurnProposalDepositPrevote, 43 defaultParams.BurnVoteQuorum, 44 defaultParams.BurnVoteVeto, 45 defaultParams.MinDepositRatio, 46 ) 47 48 bz, err := cdc.Marshal(¶ms) 49 if err != nil { 50 return err 51 } 52 53 store.Set(ParamsKey, bz) 54 55 return nil 56 } 57 58 func migrateProposalVotingPeriod(ctx sdk.Context, store storetypes.KVStore, cdc codec.BinaryCodec) error { 59 propStore := prefix.NewStore(store, v1.ProposalsKeyPrefix) 60 61 iter := propStore.Iterator(nil, nil) 62 defer iter.Close() 63 64 for ; iter.Valid(); iter.Next() { 65 var prop govv1.Proposal 66 err := cdc.Unmarshal(iter.Value(), &prop) 67 if err != nil { 68 return err 69 } 70 71 if prop.Status == govv1.StatusVotingPeriod { 72 store.Set(VotingPeriodProposalKey(prop.Id), []byte{1}) 73 } 74 } 75 76 return nil 77 } 78 79 // MigrateStore performs in-place store migrations from v3 (v0.46) to v4 (v0.47). The 80 // migration includes: 81 // 82 // Params migrations from x/params to gov 83 // Addition of the new min initial deposit ratio parameter that is set to 0 by default. 84 // Proposals in voting period are tracked in a separate index. 85 func MigrateStore(ctx sdk.Context, storeService corestoretypes.KVStoreService, legacySubspace exported.ParamSubspace, cdc codec.BinaryCodec) error { 86 store := runtime.KVStoreAdapter(storeService.OpenKVStore(ctx)) 87 if err := migrateProposalVotingPeriod(ctx, store, cdc); err != nil { 88 return err 89 } 90 91 return migrateParams(ctx, store, legacySubspace, cdc) 92 } 93 94 // AddProposerAddressToProposal will add proposer to proposal and set to the store. This function is optional. 95 func AddProposerAddressToProposal(ctx sdk.Context, storeService corestoretypes.KVStoreService, cdc codec.BinaryCodec, proposals map[uint64]string) error { 96 proposalIDs := make([]uint64, 0, len(proposals)) 97 98 for proposalID := range proposals { 99 proposalIDs = append(proposalIDs, proposalID) 100 } 101 102 // sort the proposalIDs 103 sort.Slice(proposalIDs, func(i, j int) bool { return proposalIDs[i] < proposalIDs[j] }) 104 105 store := runtime.KVStoreAdapter(storeService.OpenKVStore(ctx)) 106 107 for _, proposalID := range proposalIDs { 108 if len(proposals[proposalID]) == 0 { 109 return fmt.Errorf("found missing proposer for proposal ID: %d", proposalID) 110 } 111 112 if _, err := sdk.AccAddressFromBech32(proposals[proposalID]); err != nil { 113 return fmt.Errorf("invalid proposer address : %s", proposals[proposalID]) 114 } 115 116 bz := store.Get(append(types.ProposalsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...)) 117 var proposal govv1.Proposal 118 if err := cdc.Unmarshal(bz, &proposal); err != nil { 119 panic(err) 120 } 121 122 // Check if proposal is active 123 if proposal.Status != govv1.ProposalStatus_PROPOSAL_STATUS_VOTING_PERIOD && 124 proposal.Status != govv1.ProposalStatus_PROPOSAL_STATUS_DEPOSIT_PERIOD { 125 return fmt.Errorf("invalid proposal : %s, proposal not active", proposals[proposalID]) 126 } 127 128 proposal.Proposer = proposals[proposalID] 129 130 // set the new proposal with proposer 131 bz, err := cdc.Marshal(&proposal) 132 if err != nil { 133 panic(err) 134 } 135 store.Set(append(types.ProposalsKeyPrefix, sdk.Uint64ToBigEndian(proposalID)...), bz) 136 } 137 138 return nil 139 }