v0.2.2-pre.001-fix.001
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/009-V0_2_2_HTTP_ACCOUNTS_TOKENS_CLUSTER_PLAN.md -->
|
||||
<!-- version: 2 -->
|
||||
<!-- version: 3 -->
|
||||
|
||||
# Plan `0.2.2` — HTTP Accounts + Tokens + Cluster
|
||||
|
||||
@@ -13,7 +13,7 @@ registry des méthodes, exécution HTTP générique, adapter Config -> Transport
|
||||
Cette release ne reconstruit aucun transport par famille. Elle complète uniquement la surface typée des 22 méthodes déjà attribuées à
|
||||
`HttpRpcCoverageRelease::V0_2_2`.
|
||||
|
||||
## Sources normatives réauditées le 2026-08-17
|
||||
## Sources normatives réauditées les 2026-08-17 et 2026-08-18
|
||||
|
||||
Source documentaire principale :
|
||||
|
||||
@@ -25,15 +25,19 @@ Références complémentaires officielles utilisées pour les formes wire commun
|
||||
|
||||
```text
|
||||
https://solana.com/docs/rpc/json-structures
|
||||
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc/src/rpc.rs
|
||||
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/config.rs
|
||||
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/filter.rs
|
||||
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/request.rs
|
||||
https://github.com/anza-xyz/agave/blob/v3.1.8/rpc-client-types/src/response.rs
|
||||
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc/src/rpc.rs
|
||||
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/config.rs
|
||||
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/filter.rs
|
||||
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/request.rs
|
||||
https://github.com/anza-xyz/agave/blob/v4.2.1/rpc-client-types/src/response.rs
|
||||
```
|
||||
|
||||
Les liens `Source` des pages RPC Solana consultées pointent actuellement vers Agave `v3.1.8`. KSP ne prend pas de dépendance sur ces crates :
|
||||
leur source sert seulement à lever les ambiguïtés de la documentation HTTP lorsque nécessaire.
|
||||
Les liens `Source` actuellement exposés par les pages RPC Solana consultées pointent encore vers Agave `v3.1.8`. Ce constat documentaire ne
|
||||
signifie pas que `v3.1.8` soit la source Agave la plus récente à auditer. Le 2026-08-18, KSP recoupe donc ces pages avec le tag Agave `v4.2.1`,
|
||||
dont le workspace déclare lui-même la version `4.2.1`, afin de détecter les évolutions wire plus récentes que les liens du site Solana.
|
||||
|
||||
KSP ne prend pas de dépendance sur ces crates : leurs sources servent seulement à lever les ambiguïtés de la documentation HTTP et à préserver
|
||||
les champs optionnels/versionnés réellement exposés par Agave `v4.2.1`, plus récent que le snapshot `v3.1.8` encore lié par le site Solana.
|
||||
|
||||
## Résultat de l'audit global
|
||||
|
||||
@@ -135,7 +139,7 @@ true -> RpcResponse<Vec<KeyedAccount>>
|
||||
|
||||
Le contrat public doit refléter cette union au lieu de supprimer le contexte ou d'inventer un contexte lorsque le serveur n'en renvoie pas.
|
||||
|
||||
Les filtres KSP doivent distinguer les trois variantes acceptées par la source primaire Agave actuelle :
|
||||
Les filtres KSP doivent distinguer les trois variantes acceptées par la source primaire Agave `v4.2.1` :
|
||||
|
||||
```text
|
||||
DataSize(u64)
|
||||
@@ -215,11 +219,16 @@ tpuQuic Option<String>
|
||||
tpuVote Option<String>
|
||||
tvu Option<String>
|
||||
version Option<String>
|
||||
clientId Option<String>
|
||||
```
|
||||
|
||||
Même si Agave utilise actuellement `SocketAddr` en interne pour plusieurs endpoints, le DTO public Transport ne doit pas imposer davantage que
|
||||
Même si Agave `v4.2.1` utilise `SocketAddr` en interne pour plusieurs endpoints, le DTO public Transport ne doit pas imposer davantage que
|
||||
le contrat JSON. Les adresses réseau restent donc des chaînes wire optionnelles à moins qu'un invariant officiel plus strict soit nécessaire.
|
||||
|
||||
La page Solana courante ne liste pas encore `clientId`, mais Agave `v4.2.1` expose `client_id: Option<String>` dans `RpcContactInfo`. KSP doit donc
|
||||
accepter et préserver ce champ optionnel sans le rendre obligatoire, afin de rester compatible avec les noeuds/providers qui l'émettent comme
|
||||
avec ceux qui suivent encore la forme documentée sans ce champ.
|
||||
|
||||
### `EpochInfo` et `EpochSchedule`
|
||||
|
||||
`EpochInfo` conserve :
|
||||
@@ -276,20 +285,25 @@ delinquentSlotDistance
|
||||
Chaque record conserve au minimum :
|
||||
|
||||
```text
|
||||
votePubkey Pubkey
|
||||
nodePubkey Pubkey
|
||||
activatedStake u64
|
||||
commission u8
|
||||
epochVoteAccount bool
|
||||
epochCredits Vec<(epoch u64, credits u64, previousCredits u64)>
|
||||
lastVote u64
|
||||
rootSlot u64
|
||||
votePubkey Pubkey
|
||||
nodePubkey Pubkey
|
||||
activatedStake u64
|
||||
commission u8
|
||||
inflationRewardsCommissionBps Option<u16>
|
||||
epochVoteAccount bool
|
||||
epochCredits Vec<(epoch u64, credits u64, previousCredits u64)>
|
||||
lastVote u64
|
||||
rootSlot u64
|
||||
```
|
||||
|
||||
Un petit DTO nommé pour une entrée `epochCredits` est préférable à exposer un tuple public opaque, tout en conservant la forme tableau du wire
|
||||
au décodage. La source Agave courante limite la réponse à cinq entrées d'historique `epochCredits` par validator; KSP ne doit pas supposer que
|
||||
au décodage. La source Agave `v4.2.1` limite la réponse à cinq entrées d'historique `epochCredits` par validator; KSP ne doit pas supposer que
|
||||
l'historique complet d'un vote account est exposé par cette méthode RPC.
|
||||
|
||||
Agave `v4.2.1` ajoute également `inflationRewardsCommissionBps`, sérialisé comme champ optionnel. La source précise que ce champ vaut `None` pour
|
||||
un noeud antérieur à son introduction. Le DTO KSP doit donc le conserver en `Option<u16>` et ne jamais le déduire artificiellement de
|
||||
`commission`.
|
||||
|
||||
## DTOs communs et organisation prévue
|
||||
|
||||
`pre.002` doit introduire des types partagés ciblés, pas un « mega DTO ». Le découpage prévu est conceptuellement :
|
||||
@@ -405,11 +419,11 @@ Cas transversaux prioritaires :
|
||||
- `getAccountInfo` et `getMultipleAccounts` avec comptes absents ;
|
||||
- `getProgramAccounts` bare vs `withContext` ;
|
||||
- `TokenAmount.uiAmount: null` ;
|
||||
- fields optionnels de `getClusterNodes` ;
|
||||
- fields optionnels de `getClusterNodes`, dont présence/absence de `clientId` ;
|
||||
- `EpochInfo.transactionCount: null` ;
|
||||
- `SnapshotSlotInfo.incremental: null` et erreur NoSnapshot ;
|
||||
- `getLeaderSchedule: null` + overloads ;
|
||||
- `getVoteAccounts` current/delinquent et epoch credits ;
|
||||
- `getVoteAccounts` current/delinquent, epoch credits et présence/absence de `inflationRewardsCommissionBps` ;
|
||||
- limites 100, 4 filtres Program Accounts et 5000; variantes/encodages `memcmp`.
|
||||
|
||||
Les canaries de release doivent maintenir :
|
||||
|
||||
Reference in New Issue
Block a user