// file: crates/ksp-onchain-transport-lib/tests/transport_devnet_smoke.rs // version: 6 //! Opt-in live Devnet smoke for representative pure Transport reads across the complete HTTP typed surface. fn devnet_pool() -> ksp_core_lib::Result { let role = ksp_onchain_transport_lib::HttpRoleName::new("default"); let role_settings = ksp_onchain_transport_lib::HttpEndpointRoleSettings::new( role, true, std::vec![ksp_onchain_transport_lib::HttpRequestKind::wildcard()], 0, ksp_onchain_transport_lib::HttpRoleLimits::new( std::option::Option::None, std::option::Option::None, std::option::Option::None, std::option::Option::None, ), ); 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, ksp_onchain_transport_lib::HttpProviderName::new("solana-public"), ksp_onchain_transport_lib::HttpClusterName::new("devnet"), endpoint_url, std::time::Duration::from_secs(5), std::time::Duration::from_secs(20), std::option::Option::Some(4), std::vec![role_settings], ); let settings = ksp_onchain_transport_lib::HttpTransportSettings::new( 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); } #[tokio::test(flavor = "current_thread")] #[ignore = "opt-in live Solana Devnet smoke; performs external network requests"] async fn programmatic_devnet_transport_reaches_accounts_tokens_cluster_transactions_blocks_and_economics_reads() { 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( std::option::Option::Some(ksp_onchain_transport_lib::SolanaAccountEncoding::Base64), std::option::Option::None, std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized), std::option::Option::None, ); let account = pool .get_account_info(&role, &ksp_core_lib::PRGIDPK_SOLANA_SYSTEM, std::option::Option::Some(&account_config)) .await .expect("Devnet getAccountInfo smoke must succeed"); assert!(account.context().slot() > 0); assert!(account.value().is_some()); // Follow the current official Devnet example shape with an ordinary owner, the canonical SPL Token program selector, // and an explicit finalized/jsonParsed config. The owner need not retain any token account; an empty list remains valid. let token_owner = "A1TMhSGzQxMr1TboBKtgixKz1sS6REASMxPo1qsyTSJd" .parse::() .expect("official Devnet token-owner example must remain a valid Pubkey literal"); let token_program = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" .parse::() .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_config = ksp_onchain_transport_lib::SolanaAccountInfoConfig::new( std::option::Option::Some(ksp_onchain_transport_lib::SolanaAccountEncoding::JsonParsed), std::option::Option::None, std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized), std::option::Option::None, ); let token_accounts = pool .get_token_accounts_by_owner(&role, &token_owner, &token_selector, std::option::Option::Some(&token_config)) .await .expect("Devnet getTokenAccountsByOwner smoke must succeed with the documented finalized/jsonParsed request shape"); assert!(token_accounts.context().slot() > 0); let epoch = pool .get_epoch_info( &role, std::option::Option::Some(&ksp_onchain_transport_lib::SolanaContextConfig::new( std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized), std::option::Option::None, )), ) .await .expect("Devnet getEpochInfo smoke must succeed"); assert!(epoch.absolute_slot() > 0); let vote_accounts = pool.get_vote_accounts(&role, std::option::Option::None).await.expect("Devnet getVoteAccounts smoke must succeed"); assert!(!vote_accounts.current().is_empty() || !vote_accounts.delinquent().is_empty()); let transaction_context = ksp_onchain_transport_lib::SolanaContextConfig::new( std::option::Option::Some(ksp_onchain_transport_lib::SolanaCommitment::Finalized), std::option::Option::None, ); let latest_blockhash = pool .get_latest_blockhash(&role, std::option::Option::Some(&transaction_context)) .await .expect("Devnet getLatestBlockhash smoke must succeed"); assert!(!latest_blockhash.value().blockhash().is_empty()); assert!(latest_blockhash.value().last_valid_block_height() > 0); let blockhash_valid = pool .is_blockhash_valid(&role, latest_blockhash.value().blockhash(), std::option::Option::Some(&transaction_context)) .await .expect("Devnet isBlockhashValid smoke must succeed"); assert_eq!(blockhash_valid.value(), &true); let transaction_count = pool .get_transaction_count(&role, std::option::Option::Some(&transaction_context)) .await .expect("Devnet getTransactionCount smoke must succeed"); assert!(transaction_count > 0); let block_height = pool.get_block_height(&role, std::option::Option::Some(&transaction_context)).await.expect("Devnet getBlockHeight smoke must succeed"); assert!(block_height > 0); let inflation_rate = pool.get_inflation_rate(&role).await.expect("Devnet getInflationRate smoke must succeed"); assert!(inflation_rate.total().is_finite()); assert!(inflation_rate.validator().is_finite()); assert!(inflation_rate.foundation().is_finite()); let stake_minimum_delegation = pool .get_stake_minimum_delegation(&role, std::option::Option::Some(&transaction_context)) .await .expect("Devnet getStakeMinimumDelegation smoke must succeed"); assert!(stake_minimum_delegation.context().slot() > 0); assert!(*stake_minimum_delegation.value() > 0); }