v0.4.8-pre.004

This commit is contained in:
2026-08-05 17:46:56 +02:00
parent de1062b2d3
commit 4c13d7ac54
15 changed files with 1505 additions and 128 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: kb-lib/USAGE.md -->
<!-- version: 9 -->
<!-- version: 10 -->
# Utilisation de kb-lib
@@ -82,7 +82,7 @@ println!("parsed registry state: {registry:#?}");
Les parseurs vérifient les bornes et formats quils annoncent. Ils ne reconstruisent pas un état historique depuis un RPC courant.
## Modèles Solana Program Metadata
## Modèles et comptes Solana Program Metadata
Les modèles `DcMetadataSpm*` représentent uniquement le contrat on-chain du programme `ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S`. Ils ne téléchargent jamais les URL et ne lisent pas automatiquement les comptes référencés par `External`.
@@ -108,7 +108,37 @@ assert_eq!(wire_bytes.len(), kb_lib::DC_METADATA_SPM_EXTERNAL_DATA_BYTES);
Le champ `length` externe suit le contrat zeroable : la valeur wire `0` devient `None` et signifie que la référence porte sur tout le compte à partir de `offset`. Les contenus `Direct` et `Url` doivent être non vides, et toute longueur doit rester représentable par le `u32` du header.
Le décodeur de protocole `DcMetadataSolanaProgramMetadataDecoder` est encore réservé. Les modèles servent déjà de contrat public stable aux futurs décodeurs de comptes, décodeurs dinstructions, matérialisateurs et builders.
Les trois fonctions publiques de comptes vérifient le propriétaire `ProgM6…`, la borne maximale de données et les layouts fixes :
- `decoder_metadata_solana_program_metadata_decode_account` sélectionne `Buffer` ou `Metadata` depuis le discriminateur ;
- `decoder_metadata_solana_program_metadata_decode_buffer_account` conserve tous les octets alloués après le header, sans prétendre quun Buffer garde un PDA vérifiable après une modification dautorité ;
- `decoder_metadata_solana_program_metadata_decode_metadata_account` valide le PDA canonical ou non-canonical, `data_length`, les enums fermées et les contraintes propres à `Direct`, `Url` et `External`.
```rust
let snapshot = match kb_lib::decoder_metadata_solana_program_metadata_decode_account(
metadata_account.as_str(),
account_owner.as_str(),
&account_data,
) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error.to_string()),
};
match snapshot {
kb_lib::DcMetadataSpmAccountSnapshot::Buffer(value) => {
println!("buffer bytes={}", value.allocated_data_bytes);
},
kb_lib::DcMetadataSpmAccountSnapshot::Metadata(value) => {
println!("metadata program={}", value.program);
println!("logical bytes={}", value.data_length);
println!("reserved capacity={}", value.trailing_capacity_bytes);
},
}
```
Une URL est seulement décodée comme chaîne UTF-8 on-chain. Aucune requête HTTP, IPFS ou Arweave nest effectuée. Une référence `External` est seulement décodée en adresse, offset et longueur zeroable ; le compte référencé nest pas lu.
Le décodeur de protocole `DcMetadataSolanaProgramMetadataDecoder` reste réservé aux instructions. Les comptes constituent désormais un contrat public stable pour les futurs matérialisateurs, builders et parcours stateful.
## Comptes Metaplex Token Metadata