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 }