v0.4.7-pre.013
This commit is contained in:
@@ -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 à l’orchestration de `kb-pipeline`.
|
||||
|
||||
### Prérequis des opérations Metaplex
|
||||
|
||||
Les builders n’inventent aucun compte ni état préalable. L’appelant doit fournir des comptes cohérents avec l’opé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 d’escrow : 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 l’opé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 l’application.
|
||||
@@ -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 l’exécuteur ne doit pas utiliser un produit cartésien artificiel entre tous les types d’assets et toutes les opérations. Les campagnes doivent sélectionner un parcours cohérent composé d’une fixture, d’un état initial, d’opérations applicables et d’un é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. Lorsqu’elle 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 n’est téléchargé par ce parcours.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user