v0.4.7-pre.013

This commit is contained in:
2026-08-04 17:14:01 +02:00
parent 4d08c75b2b
commit 22228149a3
26 changed files with 2367 additions and 223 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: kb-lib/USAGE.md -->
<!-- version: 7 -->
<!-- version: 8 -->
# Utilisation de kb-lib
@@ -172,6 +172,19 @@ Les opérations courantes utilisent leur wrapper canonique final. Les versions r
Avant utilisation du plan, le consommateur doit transmettre celui-ci au préflight et à lorchestration de `kb-pipeline`.
### Prérequis des opérations Metaplex
Les builders ninventent aucun compte ni état préalable. Lappelant doit fournir des comptes cohérents avec lopération :
- `Create` NFT classique : mint SPL classique existant, owner `Tokenkeg...`, `decimals = 0`, supply initiale nulle, mint authority et freeze authority correspondant à `authority`, PDA metadata et master edition dérivés du mint, `spl_token_program` explicite et `print_supply` renseigné ;
- `Update` : metadata existante, update authority courante et comptes programmables éventuels cohérents avec le token standard ;
- `Verify` / `Unverify` : metadata existante et autorité correspondant exactement au créateur, à la collection ou au delegate visé par `VerificationArgs` ;
- `Delegate` / `Revoke`, `Lock` / `Unlock`, `Transfer` : token account, token record, delegate record, edition et rule set requis par la variante exacte ;
- `Burn`, `CloseAccounts` et opérations descrow : comptes de destination, token records et autorités de fermeture explicitement fournis ;
- `Mint`, `Print`, `Migrate`, `Use`, `Collect` et `Resize` : état préalable spécifique déjà créé et compatible avec la variante demandée.
Une simulation réseau échouée ne constitue pas une validation de lopération. Les logs du programme doivent être conservés et la précondition manquante doit être corrigée avant toute soumission.
## Sécurité
Les types `ExSafetyChecker`, `ExSafetyDecision`, `ExSafetyEvaluation` et `ExSafetyViolation` permettent dévaluer un plan avant son utilisation. Une décision conservatrice doit être respectée par le consommateur ; elle ne doit pas être contournée par lapplication.
@@ -244,3 +257,19 @@ Les tests des exécuteurs comparent les instructions produites aux builders offi
- aucune persistance ni acquisition réseau ;
- aucun chargement dynamique des IDL en production ;
- les squelettes réservés ne sont pas des implémentations ;
## Parcours de validation Metaplex Token Metadata sur Devnet
La validation de lexécuteur ne doit pas utiliser un produit cartésien artificiel entre tous les types dassets et toutes les opérations. Les campagnes doivent sélectionner un parcours cohérent composé dune fixture, dun état initial, dopérations applicables et dun état terminal attendu.
Les familles actuelles sont le NFT classique, le pNFT, le SFT, le fungible et le parcours collection parent/membre. Une collection est une relation et un état supplémentaire, pas un token standard indépendant. Les opérations incompatibles avec une famille doivent être classées `not_applicable`; les opérations valides mais sans fixture doivent être classées `unsupported`.
Pour un NFT classique créé par le runner :
- le mint SPL classique possède `decimals = 0` et `supply = 0` avant `Create` ;
- la mint authority et la freeze authority sont toutes deux le wallet du profil ;
- `spl_token_program` est fourni explicitement ;
- `print_supply` vaut `Zero` ;
- un mint dont le PDA metadata est déjà créé ne peut pas être réutilisé pour un second `Create`.
La matérialisation Metaplex est optionnelle. Lorsquelle est activée après une soumission confirmée, chaque compte déclaré dans les lectures de postcondition est relu, validé, décodé canoniquement puis projeté comme snapshot détat. Aucun contenu URI off-chain nest téléchargé par ce parcours.

View File

@@ -1,9 +1,9 @@
// file: kb-lib/src/decoder/spl/token_2022/state.rs
// version: 2
// version: 3
//! Strict Token-2022 base-state and TLV parsing.
use base64::Engine as _; // rust-rules: trait-import
use base64::Engine; // rust-rules: trait-import
const MINT_BASE_LEN: usize = 82;
const ACCOUNT_BASE_LEN: usize = 165;

View File

@@ -1,5 +1,5 @@
// file: kb-lib/src/executor/metadata/metaplex_token_metadata/builder.rs
// version: 7
// version: 8
//! Official Metaplex builders and conservative plan validation.
@@ -233,12 +233,6 @@ fn validate_intent(intent: &crate::ExMetaplexTokenMetadataExecutionIntent) -> kb
"Metaplex Token Metadata execution requires simulation before signing or sending",
));
}
if !intent.policy.dry_run {
return std::result::Result::Err(kb_core::Error::new(
"execution_metaplex_dry_run_required",
"Metaplex Token Metadata pre.006 intents are simulation-only",
));
}
match intent.policy.cost_limit.max_fee_lamports {
std::option::Option::Some(value) if value > 0 => {},
std::option::Option::Some(_) | std::option::Option::None => {
@@ -1309,21 +1303,17 @@ mod tests {
#[test]
#[allow(deprecated)]
fn policy_requires_dry_run_and_sufficient_limits() {
fn policy_requires_simulation_and_sufficient_limits() {
let mut intent = approved_puff_intent();
intent.policy.dry_run = false;
let dry_run_result = super::validate_intent(&intent);
assert_eq!(
dry_run_result.as_ref().err().map(kb_core::Error::code),
std::option::Option::Some("execution_metaplex_dry_run_required"),
);
intent.policy.dry_run = true;
intent.policy.cost_limit.max_spend_lamports = std::option::Option::Some(9_999);
let spend_result = super::validate_intent(&intent);
assert_eq!(
spend_result.as_ref().err().map(kb_core::Error::code),
std::option::Option::Some("execution_metaplex_spend_limit_insufficient"),
);
intent.policy.cost_limit.max_spend_lamports = std::option::Option::Some(10_000);
intent.policy.dry_run = false;
assert!(super::validate_intent(&intent).is_ok());
}
#[test]