github.com/Finschia/finschia-sdk@v0.49.1/x/collection/keeper/keys.go (about)

     1  package keeper
     2  
     3  import (
     4  	sdk "github.com/Finschia/finschia-sdk/types"
     5  	"github.com/Finschia/finschia-sdk/x/collection"
     6  )
     7  
     8  var (
     9  	paramsKey = []byte{0x00}
    10  
    11  	contractKeyPrefix    = []byte{0x10}
    12  	classKeyPrefix       = []byte{0x11}
    13  	nextClassIDKeyPrefix = []byte{0x12}
    14  	nextTokenIDKeyPrefix = []byte{0x13}
    15  
    16  	balanceKeyPrefix = []byte{0x20}
    17  	ownerKeyPrefix   = []byte{0x21}
    18  	nftKeyPrefix     = []byte{0x22}
    19  	parentKeyPrefix  = []byte{0x23}
    20  	childKeyPrefix   = []byte{0x24}
    21  
    22  	authorizationKeyPrefix = []byte{0x30}
    23  	grantKeyPrefix         = []byte{0x31}
    24  
    25  	supplyKeyPrefix = []byte{0x40}
    26  	mintedKeyPrefix = []byte{0x41}
    27  	burntKeyPrefix  = []byte{0x42}
    28  
    29  	legacyTokenKeyPrefix     = []byte{0xf0}
    30  	legacyTokenTypeKeyPrefix = []byte{0xf1}
    31  )
    32  
    33  func balanceKey(contractID string, address sdk.AccAddress, tokenID string) []byte {
    34  	prefix := balanceKeyPrefixByAddress(contractID, address)
    35  	key := make([]byte, len(prefix)+len(tokenID))
    36  
    37  	copy(key, prefix)
    38  	copy(key[len(prefix):], tokenID)
    39  
    40  	return key
    41  }
    42  
    43  func balanceKeyPrefixByAddress(contractID string, address sdk.AccAddress) []byte {
    44  	prefix := balanceKeyPrefixByContractID(contractID)
    45  	key := make([]byte, len(prefix)+1+len(address))
    46  
    47  	begin := 0
    48  	copy(key, prefix)
    49  
    50  	begin += len(prefix)
    51  	key[begin] = byte(len(address))
    52  
    53  	begin++
    54  	copy(key[begin:], address)
    55  
    56  	return key
    57  }
    58  
    59  func balanceKeyPrefixByContractID(contractID string) []byte {
    60  	key := make([]byte, len(balanceKeyPrefix)+1+len(contractID))
    61  
    62  	begin := 0
    63  	copy(key, balanceKeyPrefix)
    64  
    65  	begin += len(balanceKeyPrefix)
    66  	key[begin] = byte(len(contractID))
    67  
    68  	begin++
    69  	copy(key[begin:], contractID)
    70  
    71  	return key
    72  }
    73  
    74  func splitBalanceKey(key []byte) (contractID string, address sdk.AccAddress, tokenID string) {
    75  	begin := len(balanceKeyPrefix) + 1
    76  	end := begin + int(key[begin-1])
    77  	contractID = string(key[begin:end])
    78  
    79  	begin = end + 1
    80  	end = begin + int(key[begin-1])
    81  	address = sdk.AccAddress(key[begin:end])
    82  
    83  	begin = end
    84  	tokenID = string(key[begin:])
    85  
    86  	return
    87  }
    88  
    89  // ----------------------------------------------------------------------------
    90  // owner
    91  func ownerKey(contractID, tokenID string) []byte {
    92  	prefix := ownerKeyPrefixByContractID(contractID)
    93  	key := make([]byte, len(prefix)+len(tokenID))
    94  
    95  	copy(key, prefix)
    96  	copy(key[len(prefix):], tokenID)
    97  
    98  	return key
    99  }
   100  
   101  func ownerKeyPrefixByContractID(contractID string) []byte {
   102  	key := make([]byte, len(ownerKeyPrefix)+1+len(contractID))
   103  
   104  	begin := 0
   105  	copy(key, ownerKeyPrefix)
   106  
   107  	begin += len(ownerKeyPrefix)
   108  	key[begin] = byte(len(contractID))
   109  
   110  	begin++
   111  	copy(key[begin:], contractID)
   112  
   113  	return key
   114  }
   115  
   116  // ----------------------------------------------------------------------------
   117  // nft
   118  func nftKey(contractID, tokenID string) []byte {
   119  	prefix := nftKeyPrefixByContractID(contractID)
   120  	key := make([]byte, len(prefix)+len(tokenID))
   121  
   122  	copy(key, prefix)
   123  	copy(key[len(prefix):], tokenID)
   124  
   125  	return key
   126  }
   127  
   128  func nftKeyPrefixByContractID(contractID string) []byte {
   129  	key := make([]byte, len(nftKeyPrefix)+1+len(contractID))
   130  
   131  	begin := 0
   132  	copy(key, nftKeyPrefix)
   133  
   134  	begin += len(nftKeyPrefix)
   135  	key[begin] = byte(len(contractID))
   136  
   137  	begin++
   138  	copy(key[begin:], contractID)
   139  
   140  	return key
   141  }
   142  
   143  func splitNFTKey(key []byte) (contractID, tokenID string) {
   144  	begin := len(nftKeyPrefix) + 1
   145  	end := begin + int(key[begin-1])
   146  	contractID = string(key[begin:end])
   147  
   148  	begin = end
   149  	tokenID = string(key[begin:])
   150  
   151  	return
   152  }
   153  
   154  // ----------------------------------------------------------------------------
   155  // parent
   156  func parentKey(contractID, tokenID string) []byte {
   157  	prefix := parentKeyPrefixByContractID(contractID)
   158  	key := make([]byte, len(prefix)+len(tokenID))
   159  
   160  	copy(key, prefix)
   161  	copy(key[len(prefix):], tokenID)
   162  
   163  	return key
   164  }
   165  
   166  func parentKeyPrefixByContractID(contractID string) []byte {
   167  	key := make([]byte, len(parentKeyPrefix)+1+len(contractID))
   168  
   169  	begin := 0
   170  	copy(key, parentKeyPrefix)
   171  
   172  	begin += len(parentKeyPrefix)
   173  	key[begin] = byte(len(contractID))
   174  
   175  	begin++
   176  	copy(key[begin:], contractID)
   177  
   178  	return key
   179  }
   180  
   181  func splitParentKey(key []byte) (contractID, tokenID string) {
   182  	begin := len(parentKeyPrefix) + 1
   183  	end := begin + int(key[begin-1])
   184  	contractID = string(key[begin:end])
   185  
   186  	begin = end
   187  	tokenID = string(key[begin:])
   188  
   189  	return
   190  }
   191  
   192  // ----------------------------------------------------------------------------
   193  // child
   194  func childKey(contractID, tokenID, childID string) []byte {
   195  	prefix := childKeyPrefixByTokenID(contractID, tokenID)
   196  	key := make([]byte, len(prefix)+len(childID))
   197  
   198  	copy(key, prefix)
   199  	copy(key[len(prefix):], childID)
   200  
   201  	return key
   202  }
   203  
   204  func childKeyPrefixByTokenID(contractID, tokenID string) []byte {
   205  	prefix := childKeyPrefixByContractID(contractID)
   206  	key := make([]byte, len(prefix)+1+len(tokenID))
   207  
   208  	begin := 0
   209  	copy(key, prefix)
   210  
   211  	begin += len(prefix)
   212  	key[begin] = byte(len(tokenID))
   213  
   214  	begin++
   215  	copy(key[begin:], tokenID)
   216  
   217  	return key
   218  }
   219  
   220  func childKeyPrefixByContractID(contractID string) []byte {
   221  	key := make([]byte, len(childKeyPrefix)+1+len(contractID))
   222  
   223  	begin := 0
   224  	copy(key, childKeyPrefix)
   225  
   226  	begin += len(childKeyPrefix)
   227  	key[begin] = byte(len(contractID))
   228  
   229  	begin++
   230  	copy(key[begin:], contractID)
   231  
   232  	return key
   233  }
   234  
   235  func splitChildKey(key []byte) (contractID, tokenID, childID string) {
   236  	begin := len(childKeyPrefix) + 1
   237  	end := begin + int(key[begin-1])
   238  	contractID = string(key[begin:end])
   239  
   240  	begin = end + 1
   241  	end = begin + int(key[begin-1])
   242  	tokenID = string(key[begin:end])
   243  
   244  	begin = end
   245  	childID = string(key[begin:])
   246  
   247  	return
   248  }
   249  
   250  // ----------------------------------------------------------------------------
   251  func contractKey(contractID string) []byte {
   252  	key := make([]byte, len(contractKeyPrefix)+len(contractID))
   253  
   254  	copy(key, contractKeyPrefix)
   255  	copy(key[len(contractKeyPrefix):], contractID)
   256  
   257  	return key
   258  }
   259  
   260  func classKey(contractID, classID string) []byte {
   261  	prefix := classKeyPrefixByContractID(contractID)
   262  	key := make([]byte, len(prefix)+len(classID))
   263  
   264  	copy(key, prefix)
   265  	copy(key[len(prefix):], classID)
   266  
   267  	return key
   268  }
   269  
   270  func classKeyPrefixByContractID(contractID string) []byte {
   271  	key := make([]byte, len(classKeyPrefix)+1+len(contractID))
   272  
   273  	begin := 0
   274  	copy(key, classKeyPrefix)
   275  
   276  	begin += len(classKeyPrefix)
   277  	key[begin] = byte(len(contractID))
   278  
   279  	begin++
   280  	copy(key[begin:], contractID)
   281  
   282  	return key
   283  }
   284  
   285  func nextTokenIDKey(contractID, classID string) []byte {
   286  	prefix := nextTokenIDKeyPrefixByContractID(contractID)
   287  	key := make([]byte, len(prefix)+len(classID))
   288  
   289  	copy(key, prefix)
   290  	copy(key[len(prefix):], classID)
   291  
   292  	return key
   293  }
   294  
   295  func nextTokenIDKeyPrefixByContractID(contractID string) []byte {
   296  	key := make([]byte, len(nextTokenIDKeyPrefix)+1+len(contractID))
   297  
   298  	begin := 0
   299  	copy(key, nextTokenIDKeyPrefix)
   300  
   301  	begin += len(nextTokenIDKeyPrefix)
   302  	key[begin] = byte(len(contractID))
   303  
   304  	begin++
   305  	copy(key[begin:], contractID)
   306  
   307  	return key
   308  }
   309  
   310  func splitNextTokenIDKey(key []byte) (contractID, classID string) {
   311  	begin := len(nextTokenIDKeyPrefix) + 1
   312  	end := begin + int(key[begin-1])
   313  	contractID = string(key[begin:end])
   314  
   315  	begin = end
   316  	classID = string(key[begin:])
   317  
   318  	return
   319  }
   320  
   321  func nextClassIDKey(contractID string) []byte {
   322  	key := make([]byte, len(nextClassIDKeyPrefix)+len(contractID))
   323  
   324  	copy(key, nextClassIDKeyPrefix)
   325  	copy(key[len(nextClassIDKeyPrefix):], contractID)
   326  
   327  	return key
   328  }
   329  
   330  // ----------------------------------------------------------------------------
   331  func authorizationKey(contractID string, operator, holder sdk.AccAddress) []byte {
   332  	prefix := authorizationKeyPrefixByOperator(contractID, operator)
   333  	key := make([]byte, len(prefix)+len(holder))
   334  
   335  	copy(key, prefix)
   336  	copy(key[len(prefix):], holder)
   337  
   338  	return key
   339  }
   340  
   341  func authorizationKeyPrefixByOperator(contractID string, operator sdk.AccAddress) []byte {
   342  	prefix := authorizationKeyPrefixByContractID(contractID)
   343  	key := make([]byte, len(prefix)+1+len(operator))
   344  
   345  	begin := 0
   346  	copy(key, prefix)
   347  
   348  	begin += len(prefix)
   349  	key[begin] = byte(len(operator))
   350  
   351  	begin++
   352  	copy(key[begin:], operator)
   353  
   354  	return key
   355  }
   356  
   357  func authorizationKeyPrefixByContractID(contractID string) []byte {
   358  	key := make([]byte, len(authorizationKeyPrefix)+1+len(contractID))
   359  
   360  	begin := 0
   361  	copy(key, authorizationKeyPrefix)
   362  
   363  	begin += len(authorizationKeyPrefix)
   364  	key[begin] = byte(len(contractID))
   365  
   366  	begin++
   367  	copy(key[begin:], contractID)
   368  
   369  	return key
   370  }
   371  
   372  func splitAuthorizationKey(key []byte) (contractID string, operator, holder sdk.AccAddress) {
   373  	begin := len(authorizationKeyPrefix) + 1
   374  	end := begin + int(key[begin-1])
   375  	contractID = string(key[begin:end])
   376  
   377  	begin = end + 1
   378  	end = begin + int(key[begin-1])
   379  	operator = sdk.AccAddress(key[begin:end])
   380  
   381  	begin = end
   382  	holder = sdk.AccAddress(key[begin:])
   383  
   384  	return
   385  }
   386  
   387  // ----------------------------------------------------------------------------
   388  func grantKey(contractID string, grantee sdk.AccAddress, permission collection.Permission) []byte {
   389  	prefix := grantKeyPrefixByGrantee(contractID, grantee)
   390  	key := make([]byte, len(prefix)+1)
   391  
   392  	copy(key, prefix)
   393  	key[len(prefix)] = byte(permission)
   394  
   395  	return key
   396  }
   397  
   398  func grantKeyPrefixByGrantee(contractID string, grantee sdk.AccAddress) []byte {
   399  	prefix := grantKeyPrefixByContractID(contractID)
   400  	key := make([]byte, len(prefix)+1+len(grantee))
   401  
   402  	begin := 0
   403  	copy(key, prefix)
   404  
   405  	begin += len(prefix)
   406  	key[begin] = byte(len(grantee))
   407  
   408  	begin++
   409  	copy(key[begin:], grantee)
   410  
   411  	return key
   412  }
   413  
   414  func grantKeyPrefixByContractID(contractID string) []byte {
   415  	key := make([]byte, len(grantKeyPrefix)+1+len(contractID))
   416  
   417  	begin := 0
   418  	copy(key, grantKeyPrefix)
   419  
   420  	begin += len(grantKeyPrefix)
   421  	key[begin] = byte(len(contractID))
   422  
   423  	begin++
   424  	copy(key[begin:], contractID)
   425  
   426  	return key
   427  }
   428  
   429  func splitGrantKey(key []byte) (contractID string, grantee sdk.AccAddress, permission collection.Permission) {
   430  	begin := len(grantKeyPrefix) + 1
   431  	end := begin + int(key[begin-1])
   432  	contractID = string(key[begin:end])
   433  
   434  	begin = end + 1
   435  	end = begin + int(key[begin-1])
   436  	grantee = sdk.AccAddress(key[begin:end])
   437  
   438  	begin = end
   439  	permission = collection.Permission(key[begin])
   440  
   441  	return
   442  }
   443  
   444  // ----------------------------------------------------------------------------
   445  // statistics
   446  func statisticKey(keyPrefix []byte, contractID, classID string) []byte {
   447  	prefix := statisticKeyPrefixByContractID(keyPrefix, contractID)
   448  	key := make([]byte, len(prefix)+len(classID))
   449  
   450  	copy(key, prefix)
   451  	copy(key[len(prefix):], classID)
   452  
   453  	return key
   454  }
   455  
   456  func statisticKeyPrefixByContractID(keyPrefix []byte, contractID string) []byte {
   457  	key := make([]byte, len(keyPrefix)+1+len(contractID))
   458  
   459  	begin := 0
   460  	copy(key, keyPrefix)
   461  
   462  	begin += len(keyPrefix)
   463  	key[begin] = byte(len(contractID))
   464  
   465  	begin++
   466  	copy(key[begin:], contractID)
   467  
   468  	return key
   469  }
   470  
   471  func splitStatisticKey(keyPrefix, key []byte) (contractID, classID string) {
   472  	begin := len(keyPrefix) + 1
   473  	end := begin + int(key[begin-1])
   474  	contractID = string(key[begin:end])
   475  
   476  	begin = end
   477  	classID = string(key[begin:])
   478  
   479  	return
   480  }
   481  
   482  // ----------------------------------------------------------------------------
   483  // legacy keys
   484  func legacyTokenKey(contractID, tokenID string) []byte {
   485  	prefix := legacyTokenKeyPrefixByContractID(contractID)
   486  	key := make([]byte, len(prefix)+len(tokenID))
   487  
   488  	copy(key, prefix)
   489  	copy(key[len(prefix):], tokenID)
   490  
   491  	return key
   492  }
   493  
   494  func legacyTokenKeyPrefixByContractID(contractID string) []byte {
   495  	key := make([]byte, len(legacyTokenKeyPrefix)+1+len(contractID))
   496  
   497  	begin := 0
   498  	copy(key, legacyTokenKeyPrefix)
   499  
   500  	begin += len(legacyTokenKeyPrefix)
   501  	key[begin] = byte(len(contractID))
   502  
   503  	begin++
   504  	copy(key[begin:], contractID)
   505  
   506  	return key
   507  }
   508  
   509  func legacyTokenTypeKey(contractID, tokenType string) []byte {
   510  	prefix := legacyTokenTypeKeyPrefixByContractID(contractID)
   511  	key := make([]byte, len(prefix)+len(tokenType))
   512  
   513  	copy(key, prefix)
   514  	copy(key[len(prefix):], tokenType)
   515  
   516  	return key
   517  }
   518  
   519  func legacyTokenTypeKeyPrefixByContractID(contractID string) []byte {
   520  	key := make([]byte, len(legacyTokenTypeKeyPrefix)+1+len(contractID))
   521  
   522  	begin := 0
   523  	copy(key, legacyTokenTypeKeyPrefix)
   524  
   525  	begin += len(legacyTokenTypeKeyPrefix)
   526  	key[begin] = byte(len(contractID))
   527  
   528  	begin++
   529  	copy(key[begin:], contractID)
   530  
   531  	return key
   532  }