# Audit de clôture native, exécution et RPC — `0.4.2` ## Décision Le jalon `0.4.2` est clôturé. L’audit distingue quatre contrats indépendants : 1. les opérations futures constructibles par `kb_executor_solana_core` ; 2. les instructions passées décodables par `kb_decoder_solana_core` ; 3. les méthodes standard HTTP/WebSocket exposées par `kb_rpc` ; 4. l’orchestration de sécurité, de simulation, d’envoi et de replay post-exécution. Une méthode transportable via JSON brut n’est pas considérée comme un adaptateur typé. Un builder stateless n’autorise pas à lui seul une opération dépendant d’un compte, d’une autorité, du rent, d’un slot ou d’un epoch. Une opération dangereuse peut être complète dans la bibliothèque tout en restant absente de l’UI et désactivée sur Mainnet. ## Résultat synthétique | Domaine | Inventaire canonique | Contrat final `0.4.2` | |-------------------------|-------------------------------------------------------------------------:|------------------------------------------------------------------------------------------------| | Exécuteur natif | 18 surfaces, 14 appelables, 4 non invocables/historiques, 109 opérations | égalité imposée par test Rust ; builders comparés aux interfaces ou layouts officiels | | Décodeur natif | 18 surfaces, 121 déclarations | égalité imposée avec `kb_program_ids::native_program_ids()` et `SolanaCoreDecoder::coverage()` | | HTTP JSON-RPC | 52 méthodes | 52 contrats typés configurables, 0 méthode standard limitée au JSON brut | | WebSocket JSON-RPC | 9 paires / 18 méthodes | 9 requêtes, 9 notifications et 9 runtimes persistants typés | | Préflight stateful | ALT, Config, Feature, Slashing, ZK ElGamal | rapports `NotRequired` / `Ready` / `Blocked`, Localnet/Devnet uniquement | | Parcours mutable validé | System transfer Devnet | simulation, signature, envoi, confirmation, canonical, core et decode replay réussis | ## Exécuteur Solana Core `docs/NATIVE_SOLANA_EXECUTION_MATRIX.json` et `SOLANA_CORE_OPERATION_CODES` imposent : - exactement 18 surfaces ; - exactement 14 surfaces appelables et 4 surfaces sans instruction client ; - exactement 109 codes d’opération uniques ; - Program IDs présents dans `kb_program_ids` ; - contrat de construction, politique, tests, validation cluster et décision UI pour chaque opération ; - distribution des préflights `27 none / 14 required / 68 future`. Les surfaces sans builder client sont BPF Loader v1, BPF Loader v2, Native Loader et l’ancien ZK Token Proof Program. Stake `Redelegate` reste historique `decode-only`. Cette classification évite d’inventer des instructions qui ne sont plus ou n’ont jamais été appelables par un client moderne. Les entrées `future` ne signifient pas « non implémenté ». Elles signifient que le wire et le plan sont couverts offline, mais que l’activation mutable exige encore une preuve stateful par scénario sur Localnet/Devnet. Aucune de ces opérations n’est activée sur Mainnet par `0.4.2`. ## Décodeur Solana Core `docs/NATIVE_SOLANA_DECODER_MATRIX.json` couvre exactement les 18 surfaces du registre natif et 121 déclarations. Les tests de complétude parcourent les enums officielles ou les tables wire auditées pour System, Compute Budget, ALT, Stake, Vote, loaders, précompiles, Slashing et preuves ZK. Stake Config reste un compte bien connu non exécutable. Il ne possède ni dispatch d’instruction ni plan d’exécution. ## HTTP JSON-RPC standard `docs/SOLANA_STANDARD_RPC_MATRIX.json` et `STANDARD_HTTP_METHODS` enregistrent 52 méthodes. Chacune possède un contrat de requête/résultat propre à `kb_rpc`. Les options facultatives restent indépendantes : commitment, `minContextSlot`, encodage, `dataSlice`, filtres, contexte, tri, niveau de détail, rewards et version maximale de transaction. Les DTO Agave ne font pas partie de l’API publique. La voie JSON brute reste une primitive interne ou d’extension fournisseur, pas un substitut à une méthode standard absente. ## WebSocket JSON-RPC standard Les neuf paires standard possèdent paramètres, notifications et runtime persistant dans `kb_rpc`. `WsSession` fournit : - une socket multiplexée ; - des identifiants locaux stables et distants remappables ; - unsubscribe explicite ; - timeouts bornés ; - ping/pong et fermeture ; - reconnexion exponentielle bornée ; - réabonnement ; - suppression terminale de `signatureSubscribe`. `blockSubscribe`, `slotsUpdatesSubscribe` et `voteSubscribe` sont désactivées par défaut, mais activables lorsqu’un endpoint les annonce explicitement. La première souscription réelle sert de probe paresseux. Une réponse `Method not found`, `not enabled`, `unavailable` ou `unsupported` désactive uniquement la capacité concernée pour la session ; les erreurs de paramètres, d’authentification ou de rate limit ne la désactivent pas. ## Frontière Tauri et TS-rs Les payloads actifs de `kb_app_demo` et `kb_config` transmis par JSON utilisent des `number`, pas des `bigint`. Les valeurs d’identifiants sont contrôlées avec `Number.isSafeInteger` avant invocation. Les types génériques hors frontière Tauri conservent leurs contrats exacts lorsqu’ils ne sont pas sérialisés par `JSON.stringify`. Le navigateur SQL applique maintenant la limite maximale reçue du backend avant l’appel Tauri. Une valeur supérieure à 5 000 produit un diagnostic frontend et n’atteint plus PostgreSQL. ## Preuves de validation Validations fournies le 13 juillet 2026 : | Crate / contrôle | Résultat | |-----------------------------------------|----------:| | `kb_program_ids` | 5 tests | | `kb_decoder_solana_core` | 116 tests | | `kb_executor_solana_core` | 88 tests | | `kb_execution_api` | 22 tests | | `kb_execution_safety` | 15 tests | | `kb-lib::executor::solana::transaction` | 12 tests | | `kb_rpc` | 113 tests | | `kb_pipeline` | 56 tests | | `kb_config` | 41 tests | | `kb_app_demo` | 88 tests | | `kb_store_pg` avec PostgreSQL réel | 45 tests | | `cargo clippy --all-targets` | propre | Le test Devnet opt-in a exécuté un transfert de 1 000 000 lamports avec airdrop nul depuis un wallet préfinancé. Il a confirmé simulation, signature, envoi, confirmation, hydratation canonique, extraction core et decode replay. `cargo tauri dev` a démarré Vite, initialisé les treize tables attendues et exercé les sessions WebSocket. L’archive de logs Mainnet/Tauri confirme des unsubscribe réels pour `slot`, `root` et `program`. Le refus de sélectionner un autre endpoint tant qu’une session est active est un garde-fou volontaire. L’ancien échec `JSON.stringify cannot serialize BigInt` n’est plus présent. ## Limites conservées après clôture - Mainnet reste désactivé par défaut et exige une politique explicite. - Les opérations stateful administratives non exercées sur cluster restent hors UI et bloquées avant toute future activation mutable. - Le parcours validé utilise une transaction legacy avec recent blockhash ; durable nonce et transactions v0 sont couverts par les bibliothèques mais nécessitent leurs propres parcours opérateur avant exposition. - Les méthodes WebSocket instables dépendent du nœud et peuvent être désactivées automatiquement à l’exécution. La clôture de `0.4.2` n’ouvre aucune version suivante et ne fixe aucun plan de sources historiques externes.