v0.2.2-pre.007-fix.001

This commit is contained in:
2026-08-18 09:56:55 +02:00
parent b57f796187
commit 05e0e96083
7 changed files with 195 additions and 25 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-onchain-transport-lib/README.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# `ksp-onchain-transport-lib`
@@ -122,7 +122,7 @@ Deux smokes Devnet opt-in sont séparés par responsabilité :
```text
Transport pur : settings programmatiques -> HttpTransportPool
-> getAccountInfo/getTokenSupply/getEpochInfo/getVoteAccounts
-> getAccountInfo/getTokenAccountsByOwner/getEpochInfo/getVoteAccounts
Composition historique : Config -> std.transport/devnet_public -> HttpTransportPool
-> getHealth/getGenesisHash/getVersion/getBalance

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-onchain-transport-lib/USAGE.md -->
<!-- version: 2 -->
<!-- version: 3 -->
# Utilisation de `ksp-onchain-transport-lib`
@@ -161,7 +161,7 @@ Le smoke **Transport pur** construit ses settings programmatiquement et exerce u
cargo test -p ksp-onchain-transport-lib --test transport_devnet_smoke -- --ignored --nocapture
```
Il appelle `getAccountInfo`, `getTokenSupply`, `getEpochInfo` et `getVoteAccounts`. Le mint utilisé par `getTokenSupply` est celui de l'exemple Devnet de la documentation officielle courante ; si cet état externe disparaît, le smoke doit être réaudité plutôt que transformé en test déterministe.
Il appelle `getAccountInfo`, `getTokenAccountsByOwner`, `getEpochInfo` et `getVoteAccounts`. La branche Token utilise le selector `programId` avec l'ID canonique du programme SPL Token et `System Program` comme owner valide ; une réponse vide reste acceptable. Le smoke valide ainsi la route Token sans dépendre de la persistance d'un mint ou d'un token account Devnet particulier.
Le smoke historique de **composition Config -> Transport** reste également disponible :

View File

@@ -1,9 +1,9 @@
// file: crates/ksp-onchain-transport-lib/tests/transport_devnet_smoke.rs
// version: 1
// version: 2
//! Opt-in live Devnet smoke for the pure Transport Accounts/Tokens/Cluster path.
fn devnet_pool() -> ksp_onchain_transport_lib::HttpTransportPool {
fn devnet_pool() -> ksp_core_lib::Result<ksp_onchain_transport_lib::HttpTransportPool> {
let role = ksp_onchain_transport_lib::HttpRoleName::new("default");
let role_settings = ksp_onchain_transport_lib::HttpEndpointRoleSettings::new(
role,
@@ -17,8 +17,11 @@ fn devnet_pool() -> ksp_onchain_transport_lib::HttpTransportPool {
std::option::Option::None,
),
);
let endpoint_url =
ksp_onchain_transport_lib::HttpEndpointUrl::parse("https://api.devnet.solana.com").expect("official Solana Devnet endpoint URL must remain valid");
let endpoint_url_result = ksp_onchain_transport_lib::HttpEndpointUrl::parse("https://api.devnet.solana.com");
let endpoint_url = match endpoint_url_result {
std::result::Result::Ok(endpoint_url) => endpoint_url,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let endpoint = ksp_onchain_transport_lib::HttpEndpointSettings::new(
"solana_devnet_public",
true,
@@ -34,13 +37,13 @@ fn devnet_pool() -> ksp_onchain_transport_lib::HttpTransportPool {
std::vec![endpoint],
ksp_onchain_transport_lib::HttpRetrySettings::new(1, std::time::Duration::from_millis(250), std::time::Duration::from_secs(2)),
);
return ksp_onchain_transport_lib::HttpTransportPool::new(settings).expect("programmatic Devnet Transport settings must construct a pool");
return ksp_onchain_transport_lib::HttpTransportPool::new(settings);
}
#[tokio::test(flavor = "current_thread")]
#[ignore = "opt-in live Solana Devnet smoke; performs external network requests"]
async fn programmatic_devnet_transport_reaches_accounts_tokens_and_cluster_wrappers() {
let pool = devnet_pool();
let pool = devnet_pool().expect("programmatic Devnet Transport settings must construct a pool");
let role = ksp_onchain_transport_lib::HttpRoleName::new("default");
let account_config = ksp_onchain_transport_lib::SolanaAccountInfoConfig::new(
@@ -56,16 +59,17 @@ async fn programmatic_devnet_transport_reaches_accounts_tokens_and_cluster_wrapp
assert!(account.context().slot() > 0);
assert!(account.value().is_some());
// Current official getTokenSupply documentation uses this Devnet mint in its example.
let token_mint = "3wyAj7Rt1TWVPZVteFJPLa26JmLvdb1CAKEFZm3NY75E"
// Use the stable SPL Token program selector with a valid owner that need not own any token account.
// The smoke therefore validates the Token RPC path without depending on one mutable Devnet mint/account fixture.
let token_program = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
.parse::<ksp_core_lib::Pubkey>()
.expect("official Devnet token mint example must remain a valid Pubkey literal");
let token_supply = pool
.get_token_supply(&role, &token_mint, std::option::Option::None)
.expect("canonical SPL Token program id must remain a valid Pubkey literal");
let token_selector = ksp_onchain_transport_lib::SolanaTokenAccountSelector::ProgramId(token_program);
let token_accounts = pool
.get_token_accounts_by_owner(&role, &ksp_core_lib::PRGIDPK_SOLANA_SYSTEM, &token_selector, std::option::Option::None)
.await
.expect("Devnet getTokenSupply smoke must succeed for the documented mint");
assert!(token_supply.context().slot() > 0);
assert!(!token_supply.value().amount().is_empty());
.expect("Devnet getTokenAccountsByOwner smoke must succeed with the canonical SPL Token program selector");
assert!(token_accounts.context().slot() > 0);
let epoch = pool
.get_epoch_info(