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

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