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 }