github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/migrations/v5/store.go (about)

     1  package v5
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  
     7  	"cosmossdk.io/log"
     8  	"cosmossdk.io/store/prefix"
     9  	storetypes "cosmossdk.io/store/types"
    10  
    11  	"github.com/cosmos/cosmos-sdk/codec"
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  )
    14  
    15  func migrateDelegationsByValidatorIndex(ctx sdk.Context, store storetypes.KVStore, cdc codec.BinaryCodec) error {
    16  	iterator := storetypes.KVStorePrefixIterator(store, DelegationKey)
    17  
    18  	for ; iterator.Valid(); iterator.Next() {
    19  		key := iterator.Key()
    20  		del, val, err := ParseDelegationKey(key)
    21  		if err != nil {
    22  			return err
    23  		}
    24  
    25  		store.Set(GetDelegationsByValKey(val, del), []byte{})
    26  	}
    27  
    28  	return nil
    29  }
    30  
    31  // MigrateStore performs in-place store migrations from v4 to v5.
    32  func MigrateStore(ctx sdk.Context, store storetypes.KVStore, cdc codec.BinaryCodec) error {
    33  	if err := migrateDelegationsByValidatorIndex(ctx, store, cdc); err != nil {
    34  		return err
    35  	}
    36  	return migrateHistoricalInfoKeys(store, ctx.Logger())
    37  }
    38  
    39  // migrateHistoricalInfoKeys migrate HistoricalInfo keys to binary format
    40  func migrateHistoricalInfoKeys(store storetypes.KVStore, logger log.Logger) error {
    41  	// old key is of format:
    42  	// prefix (0x50) || heightBytes (string representation of height in 10 base)
    43  	// new key is of format:
    44  	// prefix (0x50) || heightBytes (byte array representation using big-endian byte order)
    45  	oldStore := prefix.NewStore(store, HistoricalInfoKey)
    46  
    47  	oldStoreIter := oldStore.Iterator(nil, nil)
    48  	defer sdk.LogDeferred(logger, func() error { return oldStoreIter.Close() })
    49  
    50  	for ; oldStoreIter.Valid(); oldStoreIter.Next() {
    51  		strHeight := oldStoreIter.Key()
    52  
    53  		intHeight, err := strconv.ParseInt(string(strHeight), 10, 64)
    54  		if err != nil {
    55  			return fmt.Errorf("can't parse height from key %q to int64: %v", strHeight, err)
    56  		}
    57  
    58  		newStoreKey := GetHistoricalInfoKey(intHeight)
    59  
    60  		// Set new key on store. Values don't change.
    61  		store.Set(newStoreKey, oldStoreIter.Value())
    62  		oldStore.Delete(oldStoreIter.Key())
    63  	}
    64  
    65  	return nil
    66  }