11 KiB
Delta 0.2.2-pre.003 — cinq wrappers HTTP Accounts typés
Base requise
Livraison précédente corrigée et validée localement par l'opérateur :
0.2.2-pre.002-fix.002
workspace.package.version = "0.2.2-pre.2.fix.2"
La validation opérateur du 2026-08-18 a confirmé :
cargo fmt --all OK
cargo check --workspace OK
cargo clippy --workspace --all-targets OK
cargo test -p ksp-onchain-transport-lib OK
Résultats Transport de cette base :
85 unit tests
9 public API tests
2 release completeness tests
0 warning signalé par check/clippy
Le plan canonique reste docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md version 3.
Objectif
Clôturer la famille Accounts attribuée à 0.2.2 avec cinq wrappers publics typés :
getAccountInfo
getLargestAccounts
getMinimumBalanceForRentExemption
getMultipleAccounts
getProgramAccounts
Tous passent par la foundation HTTP 0.2.1 :
wrapper typé
-> descriptor audité
-> execute_standard_rpc
-> pool/admission/retry/deadline
-> reqwest HTTP
-> JSON-RPC validation
-> décodage DTO KSP
Aucun wrapper ne contacte reqwest directement.
Version Cargo
Conformément à VER-ID-009 :
0.2.2-pre.2.fix.2 -> 0.2.2-pre.3
Aucune dépendance ni feature Cargo n'est ajoutée.
Surface typée Accounts
getAccountInfo
Signature publique conceptuelle :
role + Pubkey + Option<SolanaAccountInfoConfig>
-> SolanaRpcResponse<Option<SolanaAccount>>
Le wrapper :
- sérialise
encoding,dataSlice,commitmentetminContextSlot; - omet l'objet config lorsqu'il est vide ;
- conserve l'absence du compte sous
None; - conserve les formes Account data legacy, tuple encodé et
jsonParsed; - convertit l'owner en
ksp_core_lib::Pubkeysans recopier une valeur invalide dans le diagnostic.
getLargestAccounts
Signature publique conceptuelle :
role + Option<SolanaLargestAccountsConfig>
-> SolanaRpcResponse<Vec<SolanaAccountBalance>>
Le wrapper conserve l'ordre du wire et sérialise les champs KSP déjà audités dans pre.002, y compris filter et sortResults lorsqu'ils sont
explicitement renseignés.
getMinimumBalanceForRentExemption
Signature publique conceptuelle :
role + usize data_len + Option<SolanaCommitmentConfig>
-> u64 lamports
Le wrapper encode la longueur de données sans valeur sentinelle et conserve les erreurs JSON-RPC applicatives comme telles.
getMultipleAccounts
Signature publique conceptuelle :
role + &[Pubkey] + Option<SolanaAccountInfoConfig>
-> SolanaRpcResponse<Vec<Option<SolanaAccount>>>
Le wrapper :
- refuse localement plus de 100 public keys ;
- sérialise les adresses dans l'ordre fourni ;
- conserve les
nullindividuels ; - vérifie que le nombre d'éléments retournés correspond au nombre d'adresses demandées, afin de ne pas fabriquer silencieusement un mapping positionnel incohérent.
getProgramAccounts
Signature publique conceptuelle :
role + program Pubkey + Option<SolanaProgramAccountsConfig>
-> SolanaProgramAccountsResult
Le résultat préserve les deux formes wire :
Accounts(Vec<SolanaKeyedAccount>)
Context(SolanaRpcResponse<Vec<SolanaKeyedAccount>>)
Le wrapper sérialise dataSize, memcmp, tokenAccountState, withContext, sortResults et la config Account commune.
Validation locale des paramètres
Nouveau code d'erreur public Transport :
ERROR_CODE_INVALID_RPC_PARAMETERS
onchain_transport.invalid_rpc_parameters
Il distingue une requête KSP localement invalide d'une erreur JSON-RPC distante ou d'une réponse invalide.
Les invariants appliqués avant I/O sont :
getMultipleAccounts : <= 100 public keys
getProgramAccounts : <= 4 filters
memcmp raw bytes : <= 128 bytes
Pour memcmp encodé sous forme base58/base64, KSP ne décode toujours pas localement la chaîne : la limite des 128 octets décodés reste donc
contrôlée par le serveur. Cette décision évite d'ajouter bs58 ou base64 uniquement pour une validation anticipée.
Wire Account activé en production
Les helpers privés préparés par pre.002 et réellement nécessaires à ces wrappers deviennent production-live :
- sérialisation des configs Account/Largest/Program ;
- conversion des encodings Account ;
- décodage
SolanaAccountData; - décodage Account/KeyedAccount/AccountBalance ;
- conversion
Pubkeywire ; - construction interne de
SolanaRpcResponse<T>.
Les helpers Cluster/Token préparatoires restent inchangés et ne deviennent pas production-live avant leurs tranches respectives.
Fixtures HTTP déterministes ajoutées
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.null.json
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.invalid_owner.json
crates/ksp-onchain-transport-lib/fixtures/http/get_largest_accounts.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_largest_accounts.invalid_address.json
crates/ksp-onchain-transport-lib/fixtures/http/get_minimum_balance_for_rent_exemption.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_minimum_balance_for_rent_exemption.error.json
crates/ksp-onchain-transport-lib/fixtures/http/get_multiple_accounts.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_program_accounts.bare.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_program_accounts.context.success.json
Les tests locaux utilisent un serveur HTTP loopback et n'accèdent pas à Internet.
Couverture de tests ajoutée
Les tests Accounts couvrent :
- request exacte pour chaque méthode ;
- config et omission de config vide ;
- succès typé ;
- account absent ;
nulldansgetMultipleAccounts;- ordre de
getMultipleAccounts; - résultat bare et contextualisé de
getProgramAccounts; - invalid owner/address ;
- erreur JSON-RPC applicative ;
- limite des 100 comptes ;
- limite des 4 filtres ;
- limite raw
memcmpde 128 octets ; - mismatch cardinalité request/result de
getMultipleAccounts.
Le test public compile explicitement les cinq méthodes sur HttpTransportPool et vérifie le nouveau code d'erreur.
Un canari release supplémentaire fige l'ensemble Accounts 0.2.2 exact :
getAccountInfo
getLargestAccounts
getMinimumBalanceForRentExemption
getMultipleAccounts
getProgramAccounts
Il vérifie aussi que ces descriptors restent Read + RetrySafe. Aucune famille Tokens/Cluster n'est déclarée typed-complete par cette tranche.
Après application, la cible Transport attendue devient :
98 unit tests
10 public API tests
3 release completeness tests
Fichiers ajoutés
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.null.json
crates/ksp-onchain-transport-lib/fixtures/http/get_account_info.invalid_owner.json
crates/ksp-onchain-transport-lib/fixtures/http/get_largest_accounts.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_largest_accounts.invalid_address.json
crates/ksp-onchain-transport-lib/fixtures/http/get_minimum_balance_for_rent_exemption.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_minimum_balance_for_rent_exemption.error.json
crates/ksp-onchain-transport-lib/fixtures/http/get_multiple_accounts.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_program_accounts.bare.success.json
crates/ksp-onchain-transport-lib/fixtures/http/get_program_accounts.context.success.json
deltas/0.2.2/pre.003.md
Fichiers modifiés
Cargo.toml
crates/ksp-onchain-transport-lib/src/error.rs
crates/ksp-onchain-transport-lib/src/lib.rs
crates/ksp-onchain-transport-lib/src/rpc_accounts.rs
crates/ksp-onchain-transport-lib/src/rpc_common.rs
crates/ksp-onchain-transport-lib/unit_tests/rpc_accounts.rs
crates/ksp-onchain-transport-lib/tests/public_api.rs
crates/ksp-onchain-transport-lib/tests/release_completeness.rs
Fichiers supprimés
Aucun.
Fichiers volontairement inchangés
CHANGELOG.md
ROADMAP.md
docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md
crates/ksp-onchain-transport-lib/Cargo.toml
crates/ksp-onchain-transport-lib/src/executor.rs
crates/ksp-onchain-transport-lib/src/rpc_method.rs
crates/ksp-onchain-transport-lib/src/rpc_tokens.rs
crates/ksp-onchain-transport-lib/src/rpc_cluster.rs
crates/ksp-config-lib/**
config/**
La tranche suivante reste pre.004 — cinq wrappers Tokens.
Validations exécutées
- prise en compte de la validation opérateur propre de
pre.002-fix.002comme base ; - relecture des règles
VERSION_WORKFLOW.mdetRULES_RUST.mdapplicables ; - revérification de la documentation HTTP Solana actuelle pour les cinq méthodes Accounts ;
- recoupement des signatures/limites avec la source Agave
v4.2.1auditée par le plan ; - validation JSON syntaxique des dix nouvelles fixtures ;
- contrôle statique de l'absence de
unwrap,expect,panic!et#[allow(dead_code)]dans le code de production modifié ; - contrôle statique que les cinq wrappers utilisent
execute_standard_rpcet aucun appelreqwestdirect ; - contrôle statique de l'absence de nouvelle dépendance/feature ;
- contrôle exact des fichiers inclus dans l'archive d'échange.
Validations non exécutées
Le sandbox d'échange ne fournit pas cargo, rustc ou rustfmt. Les commandes suivantes doivent être exécutées sur le checkout opérateur avant
commit :
cargo fmt --all
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
cargo test --workspace reste réservé au checkpoint de clôture/session conformément au workflow KSP. Aucun cargo tree n'est requis par cette
tranche puisqu'aucune dépendance ni feature n'a changé.
Décisions prises
- utiliser les DTOs
pre.002sans créer de seconde couche RPC ; - conserver
execute_standard_rpc()comme unique entrée d'exécution HTTP standard ; - introduire un code d'erreur dédié aux paramètres typed invalides plutôt que détourner
invalid_settings; - vérifier localement les limites dont KSP peut connaître la violation sans dépendance de décodage supplémentaire ;
- préserver les
null, l'ordre et la dualité bare/context au lieu de normaliser artificiellement les réponses ; - ne pas modifier Config ;
- ne pas ajouter de logging spécifique par méthode.
Questions ouvertes
Aucune question bloquante pour pre.004.
Suite
0.2.2-pre.004 : implémenter les cinq wrappers Tokens (getTokenAccountBalance, getTokenAccountsByDelegate, getTokenAccountsByOwner,
getTokenLargestAccounts, getTokenSupply) avec les DTOs préparés, selector Mint | ProgramId, fixtures HTTP déterministes et conservation de
uiAmount: null.