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(&params)
    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  }