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

     1  package v5
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  	"github.com/cosmos/cosmos-sdk/types/address"
    10  )
    11  
    12  const (
    13  	// ModuleName is the name of the module
    14  	ModuleName = "staking"
    15  )
    16  
    17  var (
    18  	DelegationKey           = []byte{0x31} // key for a delegation
    19  	HistoricalInfoKey       = []byte{0x50} // prefix for the historical info
    20  	DelegationByValIndexKey = []byte{0x71} // key for delegations by a validator
    21  )
    22  
    23  // ParseDelegationKey parses given key and returns delagator, validator address bytes
    24  func ParseDelegationKey(bz []byte) (sdk.AccAddress, sdk.ValAddress, error) {
    25  	prefixLength := len(DelegationKey)
    26  	if prefix := bz[:prefixLength]; !bytes.Equal(prefix, DelegationKey) {
    27  		return nil, nil, fmt.Errorf("invalid prefix; expected: %X, got: %x", DelegationKey, prefix)
    28  	}
    29  
    30  	bz = bz[prefixLength:] // remove the prefix byte
    31  	if len(bz) == 0 {
    32  		return nil, nil, fmt.Errorf("no bytes left to parse: %X", bz)
    33  	}
    34  
    35  	delAddrLen := bz[0]
    36  	bz = bz[1:] // remove the length byte of delegator address.
    37  	if len(bz) == 0 {
    38  		return nil, nil, fmt.Errorf("no bytes left to parse delegator address: %X", bz)
    39  	}
    40  
    41  	del := bz[:int(delAddrLen)]
    42  	bz = bz[int(delAddrLen):] // remove the length byte of a delegator address
    43  	if len(bz) == 0 {
    44  		return nil, nil, fmt.Errorf("no bytes left to parse delegator address: %X", bz)
    45  	}
    46  
    47  	bz = bz[1:] // remove the validator address bytes.
    48  	if len(bz) == 0 {
    49  		return nil, nil, fmt.Errorf("no bytes left to parse validator address: %X", bz)
    50  	}
    51  
    52  	val := bz
    53  
    54  	return del, val, nil
    55  }
    56  
    57  // GetHistoricalInfoKey returns a key prefix for indexing HistoricalInfo objects.
    58  func GetHistoricalInfoKey(height int64) []byte {
    59  	heightBytes := make([]byte, 8)
    60  	binary.BigEndian.PutUint64(heightBytes, uint64(height))
    61  	return append(HistoricalInfoKey, heightBytes...)
    62  }
    63  
    64  // GetDelegationsByValPrefixKey builds a prefix key bytes with the given validator address bytes.
    65  func GetDelegationsByValPrefixKey(valAddr sdk.ValAddress) []byte {
    66  	return append(DelegationByValIndexKey, address.MustLengthPrefix(valAddr)...)
    67  }
    68  
    69  // GetDelegationsByValKey creates the key for delegations by validator address
    70  // VALUE: staking/Delegation
    71  func GetDelegationsByValKey(valAddr sdk.ValAddress, delAddr sdk.AccAddress) []byte {
    72  	return append(GetDelegationsByValPrefixKey(valAddr), delAddr...)
    73  }