Files
khadhroony-bot3/kb-lib/USAGE.md
2026-08-04 17:14:01 +02:00

12 KiB
Raw Blame History

Utilisation de kb-lib

Objectif

Ce guide présente les familles dAPI publiques significatives de kb-lib. Les helpers privés, éléments pub(crate) et modules non réexportés ne font pas partie du contrat consommateur.

Dépendance

[dependencies]
kb-lib = { path = "../kb-lib" }

Toutes les fonctions retournant kb_core::Result<T> utilisent le contrat derreur structuré du workspace.

Décodage contextualisé

DcApiInstructionDecoder définit la reconnaissance et le décodage dune instruction contextualisée. Les décodeurs concrets sont des valeurs sans état.

use kb_lib::{DcApiInstructionDecoder, DcSolanaCoreDecoder};

let decoder = DcSolanaCoreDecoder;
let recognition = DcApiInstructionDecoder::recognize(&decoder, &input);
let result = DcApiInstructionDecoder::decode(&decoder, &input);

Le consommateur doit vérifier le résultat typé et ses diagnostics. Une transaction échouée peut produire une intention structurée, mais pas une mutation committée.

let execution = DcApiInstructionDecoder::decode(&decoder, &input);

match execution {
    Ok(result) => {
        println!("status={:?}", result.status);
        println!("observations={}", result.observations.len());
        println!("diagnostics={}", result.diagnostics.len());
    },
    Err(error) => return Err(error),
}

Décodeurs fonctionnels principaux :

  • DcSolanaCoreDecoder ;
  • DcSplMemoDecoder ;
  • DcSplTokenDecoder ;
  • DcSplAssociatedTokenAccountDecoder ;
  • DcSplToken2022Decoder ;
  • DcSplElgamalRegistryDecoder ;
  • DcMetadataMetaplexTokenMetadataDecoder.

Les types réservés Dc*Decoder ne doivent pas être interprétés comme des décodeurs complets : ils publient une compatibilité conservatrice et aucune observation fonctionnelle.

Lecture détats Token-2022 et ElGamal

let state = match kb_lib::decoder_spl_token_2022_parse_token_2022_state(
    kb_lib::DcToken2022StateKind::Account,
    &account_data,
) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

println!("parsed token-2022 state: {state:#?}");
let registry = match kb_lib::decoder_spl_elgamal_registry_parse_elgamal_registry_state(
    &account_data,
) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

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.

Comptes Metaplex Token Metadata

Les fonctions decoder_metadata_metaplex_token_metadata_decode_*_account décodent les familles de comptes publiques prises en charge. Le consommateur doit fournir les données et le contexte attendus par la signature exacte de la fonction concernée. Les parseurs conservent les variantes historiques et refusent les longueurs, propriétaires ou suffixes incompatibles.

let metadata = match kb_lib::decoder_metadata_metaplex_token_metadata_decode_metadata_account(
    metadata_account.as_str(),
    metadata_owner.as_str(),
    &account_data,
) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

println!("metadata mint={}", metadata.mint);
println!("metadata name={}", metadata.name);
let edition = match kb_lib::decoder_metadata_metaplex_token_metadata_decode_edition_account(
    edition_account.as_str(),
    metadata_owner.as_str(),
    mint.as_str(),
    &account_data,
) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

println!("edition kind={:?}", edition.kind);
println!("edition parent={:?}", edition.parent);

Les signatures exactes doivent être vérifiées lors de lutilisation : certaines familles exigent un contexte ou une identité canonique supplémentaire.

Exécution typée

ExApiTypedInstructionExecutor produit un ExApiPreparedExecutionPlan à partir dune intention et dune politique explicites. Les exécuteurs concrets incluent notamment :

  • ExSolanaCoreExecutor ;
  • ExSplMemoExecutor pour Memo v4 ;
  • ExSplTokenExecutor ;
  • ExSplAssociatedTokenAccountExecutor ;
  • ExSplToken2022Executor ;
  • ExSplElgamalRegistryExecutor.
