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  }