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

     1  package v2
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/cosmos/cosmos-sdk/internal/conv"
     7  	sdk "github.com/cosmos/cosmos-sdk/types"
     8  	"github.com/cosmos/cosmos-sdk/types/address"
     9  	"github.com/cosmos/cosmos-sdk/types/kv"
    10  )
    11  
    12  // Keys for store prefixes
    13  // Items are stored with the following key: values
    14  //
    15  // - 0x01<grant_Bytes>: Grant
    16  // - 0x02<grant_expiration_Bytes>: GrantQueueItem
    17  var (
    18  	GrantPrefix      = []byte{0x01}
    19  	GrantQueuePrefix = []byte{0x02}
    20  )
    21  
    22  // GrantQueueKey - return grant queue store key
    23  // Key format is
    24  //
    25  // - 0x02<grant_expiration_Bytes>: GrantQueueItem
    26  func GrantQueueKey(expiration time.Time, granter, grantee sdk.AccAddress) []byte {
    27  	exp := sdk.FormatTimeBytes(expiration)
    28  	granter = address.MustLengthPrefix(granter)
    29  	grantee = address.MustLengthPrefix(grantee)
    30  
    31  	l := 1 + len(exp) + len(granter) + len(grantee)
    32  	key := make([]byte, l)
    33  	copy(key, GrantQueuePrefix)
    34  	copy(key[1:], exp)
    35  	copy(key[1+len(exp):], granter)
    36  	copy(key[1+len(exp)+len(granter):], grantee)
    37  	return key
    38  }
    39  
    40  // GrantStoreKey - return authorization store key
    41  // Items are stored with the following key: values
    42  //
    43  // - 0x01<granterAddressLen (1 Byte)><granterAddress_Bytes><granteeAddressLen (1 Byte)><granteeAddress_Bytes><msgType_Bytes>: Grant
    44  func GrantStoreKey(grantee, granter sdk.AccAddress, msgType string) []byte {
    45  	m := conv.UnsafeStrToBytes(msgType)
    46  	granter = address.MustLengthPrefix(granter)
    47  	grantee = address.MustLengthPrefix(grantee)
    48  
    49  	l := 1 + len(grantee) + len(granter) + len(m)
    50  	key := make([]byte, l)
    51  	copy(key, GrantPrefix)
    52  	copy(key[1:], granter)
    53  	copy(key[1+len(granter):], grantee)
    54  	copy(key[l-len(m):], m)
    55  
    56  	return key
    57  }
    58  
    59  // ParseGrantKey - split granter, grantee address and msg type from the authorization key
    60  func ParseGrantKey(key []byte) (granterAddr, granteeAddr sdk.AccAddress, msgType string) {
    61  	// key is of format:
    62  	// <granterAddressLen (1 Byte)><granterAddress_Bytes><granteeAddressLen (1 Byte)><granteeAddress_Bytes><msgType_Bytes>
    63  	kv.AssertKeyAtLeastLength(key, 2)
    64  	granterAddrLen := key[0]
    65  	kv.AssertKeyAtLeastLength(key, int(2+granterAddrLen))
    66  	granterAddr = sdk.AccAddress(key[1 : 1+granterAddrLen])
    67  	granteeAddrLen := int(key[1+granterAddrLen])
    68  	kv.AssertKeyAtLeastLength(key, 3+int(granterAddrLen+byte(granteeAddrLen)))
    69  	granteeAddr = sdk.AccAddress(key[2+granterAddrLen : 2+granterAddrLen+byte(granteeAddrLen)])
    70  
    71  	return granterAddr, granteeAddr, conv.UnsafeBytesToStr(key[2+granterAddrLen+byte(granteeAddrLen):])
    72  }