use kb_lib::{ExApiTypedInstructionExecutor, ExSplMemoExecutor};

let executor = ExSplMemoExecutor;
let plan = ExApiTypedInstructionExecutor::build_prepared_plan(
    &executor,
    &intent,
    &policy,
);

Le plan ne signe et nenvoie rien. La simulation, la confirmation opérateur, la soumission et la confirmation réseau appartiennent aux couches dorchestration et de transport.

let plan = match ExApiTypedInstructionExecutor::build_prepared_plan(
    &executor,
    &intent,
) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

println!("instructions={}", plan.instructions.len());
println!("required_signers={}", plan.required_signers.len());

Memo v1 et v3 restent non exécutables. Memo v4 est la seule génération exécutable.

Exécution Metaplex Token Metadata

La surface publique repose sur :

  • ExMetadataMetaplexTokenMetadataExecutor ;
  • ExMetaplexTokenMetadataExecutionIntent ;
  • ExMetaplexTokenMetadataOperation ;
  • les constantes EX_METAPLEX_TOKEN_METADATA_*_OPERATION ;
  • EX_METAPLEX_TOKEN_METADATA_SUPPORTED_OPERATION_CODES et EX_METAPLEX_TOKEN_METADATA_DEPRECATED_OPERATION_CODES.

Le consommateur construit un intent typé, puis appelle ExApiTypedInstructionExecutor::build_prepared_plan. Le plan retourné contient les instructions, comptes et signers requis, mais neffectue ni simulation ni envoi.

Les opérations courantes utilisent leur wrapper canonique final. Les versions remplacées ne possèdent pas de builder public distinct. Les opérations obsolètes encore constructibles exigent que lintent autorise explicitement lexécution dépréciée ; leurs variantes Rust sont marquées #[deprecated].

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.

let evaluation = match checker.evaluate_prepared_plan(&plan) {
    Ok(value) => value,
    Err(error) => return Err(error),
};

match evaluation.decision {
    kb_lib::ExSafetyDecision::Allow => {
        println!("execution plan accepted");
    },
    kb_lib::ExSafetyDecision::Deny => {
        for violation in evaluation.violations {
            eprintln!("safety violation: {violation:#?}");
        }
    },
}

Matérialisation

MtApiEventMaterializer définit le contrat public de matérialisation. Les résultats MtApiMaterializerExecutionResult contiennent les sorties et diagnostics sans dépendre dun backend de stockage.

let result = kb_lib::MtApiEventMaterializer::materialize(
    &materializer,
    &decoded_observation,
);

println!("status={:?}", result.status);
println!("outputs={}", result.outputs.len());
println!("diagnostics={}", result.diagnostics.len());

Les fonctions stateful publiques comprennent notamment :

  • materializer_admin_materialize_token_2022_state_snapshots ;
  • materializer_admin_materialize_elgamal_registry_state_snapshot ;
  • materializer_token_materialize_token_2022_state_snapshot ;
  • materializer_metadata_materialize_token_2022_snapshot ;
  • materializer_metadata_materialize_metaplex_metadata_snapshot ;
  • materializer_metadata_materialize_metaplex_account_snapshot.

Contrat de replay

MdCoreInstructionReplayInput représente une instruction extraite avec son contexte transactionnel. Il constitue la frontière entre lextraction Core, le pipeline de replay et les décodeurs.

let recognition = DcApiInstructionDecoder::recognize(&decoder, &replay_input);

if recognition.compatible {
    let decoded = DcApiInstructionDecoder::decode(&decoder, &replay_input);
    if let Err(error) = decoded {
        return Err(error);
    }
}

Tests et matrices utiles

Les tests unitaires du décodeur Metaplex et du décodeur Solana Core chargent directement certaines matrices de ../test-fixtures/contract-matrices/. Ils vérifient notamment légalité entre les entrées compilées et les contrats JSON, les discriminants, les bornes et les comportements historiques.

Les tests des exécuteurs comparent les instructions produites aux builders officiels et vérifient signers, comptes ordonnés, coûts et politiques de sécurité.

Limites

  • 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.