# Validation candidate `0.2.4` — HTTP Blocks + Economics + compliance finale ## Objet Cette matrice porte la preuve de clôture candidate de `0.2.4 — HTTP Blocks + Economics + compliance HTTP finale`. Elle complète les validations historiques : - [`003-V0_2_1_ONCHAIN_HTTP.md`](003-V0_2_1_ONCHAIN_HTTP.md) — foundation HTTP et registre initial ; - [`004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md`](004-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER.md) — 22 wrappers Accounts/Tokens/Cluster ; - [`005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md`](005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md) — réaudit `KSP-TRANSPORT-007` des 37 wrappers acquis avant `0.2.4` ; - [`006-V0_2_3_HTTP_TRANSACTIONS.md`](006-V0_2_3_HTTP_TRANSACTIONS.md) — 11 wrappers Transactions et clôture stable `0.2.3`. `0.2.4-pre.009` n'ajoute pas de nouvelle méthode RPC métier. Il agrège les preuves de complétude, étend le smoke live aux familles nouvellement livrées, synchronise la documentation et prépare `0.2.5`. `0.2.4-rel.001` reste strictement publicationnelle après validation opérateur complète de cette candidate. ## Base opérateur validée La base `0.2.4-pre.008-fix.001` a été validée le **18 août 2026** avec : ```text cargo fmt --all OK cargo check --workspace OK cargo clippy --workspace --all-targets OK Transport 240 unit passed 26 public API passed 21 release completeness passed 1 smoke live ignored par défaut 0 failure ``` Le fix ne modifie pas le contrat `getInflationReward`; il ajoute uniquement le `return` explicite exigé par la policy Clippy workspace. ## Réaudit officiel final — inventaire HTTP Dernier contrôle effectué le **18 août 2026** contre l'index HTTP Solana courant : ```text https://solana.com/docs/rpc/http ``` L'index contient toujours exactement **52 méthodes HTTP courantes**. La navigation Deprecated officielle, visible depuis les pages sous : ```text https://solana.com/docs/rpc/deprecated/ ``` contient toujours exactement **14 méthodes historiques**. Le rapprochement a été réalisé sur les **noms exacts**, pas uniquement sur les compteurs : ```text official current names == KSP current registry names == 52/52 official deprecated names == KSP historical registry names == 14/14 missing == 0 extra == 0 ``` Aucun nouvel endpoint HTTP issu de SIMD-0180 ou d'une autre évolution d'interface n'apparaît dans l'index officiel actuel. ## Baseline Agave et audit SIMD final La baseline runtime conservée pour le contrat de cette release reste **Agave `v4.2.1`**, déjà auditée depuis `pre.001`. Le calendrier public Agave v4.2 observé le 18 août 2026 montre que le rollout v4.2 est encore en cours : Devnet a été livré en juillet/août et les étapes Mainnet-beta d'adoption générale/activation sont positionnées en août. Cette situation ne justifie pas de remplacer rétroactivement la baseline wire de la release sans différence stable démontrée. Audit final minimal imposé par le plan : | SIMD | Statut observé le 2026-08-18 | Conséquence HTTP KSP | |---------------------------------------------------|------------------------------|-------------------------------------------------------------------------------------------------------------------| | `0180` Vote Account Address Keyed Leader Schedule | Review | aucune nouvelle méthode HTTP officielle ; ne pas changer `getLeaderSchedule` par anticipation | | `0298` Bank Hash in Block Footer | Idea | aucun `bankHash` ajouté au wire stable `getBlock` | | `0301` parent bank hash | PR fermé, non mergé | aucun `parentBankHash` spéculatif | | `0307` Add Block Footer | Review | aucun `footer` ajouté à `SolanaGetBlockConfig`/`SolanaConfirmedBlock` tant que la baseline stable ne l'expose pas | | `0385` Transaction V1 | Review | conserver `SolanaTransactionVersion::Number(u8)` générique et la canary version `1` | | `0490` Stake v5 | Review | `getStakeMinimumDelegation` reflète uniquement la valeur runtime ; aucun minimum local codé en dur | | `0550` Double Disinflation Rate | Review | `getInflationGovernor`/`getInflationRate` reflètent les valeurs runtime ; aucune formule locale | | `0553` Base Inclusion and Resource-based Fee | Draft | changement économique/consensus à surveiller ; aucun nouveau wrapper ou champ HTTP stable ajouté | Extensions wire déjà acquises et réauditées explicitement : **SIMD-0118** et **SIMD-0291**. | SIMD | Statut observé le 2026-08-18 | Contrat déjà matérialisé dans KSP | |-----------------------------------------------|------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------| | `0118` Partitioned Epoch Rewards Distribution | Activated | `getBlock.numRewardPartitions` reste lossless : omission, `null` et valeur sont distincts ; KSP ne synthétise jamais `0` | | `0291` Commission Rate in Basis Points | Review | `commission` et `commissionBps` restent indépendants dans les rewards de bloc et d'inflation ; les sous-arbres transaction restent lossless | Le statut documentaire `Review` de SIMD-0291 ne justifie pas de supprimer un champ déjà livré par Agave `v4.2.1`. Inversement, KSP ne déduit jamais `commissionBps` depuis `commission`, ni l'inverse. Sources SIMD : ```text https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0118-partitioned-epoch-reward-distribution.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0180-vote-account-leader-schedule.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0291-commission-rate-in-basis-points.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0298-bank-hash-in-block-footer.md https://github.com/solana-foundation/solana-improvement-documents/pull/301 https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0307-add-block-footer.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0385-transaction-v1.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0490-upgrade-stake-to-v5.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0550-double-disinflation.md https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0553-resource-fee-burn.md ``` ## Compliance des 52 méthodes courantes La canary `public_v0_2_4_pre_009_all_52_current_typed_wrappers_and_legacy_forms_are_available_from_crate_root` référence directement chaque méthode Rust publique ci-dessous. Une méthode ne compte donc pas comme typed-complete uniquement parce qu'un descriptor ou l'exécuteur raw existe. | Méthode RPC | Catégorie | Release typed | Classe | Wrapper public | |-------------------------------------|--------------|---------------|--------------------------------------|------------------------------------------| | `getAccountInfo` | Accounts | `0.2.2` | Read / RetrySafe | `get_account_info` | | `getBalance` | Accounts | `0.2.1` | Read / RetrySafe | `get_balance` | | `getLargestAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_largest_accounts` | | `getMinimumBalanceForRentExemption` | Accounts | `0.2.2` | Read / RetrySafe | `get_minimum_balance_for_rent_exemption` | | `getMultipleAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_multiple_accounts` | | `getProgramAccounts` | Accounts | `0.2.2` | Read / RetrySafe | `get_program_accounts` | | `getTokenAccountBalance` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_account_balance` | | `getTokenAccountsByDelegate` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_accounts_by_delegate` | | `getTokenAccountsByOwner` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_accounts_by_owner` | | `getTokenLargestAccounts` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_largest_accounts` | | `getTokenSupply` | Tokens | `0.2.2` | Read / RetrySafe | `get_token_supply` | | `getFeeForMessage` | Transactions | `0.2.3` | Read / RetrySafe | `get_fee_for_message` | | `getLatestBlockhash` | Transactions | `0.2.3` | Read / RetrySafe | `get_latest_blockhash` | | `getRecentPrioritizationFees` | Transactions | `0.2.3` | Read / RetrySafe | `get_recent_prioritization_fees` | | `getSignaturesForAddress` | Transactions | `0.2.3` | Read / RetrySafe | `get_signatures_for_address` | | `getSignatureStatuses` | Transactions | `0.2.3` | Read / RetrySafe | `get_signature_statuses` | | `getTransaction` | Transactions | `0.2.3` | Read / RetrySafe | `get_transaction` + legacy | | `getTransactionCount` | Transactions | `0.2.3` | Read / RetrySafe | `get_transaction_count` | | `isBlockhashValid` | Transactions | `0.2.3` | Read / RetrySafe | `is_blockhash_valid` | | `requestAirdrop` | Transactions | `0.2.3` | WriteSubmission / NeverAfterDispatch | `request_airdrop` | | `sendTransaction` | Transactions | `0.2.3` | WriteSubmission / NeverAfterDispatch | `send_transaction` | | `simulateTransaction` | Transactions | `0.2.3` | Simulation / RetrySafe | `simulate_transaction` | | `getBlock` | Blocks | `0.2.4` | Read / RetrySafe | `get_block` + legacy | | `getBlockCommitment` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_commitment` | | `getBlockHeight` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_height` | | `getBlockProduction` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_production` | | `getBlocks` | Blocks | `0.2.4` | Read / RetrySafe | `get_blocks` | | `getBlocksWithLimit` | Blocks | `0.2.4` | Read / RetrySafe | `get_blocks_with_limit` | | `getBlockTime` | Blocks | `0.2.4` | Read / RetrySafe | `get_block_time` | | `getFirstAvailableBlock` | Blocks | `0.2.4` | Read / RetrySafe | `get_first_available_block` | | `getRecentPerformanceSamples` | Blocks | `0.2.4` | Read / RetrySafe | `get_recent_performance_samples` | | `minimumLedgerSlot` | Blocks | `0.2.4` | Read / RetrySafe | `minimum_ledger_slot` | | `getClusterNodes` | Cluster | `0.2.2` | Read / RetrySafe | `get_cluster_nodes` | | `getEpochInfo` | Cluster | `0.2.2` | Read / RetrySafe | `get_epoch_info` | | `getEpochSchedule` | Cluster | `0.2.2` | Read / RetrySafe | `get_epoch_schedule` | | `getGenesisHash` | Cluster | `0.2.1` | Read / RetrySafe | `get_genesis_hash` | | `getHealth` | Cluster | `0.2.1` | Read / RetrySafe | `get_health` | | `getHighestSnapshotSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_highest_snapshot_slot` | | `getIdentity` | Cluster | `0.2.2` | Read / RetrySafe | `get_identity` | | `getLeaderSchedule` | Cluster | `0.2.2` | Read / RetrySafe | `get_leader_schedule` | | `getMaxRetransmitSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_max_retransmit_slot` | | `getMaxShredInsertSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_max_shred_insert_slot` | | `getSlot` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot` | | `getSlotLeader` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot_leader` | | `getSlotLeaders` | Cluster | `0.2.2` | Read / RetrySafe | `get_slot_leaders` | | `getVersion` | Cluster | `0.2.1` | Read / RetrySafe | `get_version` | | `getVoteAccounts` | Cluster | `0.2.2` | Read / RetrySafe | `get_vote_accounts` | | `getInflationGovernor` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_governor` | | `getInflationRate` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_rate` | | `getInflationReward` | Economics | `0.2.4` | Read / RetrySafe | `get_inflation_reward` | | `getStakeMinimumDelegation` | Economics | `0.2.4` | Read / RetrySafe | `get_stake_minimum_delegation` | | `getSupply` | Economics | `0.2.4` | Read / RetrySafe | `get_supply` | Les deux formes legacy encore supportées sont couvertes séparément et marquées deprecated : ```text getTransaction -> HttpTransportPool::get_transaction_legacy getBlock -> HttpTransportPool::get_block_legacy ``` Partition exacte : ```text 0.2.1 foundation 4 0.2.2 Accounts/Tokens/Cluster 22 0.2.3 Transactions 11 0.2.4 Blocks/Economics 15 -------------------------------- total 52 ``` Classification globale attendue : ```text Read / RetrySafe Simulation / RetrySafe WriteSubmission / NeverAfterDispatch ``` Les seules write submissions actuelles restent `requestAirdrop` et `sendTransaction`; aucune classe `NeverAfterDispatch` n'est affaiblie par `0.2.4`. ## Compliance des 14 historiques Les 14 entrées restent découvrables pour audit/compliance mais sont `Deprecated / Removed / NotApplicable` et ne sont pas envoyées au réseau : | Méthode historique | Documentation | Runtime KSP | Remplacement/aide | |-------------------------------------|---------------|-------------|-------------------------------------| | `confirmTransaction` | Deprecated | Removed | getSignatureStatuses | | `getConfirmedBlock` | Deprecated | Removed | getBlock | | `getConfirmedBlocks` | Deprecated | Removed | getBlocks | | `getConfirmedBlocksWithLimit` | Deprecated | Removed | getBlocksWithLimit | | `getConfirmedSignaturesForAddress2` | Deprecated | Removed | getSignaturesForAddress | | `getConfirmedTransaction` | Deprecated | Removed | getTransaction | | `getFeeCalculatorForBlockhash` | Deprecated | Removed | isBlockhashValid / getFeeForMessage | | `getFeeRateGovernor` | Deprecated | Removed | getFeeForMessage | | `getFees` | Deprecated | Removed | getFeeForMessage | | `getRecentBlockhash` | Deprecated | Removed | getLatestBlockhash | | `getSignatureConfirmation` | Deprecated | Removed | getSignatureStatuses | | `getSignatureStatus` | Deprecated | Removed | getSignatureStatuses | | `getSnapshotSlot` | Deprecated | Removed | getHighestSnapshotSlot | | `getStakeActivation` | Deprecated | Removed | aucun remplacement direct | La canary `release_v0_2_4_pre_009_final_http_inventory_and_coverage_partition_are_exact` fige simultanément : ```text 52 noms current exacts 14 noms historiques exacts 4 / 22 / 11 / 15 par HttpRpcCoverageRelease Supported pour les 52 current Deprecated + Removed + NotApplicable pour les 14 historiques RetrySafe pour Read/Simulation current NeverAfterDispatch pour WriteSubmission current ``` ## `KSP-TRANSPORT-007` — preuve globale 52/52 Le réaudit `0.2.3` a déjà conclu **37/37 conformes** avant l'ouverture de `0.2.4`. Les 15 nouveaux wrappers appliquent la même règle sans réduction de contrat. ### Blocks — 10/10 Points de sensibilité couverts : - `getBlock` moderne + bare encoding legacy deprecated ; - encodings `binary/base58/base64/json/jsonParsed` réellement supportés par la baseline ; - `transactionDetails = full/signatures/none/accounts` ; - `maxSupportedTransactionVersion` et version numérique générique, y compris canary `1` ; - distinction résultat `null` / erreurs RPC ; - `transactions`, `signatures`, `rewards`, `numRewardPartitions` avec préservation des états wire pertinents ; - `commission` nullable + `commissionBps` indépendant ; - `getBlocks` avec ses quatre overloads exacts et `RpcContextConfig` complet ; - `getBlocksWithLimit(0)` valide et plafond 500000 ; - `getRecentPerformanceSamples <= 720` et ancien wire sans `numNonVoteTransactions` ; - `getBlockProduction` identity/range/context sans restriction de commitment inventée ; - wrappers sans config exactement en `params: []`. ### Economics — 5/5 Points de sensibilité couverts : - aucune formule d'inflation locale ; - aucun minimum de délégation codé en dur ; - `getSupply` conserve `excludeNonCirculatingAccountsList` omis/false/true ; - `getInflationReward` conserve ordre, doublons, `null` positionnels et cardinalité ; - aucun plafond d'adresses inventé pour `getInflationReward` ; - `epoch`, `commitment`, `minContextSlot` transmis ; - `getInflationReward` rejette `processed` avant I/O car la voie runtime exige au moins `confirmed` ; - `commission` nullable et `commissionBps` présent/omis/null indépendants ; - erreurs RPC de contexte/rewards period conservées comme erreurs applicatives distantes. Verdict candidate : ```text KSP-TRANSPORT-007 current wrappers == 52/52 remédiation fonctionnelle finale == aucune ``` ## Smoke Devnet Transport pur Le smoke Transport reste opt-in, programmatique et read-only : ```text settings programmatiques -> getAccountInfo -> getTokenAccountsByOwner -> getEpochInfo -> getVoteAccounts -> getLatestBlockhash -> isBlockhashValid -> getTransactionCount -> getBlockHeight -> getInflationRate -> getStakeMinimumDelegation ``` Les trois derniers appels ajoutent une traversée live représentative des familles Blocks/Economics sans dépendre d'un slot historique particulier, d'un compte reward spécifique ou d'une valeur économique codée en dur. Commande : ```bash cargo test -p ksp-onchain-transport-lib --test transport_devnet_smoke -- --ignored --nocapture ``` Le smoke historique de composition reste séparé et transitoire : ```bash cargo test -p ksp-config-lib --test transport_devnet_smoke -- --ignored --nocapture ``` Il ne devient pas un modèle de placement des futurs smokes cross-crates. ## Frontières et graphes Cargo Frontière attendue : ```text ksp-config-lib -> ksp-onchain-transport-lib ksp-onchain-transport-lib -> ksp-core-lib ksp-onchain-transport-lib -> ksp-logging-lib ksp-onchain-transport-lib -X-> ksp-config-lib ksp-onchain-transport-lib -X-> Store ksp-onchain-transport-lib -X-> Program ksp-onchain-transport-lib -X-> tracing direct ``` `0.2.4` n'ajoute aucune dépendance externe au `Cargo.toml` de Transport. Graphes à inspecter sur la candidate : ```bash cargo tree -p ksp-onchain-transport-lib cargo tree -p ksp-onchain-transport-lib -d cargo tree -p ksp-onchain-transport-lib -e features cargo tree -p ksp-onchain-transport-lib -e normal cargo tree -p ksp-config-lib cargo tree -p ksp-config-lib -d cargo tree -p ksp-config-lib -e features cargo tree -p ksp-config-lib -e normal ``` Interprétation importante : `tracing` peut apparaître **transitivement** sous `ksp-logging-lib`, ce qui est conforme à l'architecture. L'interdit porte sur une dépendance **directe** de `ksp-onchain-transport-lib` vers `tracing`. Les graphes doivent donc être lus par chaîne de dépendances et non validés par la simple présence/absence du nom `tracing` dans l'arbre complet. Les canaries workspace de dépendances restent des règles globales et ne sont pas déplacées dans Transport. ## Gate candidate `0.2.4-pre.009` Validation déterministe immédiate attendue : ```bash cargo fmt --all cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-onchain-transport-lib ``` Compteurs Transport attendus après les deux nouvelles canaries finales : ```text 240 unit 27 public API 22 release completeness 1 smoke live ignored par défaut ``` Gate de clôture avant `rel.001` : ```bash cargo test -p ksp-config-lib cargo test -p ksp-core-lib cargo test -p ksp-app-config-desk cargo test --workspace ``` Puis inspection des huit graphes Cargo ci-dessus et exécution explicite des deux smokes Devnet. Les résultats opérateur de `pre.009` seront enregistrés ici pendant `rel.001`; ils ne sont pas anticipés dans la candidate. ## Documentation et prochaine release La candidate synchronise : ```text ROADMAP.md README/USAGE Transport inventaire composant séquence fonctionnelle plan 011 index docs/plans/validation/prompts ``` Le prompt suivant est : ```text prompts/010-V0_2_5_START_PROMPT.md 0.2.5 — Wallet foundation ``` Il conserve notamment les frontières déjà décidées : ```text ksp-wallet-lib .kspwallet protection des secrets signature import/export extensible changement de mot de passe atomicité/no-clobber Wallet -X-> Config Wallet -X-> Transport Wallet -X-> execution policy WalletPolicy hors Wallet ``` ## Publication `rel.001` Après validation opérateur complète : ```text workspace.package.version -> 0.2.4 ROADMAP : 0.2.4 -> [X] CHANGELOG : synthèse stable 0.2.4 plan 011 / validation 007 : preuves finales opérateur + statut stable README/USAGE/inventaires : candidate -> stable deltas/0.2.4/rel.001.md commit : v0.2.4-rel.001 tag stable : v0.2.4 ``` Aucun wrapper, DTO, comportement runtime, dependency ou feature Cargo ne doit être ajouté pendant `rel.001`.