This commit is contained in:
2026-07-23 16:37:12 +02:00
parent 99c345f2f2
commit 0da75c1311
2159 changed files with 230833 additions and 0 deletions

View File

@@ -0,0 +1,178 @@
<!-- file: kb_decoder_metadata_metaplex_token_metadata/README.md -->
<!-- version: 31 -->
# `kb_decoder_metadata_metaplex_token_metadata`
Décodeur contextualisé dédié au programme Metaplex Token Metadata.
La crate suit la frontière commune des décodeurs opérationnels du workspace :
- `constants.rs` contient la surface, les discriminateurs, les bornes et la cible de tracing ;
- `decoder.rs` implémente `ProtocolDecoder` et `InstructionDecoder` ;
- `instruction.rs` contient le décodage Borsh borné, la résolution des comptes et les observations ;
- `lib.rs` réexporte le décodeur dinstructions et les types publics du parseur de comptes ;
- le Program ID provient exclusivement de `kb_program_ids`.
`0.4.7-pre.002` active le décodage exact de `CreateMetadataAccountV3` et `UpdateMetadataAccountV2`. `0.4.7-pre.003` ajoute `VerifyCollection`, `UnverifyCollection` et `SetAndVerifyCollection`. `0.4.7-pre.004` ajoute le groupe sized `VerifySizedCollectionItem`, `UnverifySizedCollectionItem` et `SetAndVerifySizedCollectionItem`, avec la metadata de collection writable et le `collection_authority_record` optionnel. `0.4.7-pre.005` ajoute ladministration historique/courante des autorités de collection avec `ApproveCollectionAuthority` et `RevokeCollectionAuthority`, y compris le record PDA, les autorités distinctes et les comptes système/rent optionnels. `0.4.7-pre.006` ajoute les usages et autorités dusage avec `ApproveUseAuthority`, `RevokeUseAuthority` et `Utilize`, leurs compteurs `u64`, le `use_authority_record`, le burner, les comptes Token/ATA et les comptes système/rent. `0.4.7-pre.007` ajoute `SignMetadata` et `UpdatePrimarySaleHappenedViaToken`, avec creator/owner signataires, metadata writable et token account readonly. Les layouts proviennent de `mpl-token-metadata 5.1.1`. Le décodeur préserve outer/CPI, statut de transaction, comptes ordonnés, paramètres Borsh, provenance et hash du wire. Il refuse les payloads tronqués, suffixes, comptes invalides et discriminateurs inconnus.
Depuis `pre.025`, la crate traite le premier compte on-chain `MetadataV1`. Elle ne traite pas encore les autres comptes Metaplex Token Metadata, les metadata Token-2022 incorporées, Metaplex Core, Bubblegum ou les contenus JSON distants.
## Groupe `0.4.7-pre.009`
- `PuffMetadata` (`14`) : normalisation/padding de la metadata externe.
- `RemoveCreatorVerification` (`28`) : retrait explicite de la vérification dun creator.
- `SetTokenStandard` (`35`) : classification du standard de token, avec edition optionnelle.
Le décodage conserve les comptes ordonnés, les flags signer/writable officiels, outer/CPI, les échecs non committés et le rejet des suffixes.
## 0.4.7-pre.009 — création metadata historique V2
- `CreateMetadataAccountV2` (discriminant `16`) est décodé comme surface historique.
- Le wire conserve `DataV2` et `is_mutable` avec les mêmes bornes que V3.
- Le contrat de comptes reprend metadata, mint, mint authority, payer, update authority, System Program et rent optionnel.
- Cette instruction est décodable et matérialisable ultérieurement, mais restera non exécutable.
## 0.4.7-pre.010
Ajout du décodage historique non exécutable de `CreateMetadataAccount` (0) et `UpdateMetadataAccount` (1), avec layouts `Data` V1 bornés et comptes exacts.
## 0.4.7-pre.011
Ajout de `CreateMasterEditionV3` (17) et `ConvertMasterEditionV1ToV2` (12). Le premier conserve `max_supply: Option<u64>` et les autorités/payer/programmes exacts ; le second est classé historique et conserve les trois comptes writable de conversion. Le mint déditions imprimées et les edition markers restent planifiés pour la tranche suivante.
## 0.4.7-pre.012
Ajout de `MintNewEditionFromMasterEditionViaToken` (11) et de la variante historique `MintNewEditionFromMasterEditionViaVaultProxy` (13). Les deux wires conservent lédition `u64`, le master edition, le nouvel edition account et ledition marker. La variante Token conserve le propriétaire et le token account du master ; la variante Vault conserve lautorité, le safety deposit et le Token Vault Program. La variante Vault reste définitivement non exécutable.
## 0.4.7-pre.013
Ajout de `SetCollectionSize` (34) et `BubblegumSetCollectionSize` (36). Les deux wires conservent `size: u64`. La variante directe exige une collection authority writable/signataire ; la variante Bubblegum exige une collection authority readonly/signataire et le `bubblegum_signer` readonly/signataire. Le record dautorité de collection reste optionnel. Le bridge Bubblegum est décodé avec provenance Metaplex Token Metadata mais reste distinct de la future couverture complète Bubblegum de `0.4.9`.
## 0.4.7-pre.014 — Delegate / Revoke programmables
- `Delegate` (44) et `Revoke` (45) décodés avec leurs enums Borsh exactes.
- Contrat positionnel de 14 comptes conservé, y compris les placeholders Metaplex des comptes optionnels.
- `AuthorizationData` est projeté lorsquil est présent ; validation sémantique différée au preflight stateful.
## 0.4.7-pre.015 — lifecycle programmable
Ajout de `Transfer` (49), `Lock` (46), `Unlock` (47), `Burn` (41) et `CloseAccounts` (57). Les enums Borsh modernes, comptes positionnels, placeholders optionnels, montants `u64`, outer/CPI et transactions échouées non committées sont conservés. La validation stateful des TokenRecord, rule sets, owners et PDA reste différée.
## `0.4.7-pre.016` — audit exhaustif et freeze/thaw historiques
- inventaire officiel recalé sur `clients/rust/src/generated/instructions/mod.rs` ;
- ajout de `FreezeDelegatedAccount` (`26`) et `ThawDelegatedAccount` (`27`) ;
- contrat exact de cinq comptes : delegate writable/signataire, token account writable, edition, mint et Token Program readonly ;
- ces deux surfaces restent historiques, decode-only et non exécutables ;
- les wrappers modernes et les opérations escrow/collect/resize/migrate encore absents restent explicitement planifiés avant le décodage des comptes.
## `0.4.7-pre.017` — burns NFT historiques et printing token
- `BurnNft` (`29`) conserve metadata, owner signataire, mint, token account, master edition, Token Program et collection metadata optionnelle.
- `BurnEditionNft` (`37`) conserve le print mint, le master mint, leurs token accounts, les comptes edition/master edition et ledition marker.
- `DeprecatedMintNewEditionFromMasterEditionViaPrintingToken` (`3`) conserve les quinze comptes obligatoires et la reservation list optionnelle.
- Ces trois surfaces sont historiques, decode-only et définitivement non exécutables.
## `0.4.7-pre.018` — escrow et collecte
- `CreateEscrowAccount` (`38`) et `CloseEscrowAccount` (`39`) conservent escrow, metadata, mint, token account, edition, payer et comptes système/sysvar exacts.
- `TransferOutOfEscrow` (`40`) conserve `amount: u64`, les comptes source/destination de lattribut, le mint et le token account liés à lescrow, ainsi que lautorité optionnelle.
- `Collect` (`54`) conserve lautorité signataire et le destinataire readonly.
- Les quatre surfaces préservent outer/CPI et les transactions échouées non committées ; les owners, PDA et états escrow restent à valider lors du décodage stateful.
## `0.4.7-pre.019` — wrapper moderne Create
- `Create` (`42`) décode `CreateArgs::V1`, y compris metadata textuelle, royalties, creators, collection, uses, token standard, rule set, decimals et print supply.
- Le contrat de neuf positions conserve metadata, master edition optionnelle, mint signataire/writable, authority, payer, update authority, programmes système/sysvar et SPL Token Program optionnel.
- Les wrappers modernes `Create`, `Mint`, `Print`, `Update`, `Use`, `Verify`, `Unverify`, `Resize` et `Migrate` sont désormais décodés ; leurs validations owner/PDA restent stateful.
## 0.4.7-pre.020
Cette préversion ajoute le wrapper moderne `Mint` (`43`). Le décodeur conserve `MintArgs::V1`, le montant brut `u64`, `AuthorizationData` optionnelle et les quinze positions officielles, y compris les placeholders Metaplex utilisés pour les comptes optionnels absents. Lactivation runtime, la validation stateful des PDA/rule sets et lexécution restent différées.
## `0.4.7-pre.021` — wrapper moderne Print
- `Print` (`55`) décode les variantes `PrintArgs::V1` et `PrintArgs::V2`, chacune conservant le numéro dédition `u64`.
- Le contrat de dix-huit positions conserve les comptes edition metadata, edition, edition mint, token account, Token Record optionnel, master edition, edition marker, payer, propriétaire du master token account et programmes Token/ATA/System/Sysvar.
- `PrintV1` et `PrintV2` sont des builders spécialisés du même discriminant `55` et non deux discriminateurs supplémentaires.
- Les PDA edition/edition marker et les owners restent à valider lors du décodage stateful des comptes.
## Update moderne
Le discriminant `50` décode `UpdateArgs` et toutes ses variantes publiées : `V1`, `AsUpdateAuthorityV2`, `AsAuthorityItemDelegateV2`, `AsCollectionDelegateV2`, `AsDataDelegateV2`, `AsProgrammableConfigDelegateV2`, `AsDataItemDelegateV2`, `AsCollectionItemDelegateV2` et `AsProgrammableConfigItemDelegateV2`. Le contrat conserve onze positions, avec placeholders Metaplex readonly pour les comptes optionnels absents. La validation sémantique des PDA, delegates, owners et rule sets reste stateful.
## Wrapper Use et vérifications modernes
`Use` (`51`) décode `UseArgs::V1` et ses douze positions. `Verify` (`52`) et `Unverify` (`53`) décodent `VerificationArgs::{CreatorV1,CollectionV1}` avec huit positions et placeholders optionnels explicites. Les validations owner/PDA restent stateful.
## `0.4.7-pre.024` — inventaire dinstructions exhaustif
`Resize` (`56`) et `Migrate` (`48`) sont décodés avec leurs contrats positionnels exacts. Laudit de lIDL `1.14.0` a également identifié puis couvert les six discriminateurs historiques manquants `2`, `5`, `6`, `8`, `9` et `10`. Le registre contient désormais les 58 discriminateurs `0..=57` sans trou. Ces six surfaces historiques restent decode-only et non exécutables.
## `0.4.7-pre.025` — premier compte on-chain
La crate expose désormais `decode_metadata_account` pour le layout officiel `Metadata`. Le parseur refuse un owner étranger avant désérialisation, exige `Key::MetadataV1`, borne les données et les champs textuels, limite les creators, valide le PDA canonique `[metadata, program_id, mint]` et conserve le bump. Cette tranche ne couvre pas encore MasterEdition, Edition, EditionMarker, TokenRecord ni les records de délégation.
## `0.4.7-pre.026` — comptes edition et master edition
La crate expose `decode_edition_account` pour `DeprecatedMasterEditionV1`, `MasterEditionV2` et `EditionV1`. Le décodeur vérifie lowner avant parsing, exige le PDA commun `[metadata, program_id, mint, edition]`, conserve le bump et projette supply/max supply, printing mints historiques, parent et numéro dédition. `MasterEditionV1` reste historique et decode-only ; `MasterEditionV2` et `EditionV1` alimenteront les futures projections stateful.
## `0.4.7-pre.027` — Edition Marker V1/V2
- `EditionMarker` conserve un ledger fixe de 31 octets, soit 248 éditions par groupe.
- Le groupe V1 est `edition / 248` et le PDA utilise les seeds `[metadata, program_id, mint, edition, groupe_decimal]`.
- `EditionMarkerV2` conserve un `Vec<u8>` extensible et utilise un PDA unique `[metadata, program_id, mint, edition, marker]`.
- Le décodeur projette l'index d'octet, le masque big-endian et l'état `edition_taken` pour l'édition demandée.
- V1 exige exactement 32 octets ; V2 exige une longueur Borsh exacte et borne le ledger à 1 048 576 octets.
- Owner étranger, mauvais PDA, discriminant inconnu, troncature et suffixe sont refusés avant toute projection stateful.
## `0.4.7-pre.028` — Token Record programmable
- `TokenRecord` exige le layout alloué exact de 80 octets et `Key::TokenRecord`.
- Le PDA est dérivé par `[metadata, program_id, mint, token_record, token_account]` et le bump stocké doit être identique au bump canonique.
- La projection conserve `TokenState::{Unlocked,Locked,Listed}`, la révision optionnelle du rule set, le delegate, son rôle et la destination optionnelle de locked transfer.
- Les rôles officiels `Sale`, `Transfer`, `Utility`, `Staking`, `Standard`, `LockedTransfer` et `Migration` sont conservés sans normalisation destructive.
- Owner étranger, mauvais PDA, bump incohérent, mauvais discriminant, troncature et suffixe sont refusés.
## `0.4.7-pre.029` — records de délégation et dautorité
- `MetadataDelegateRecord` et `HolderDelegateRecord` exigent exactement 98 octets, leur discriminant `Key`, leur bump stocké et leur PDA canonique.
- Les huit seeds de rôles Metadata sont conservées sans regroupement : `authority_item_delegate`, `collection_delegate`, `use_delegate`, `data_delegate`, `programmable_config_delegate`, `data_item_delegate`, `collection_item_delegate` et `prog_config_item_delegate`.
- `HolderDelegateRecord` conserve le rôle `print_delegate`, le holder utilisé comme seed, le delegate et lupdate authority stockée.
- `CollectionAuthorityRecord` valide `[metadata, program_id, mint, collection_authority, authority]` et conserve lupdate authority optionnelle.
- `UseAuthorityRecord` valide `[metadata, program_id, mint, user, authority]`, exige exactement 10 octets et conserve `allowed_uses: u64`.
- Owner étranger, longueur incorrecte, discriminant erroné, PDA ou bump incohérents sont refusés avant projection.
## `0.4.7-pre.030` — Token Owned Escrow stateful
- `TokenOwnedEscrow` conserve le base token mint, lautorité `TokenOwner` ou `Creator(Pubkey)` et le bump stocké.
- Le PDA `TokenOwner` utilise `[metadata, program_id, base_token, 0, escrow]`.
- Le PDA `Creator` utilise `[metadata, program_id, base_token, 1, creator, escrow]`.
- Les longueurs Borsh exactes sont 35 octets pour `TokenOwner` et 67 octets pour `Creator`.
- Owner étranger, discriminant, longueur, PDA ou bump incohérents sont refusés.
- Les effets de `CreateEscrowAccount`, `CloseEscrowAccount`, `TransferOutOfEscrow`, `Migrate` et `Resize` sont décrits dans la matrice pour la future corrélation stateful ; ils ne sont pas encore matérialisés.
## `0.4.7-pre.031` — Reservation Lists historiques
- `ReservationListV1` conserve le Master Edition, le supply snapshot optionnel et jusquà 200 entrées avec compteurs `u8`.
- `ReservationListV2` conserve les mêmes identités, des compteurs `u64` et les caches `total_reservation_spots`/`current_reservation_spots`.
- Le PDA exige le contexte `resource` et suit `[metadata, program_id, master_edition, reservation, resource]`.
- Les tailles maximales historiques sont 6 949 octets pour V1 et 9 749 octets pour V2 ; seuls les suffixes de padding nuls sont tolérés.
- Ces comptes sont historiques et ne seront jamais exposés par lexécuteur. Ils restent toutefois matérialisables comme état historique lors des backfills et replays, avec provenance explicite et sans écraser létat actif.
## `0.4.7-pre.032` — audit exhaustif des comptes
- Les quinze variantes `Key` publiées, de `Uninitialized` (`0`) à `HolderDelegate` (`14`), sont inventoriées dans le code et la matrice.
- Les quatorze variantes représentant un compte réel sont reliées à un décodeur borné ; `Uninitialized` est une sentinelle explicitement rejetée.
- Les layouts historiques restent `decode-only`, `EditionMarkerV2` reste classé actif/expérimental, et les comptes actifs restent éligibles aux futures matérialisations.
- Un test compare lordre et les discriminateurs Borsh du SDK épinglé à linventaire interne et à `docs/METAPLEX_TOKEN_METADATA_MATRIX.json`.
- Toute variante future absente de linventaire doit faire échouer laudit avant toute activation runtime.
## `0.4.7-pre.033` — modèle canonique et provenance
- Chaque snapshot de compte est enveloppé dans une identité stable `program_id:account_address`, un nom de layout, son discriminant `Key` exact et une version canonique interne.
- Les layouts sont classés `Active`, `ActiveExperimental` ou `Historical` sans confondre cette classification avec leur politique dexécution.
- Les états actifs et expérimentaux sont matérialisables comme état courant ; les états historiques sont matérialisables comme état historique lors dun backfill ou replay.
- Les layouts historiques restent définitivement non exécutables, même lorsquils sont matérialisés.
- La provenance conserve source, slot, write version, signature, index outer/inner et statut committed lorsque ces données sont disponibles.
- Les sources `Live`, `Replay`, `Backfill`, `Repair` et `Synthetic` restent distinctes afin déviter toute fusion silencieuse des observations.