github.com/Finschia/finschia-sdk@v0.48.1/x/staking/legacy/v043/store.go (about)

     1  package v043
     2  
     3  import (
     4  	"github.com/Finschia/finschia-sdk/store/prefix"
     5  	sdk "github.com/Finschia/finschia-sdk/types"
     6  	"github.com/Finschia/finschia-sdk/types/address"
     7  	v040auth "github.com/Finschia/finschia-sdk/x/auth/legacy/v040"
     8  	v043distribution "github.com/Finschia/finschia-sdk/x/distribution/legacy/v043"
     9  	v040staking "github.com/Finschia/finschia-sdk/x/staking/legacy/v040"
    10  	"github.com/Finschia/finschia-sdk/x/staking/types"
    11  )
    12  
    13  // migratePrefixAddressAddressAddress is a helper function that migrates all keys of format:
    14  // prefix_bytes | address_1_bytes | address_2_bytes | address_3_bytes
    15  // into format:
    16  // prefix_bytes | address_1_len (1 byte) | address_1_bytes | address_2_len (1 byte) | address_2_bytes | address_3_len (1 byte) | address_3_bytes
    17  func migratePrefixAddressAddressAddress(store sdk.KVStore, prefixBz []byte) {
    18  	oldStore := prefix.NewStore(store, prefixBz)
    19  
    20  	oldStoreIter := oldStore.Iterator(nil, nil)
    21  	defer oldStoreIter.Close()
    22  
    23  	for ; oldStoreIter.Valid(); oldStoreIter.Next() {
    24  		addr1 := oldStoreIter.Key()[:v040auth.AddrLen]
    25  		addr2 := oldStoreIter.Key()[v040auth.AddrLen : 2*v040auth.AddrLen]
    26  		addr3 := oldStoreIter.Key()[2*v040auth.AddrLen:]
    27  		newStoreKey := append(append(append(
    28  			prefixBz,
    29  			address.MustLengthPrefix(addr1)...), address.MustLengthPrefix(addr2)...), address.MustLengthPrefix(addr3)...,
    30  		)
    31  
    32  		// Set new key on store. Values don't change.
    33  		store.Set(newStoreKey, oldStoreIter.Value())
    34  		oldStore.Delete(oldStoreIter.Key())
    35  	}
    36  }
    37  
    38  const powerBytesLen = 8
    39  
    40  func migrateValidatorsByPowerIndexKey(store sdk.KVStore) {
    41  	oldStore := prefix.NewStore(store, v040staking.ValidatorsByPowerIndexKey)
    42  
    43  	oldStoreIter := oldStore.Iterator(nil, nil)
    44  	defer oldStoreIter.Close()
    45  
    46  	for ; oldStoreIter.Valid(); oldStoreIter.Next() {
    47  		powerBytes := oldStoreIter.Key()[:powerBytesLen]
    48  		valAddr := oldStoreIter.Key()[powerBytesLen:]
    49  		newStoreKey := append(append(types.ValidatorsByPowerIndexKey, powerBytes...), address.MustLengthPrefix(valAddr)...)
    50  
    51  		// Set new key on store. Values don't change.
    52  		store.Set(newStoreKey, oldStoreIter.Value())
    53  		oldStore.Delete(oldStoreIter.Key())
    54  	}
    55  }
    56  
    57  // MigrateStore performs in-place store migrations from v0.40 to v0.43. The
    58  // migration includes:
    59  //
    60  // - Setting the Power Reduction param in the paramstore
    61  func MigrateStore(ctx sdk.Context, storeKey sdk.StoreKey) error {
    62  	store := ctx.KVStore(storeKey)
    63  
    64  	v043distribution.MigratePrefixAddress(store, v040staking.LastValidatorPowerKey)
    65  
    66  	v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsKey)
    67  	v043distribution.MigratePrefixAddress(store, v040staking.ValidatorsByConsAddrKey)
    68  	migrateValidatorsByPowerIndexKey(store)
    69  
    70  	v043distribution.MigratePrefixAddressAddress(store, v040staking.DelegationKey)
    71  	v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationKey)
    72  	v043distribution.MigratePrefixAddressAddress(store, v040staking.UnbondingDelegationByValIndexKey)
    73  	migratePrefixAddressAddressAddress(store, v040staking.RedelegationKey)
    74  	migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValSrcIndexKey)
    75  	migratePrefixAddressAddressAddress(store, v040staking.RedelegationByValDstIndexKey)
    76  
    77  	return nil
    78  }