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 }