# Delta `0.2.3-pre.001` — réaudit HTTP Transactions, sécurité et sizing ## Base requise Release stable attendue : ```text v0.2.2 ``` L'archive KSP fournie porte `workspace.package.version = "0.2.2"`. Elle ne contient pas `.git`; le tag `v0.2.2` n'est donc pas revérifiable localement depuis le zip. ## Objectif Exécuter la première tranche obligatoire de `0.2.3` sans implémentation fonctionnelle lourde : relire les contrats KSP, réauditer la surface HTTP Solana officielle actuelle, confirmer la matrice des 11 méthodes Transactions, vérifier les règles de sécurité Read/WriteSubmission/Simulation, cadrer les DTOs et formes wire, réévaluer les dépendances d'encodage et trancher le gate de sizing. ## Version Cargo Conformément à `VER-ID-009`, la prerelease non-fix synchronise le signal technique : ```text 0.2.2 -> 0.2.3-pre.1 ``` Aucune source Rust, dépendance Cargo ou configuration runtime n'est modifiée dans cette tranche. ## Résultats principaux - index HTTP Solana courant réaudité : **52 méthodes courantes** ; - navigation Deprecated officielle : **14 méthodes historiques**, inchangées ; - les 11 méthodes affectées à `HttpRpcCoverageRelease::V0_2_3` restent exactement : `getFeeForMessage`, `getLatestBlockhash`, `getRecentPrioritizationFees`, `getSignaturesForAddress`, `getSignatureStatuses`, `getTransaction`, `getTransactionCount`, `isBlockhashValid`, `requestAirdrop`, `sendTransaction`, `simulateTransaction` ; - la partition KSP reste donc `0.2.1 = 4`, `0.2.2 = 22`, `0.2.3 = 11`, `0.2.4 = 15` sans avancement prématuré ; - la classification centrale reste correcte : **8 Read / RetrySafe**, **2 WriteSubmission / NeverAfterDispatch** (`requestAirdrop`, `sendTransaction`), **1 Simulation / RetrySafe** (`simulateTransaction`) ; - `sendTransaction.maxRetries` reste une option RPC de retry côté nœud et ne doit jamais être confondue avec la retry policy HTTP KSP ; - un résultat ambigu après dispatch d'une WriteSubmission (`timeout`, rupture après envoi, HTTP temporaire après dispatch ou équivalent) interdit toute resoumission automatique par KSP ; - `getFeeForMessage` transporte un message encodé en base64 et retourne un `RpcResponse` dont la valeur fee est nullable ; - `getLatestBlockhash` conserve `blockhash` + `lastValidBlockHeight` sous contexte ; - `getRecentPrioritizationFees` conserve un tableau optionnel d'adresses, borné à **128** par la documentation/runtime courant, et un résultat ordonné de couples `slot/prioritizationFee` ; - `getSignaturesForAddress` conserve `before/until/limit`, `minContextSlot`, l'ordre newest-to-oldest et une limite runtime **1..=1000** ; - la source Agave courante expose aussi `transactionIndex` comme champ optionnel de la structure de signature ; le wire KSP ne doit pas le perdre ; - `getSignatureStatuses` conserve une cardinalité maximale de **256**, `searchTransactionHistory`, l'ordre positionnel des résultats et les `null` documentés ; la source Agave courante n'interdit pas un tableau d'entrée vide ; - `getTransaction` conserve l'objet de config moderne (`commitment`, `encoding`, `maxSupportedTransactionVersion`) et la forme legacy du second paramètre `encoding` uniquement pour compatibilité, explicitement non recommandée ; son résultat reste nullable et doit préserver les formes transaction/meta/version sans imposer un modèle Program métier ; - `requestAirdrop` reste une soumission malgré son rôle de faucet : une signature retournée ou une issue réseau ambiguë n'autorise aucun resend aveugle ; - `sendTransaction` ne construit ni ne signe la transaction : Transport transmet une transaction déjà construite/signée et préserve les options RPC ; - `simulateTransaction` reste retry-safe, accepte `base58`/`base64` côté runtime courant, et `sigVerify=true` est incompatible avec `replaceRecentBlockhash=true` ; - le résultat courant de simulation comporte de nombreux champs optionnels (`logs`, `accounts`, unités consommées, return data, inner instructions, replacement blockhash, fee, balances, token balances, loaded addresses) qui doivent être préservés sans décodage Program. ## Gate de sizing Question obligatoire : ```text Les 11 wrappers Transactions, leurs DTOs/wires, les règles write/simulation, les tests et la documentation peuvent-ils être clôturés proprement dans cette session ? ``` Réponse : ```text OUI. ``` Aucun split de release n'est nécessaire. Le volume est inférieur à `0.2.2`, mais trois fils restent volontairement isolés : `getTransaction`, les WriteSubmission/no-resend et `simulateTransaction`. Si une tranche réelle dépasse le budget KSP d'environ 15–20 minutes, une prerelease supplémentaire sera créée dans `0.2.3` sans déplacer silencieusement une méthode vers `0.2.4`. ## Décision dépendances et encodages Aucune nouvelle dépendance n'est ajoutée à `pre.001` : ```text base64 NON bs58 NON wincode NON solana-client NON crate RPC/SDK Solana haut niveau NON ``` Transport peut préserver les messages/transactions sérialisés sous forme de chaînes accompagnées d'un enum d'encodage typé. Les validations locales retenues sont celles qui n'exigent pas de désérialiser la transaction : cardinalités, limites fixes, variantes d'encodage/config autorisées et incompatibilités de paramètres. Ajouter uniquement `base64`/`bs58` ne suffirait pas à reproduire correctement les validations runtime actuelles, qui comprennent aussi limites de taille, désérialisation de message/transaction, versioning et sanitization. Tant qu'aucun besoin KSP concret n'exige ce décodage local, ces contrôles restent la responsabilité du runtime RPC. Toute future dépendance d'encodage devra être justifiée par un invariant KSP précis et testable. ## Prévision de travail ```text pre.001 audit officiel + matrice + sécurité + DTOs/wire + dépendances + sizing pre.002 primitives/configs/results Transactions partagés + fixtures communes pre.003 reads contextuels : fee/message, latest blockhash, transaction count, blockhash validity pre.004 prioritization fees + signatures for address + signature statuses pre.005 getTransaction moderne + compatibilité legacy + transaction/meta/version wire pre.006 requestAirdrop + sendTransaction + preuves end-to-end no-resend pre.007 simulateTransaction + résultat riche + invariants de config pre.008 réaudit final + canaries + smoke opt-in pertinent + README/USAGE + validation + prompt 0.2.4 ``` Une prerelease supplémentaire reste autorisée si le budget réel d'une tranche l'exige. ## Fichiers ajoutés ```text docs/plans/010-V0_2_3_HTTP_TRANSACTIONS_PLAN.md deltas/0.2.3/pre.001.md ``` ## Fichiers modifiés ```text Cargo.toml ROADMAP.md docs/000-README.md docs/plans/000-README.md docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md ``` `docs/000-README.md` synchronise aussi son arbre de validation avec le fichier `docs/validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md` déjà présent dans la release stable mais omis de cet index. ## Fichiers supprimés Aucun. ## Fichiers volontairement inchangés ```text CHANGELOG.md docs/plans/008-V0_2_1_ONCHAIN_HTTP_PLAN.md docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md docs/validation/003-V0_2_1_ONCHAIN_HTTP.md docs/validation/004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md crates/ksp-onchain-transport-lib/README.md crates/ksp-onchain-transport-lib/USAGE.md crates/ksp-onchain-transport-lib/src/** crates/ksp-onchain-transport-lib/unit_tests/** crates/ksp-onchain-transport-lib/tests/** ``` Les anciens deltas restent historiques et ne sont pas réécrits. ## Validations exécutées - relecture des sources KSP obligatoires du prompt `0.2.3` ; - inspection de l'archive stable KSP fournie et de la surface Transport `0.2.2` ; - confirmation locale que le registry expose toujours `52 current / 14 historical` et partitionne les releases `4 / 22 / 11 / 15` ; - confirmation locale que les 11 descriptors `V0_2_3` se répartissent `8 Read/RetrySafe + 2 WriteSubmission/NeverAfterDispatch + 1 Simulation/RetrySafe` ; - inspection de `execute_standard_rpc`, du mapping de dispatch et de la retry policy centrale pour confirmer l'arrêt après dispatch ambigu d'une WriteSubmission ; - consultation de l'index HTTP Solana officiel courant, de `Solana RPC JSON Structures` et des 11 pages Transactions ; - consultation de la navigation Deprecated officielle courante ; - consultation des sources primaires Agave liées par la documentation HTTP et cross-audit du tag `v4.2.1` pour configs, cardinalités, unions wire, champs optionnels, simulation et validations runtime ; - confirmation du maintien de la compatibilité legacy `getTransaction` sans la présenter comme forme recommandée ; - contrôle de l'absence de nouvelle dépendance d'encodage/RPC dans `Cargo.toml` et dans le manifest Transport ; - contrôle que `pre.001` ne modifie aucune source/test Rust ni `CHANGELOG.md`. ## Validations non exécutées Le sandbox courant ne fournit pas le binaire `cargo` (`command -v cargo` ne retourne aucun chemin). Les validations Cargo suivantes n'ont donc pas été exécutées ici et doivent être rejouées sur le checkout de développement avant commit : ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-onchain-transport-lib ``` Aucun `cargo tree` n'est nécessaire dans cette tranche car aucune dépendance ni feature n'a changé. Les quatre vues `cargo tree` du prompt restent obligatoires à la clôture de `0.2.3` et lors de toute prerelease qui modifierait une dépendance/feature. L'archive KSP fournie ne contient pas `.git`; le commit attendu après application et validations suit `VER-GIT-001` : ```text v0.2.3-pre.001 ``` ## Questions ouvertes Aucune question bloquante pour `pre.002`. Les noms Rust définitifs des DTOs restent ajustables pendant l'implémentation, mais les invariants wire, cardinalités, compatibilités et frontières de sécurité fixés par le plan `010` ne doivent pas être relâchés pour simplifier artificiellement les wrappers. ## Suite `0.2.3-pre.002` : introduire les primitives/configs/results Transactions partagés et les fixtures déterministes communes avant les premiers wrappers Transactions.