v0.5.2-pre.006-fix-010

This commit is contained in:
2026-08-11 12:03:35 +02:00
parent 1ee1d0297d
commit 56572cec40
67 changed files with 2484 additions and 539 deletions

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/execution.rs
// version: 16
// version: 17
//! Devnet classic SPL Token execution with stateful and canonical post-validation.
@@ -105,7 +105,6 @@ pub struct DevnetSplTokenExecutionSummary {
}
struct PreparedTokenExecution {
wallet: ks_wallet::TemporaryWallet,
unsigned: ks_lib::ExSolanaUnsignedTransaction,
evidence: ks_lib::ExSolanaSimulationEvidence,
summary: crate::DevnetSplTokenExecutionSummary,
@@ -127,11 +126,15 @@ where
"simulate_devnet_spl_token requires submit=false",
));
}
let prepared =
match prepare_execution(http_pool, profile, workspace_root, request, observer).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let temporary = match crate::load_profile_temporary_wallet(profile, workspace_root).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let wallet = crate::DevnetExecutionWallet::Temporary(temporary);
let prepared = match prepare_execution(http_pool, profile, &wallet, request, observer).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
return std::result::Result::Ok(prepared.summary);
}
@@ -154,11 +157,47 @@ where
+ Sync,
O: crate::SolanaExecutionObserver,
{
let prepared =
match prepare_execution(http_pool, profile, workspace_root, request, observer).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let temporary = match crate::load_profile_temporary_wallet(profile, workspace_root).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let wallet = crate::DevnetExecutionWallet::Temporary(temporary);
return execute_devnet_spl_token_with_wallet(
http_pool,
store,
profile,
&wallet,
request,
decoders,
materializers,
observer,
)
.await;
}
/// Executes this Devnet operation with an explicitly resolved wallet capability.
#[allow(clippy::too_many_arguments)]
pub async fn execute_devnet_spl_token_with_wallet<S, O>(
http_pool: &ks_onchain_transport::HttpEndpointPool,
store: &S,
profile: &ks_config::ProfileConfig,
wallet: &crate::DevnetExecutionWallet,
request: &crate::DevnetSplTokenExecutionRequest,
decoders: &[std::sync::Arc<dyn ks_lib::DcApiInstructionDecoder>],
materializers: &[std::sync::Arc<dyn ks_lib::MtApiEventMaterializer>],
observer: &O,
) -> ks_core::Result<crate::DevnetSplTokenExecutionSummary>
where
S: ks_store::RawTransactionStore
+ ks_store::CoreExtractionStore
+ ks_store::DecodePipelineStore
+ Sync,
O: crate::SolanaExecutionObserver,
{
let prepared = match prepare_execution(http_pool, profile, wallet, request, observer).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
if !request.submit {
return std::result::Result::Ok(prepared.summary);
}
@@ -188,7 +227,7 @@ where
}
let signed = match prepared
.unsigned
.sign_after_simulation(&prepared.evidence, &[prepared.wallet.as_signer()])
.sign_after_simulation(&prepared.evidence, &[wallet.as_signer()])
{
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
@@ -428,7 +467,7 @@ where
async fn prepare_execution<O>(
http_pool: &ks_onchain_transport::HttpEndpointPool,
profile: &ks_config::ProfileConfig,
workspace_root: &std::path::Path,
wallet: &crate::DevnetExecutionWallet,
request: &crate::DevnetSplTokenExecutionRequest,
observer: &O,
) -> ks_core::Result<PreparedTokenExecution>
@@ -479,11 +518,7 @@ where
failed_readiness_message(&readiness),
));
}
let wallet = match crate::load_profile_temporary_wallet(profile, workspace_root).await {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
let wallet_summary = wallet.summary();
let wallet_summary = wallet.identity();
let fee_payer = ks_lib::MdPubkey(wallet_summary.public_key.clone());
let balance = match http_pool
.get_balance_for_role(
@@ -620,7 +655,7 @@ where
materializations: std::vec::Vec::new(),
post_execution: std::option::Option::None,
};
return std::result::Result::Ok(PreparedTokenExecution { wallet, unsigned, evidence, summary });
return std::result::Result::Ok(PreparedTokenExecution { unsigned, evidence, summary });
}
fn validate_profile(
@@ -632,9 +667,11 @@ fn validate_profile(
"SPL Token Devnet orchestration requires a Devnet wallet profile",
));
}
if !profile.wallet.temporary_wallet_enabled || !profile.wallet.temporary_wallet_persist {
if profile.wallet.wallet_alias.is_none()
&& (!profile.wallet.temporary_wallet_enabled || !profile.wallet.temporary_wallet_persist)
{
return std::result::Result::Err(ks_core::Error::config(
"SPL Token Devnet orchestration requires an enabled persistent temporary wallet",
"SPL Token Devnet orchestration requires an enabled persistent temporary wallet when no native wallet alias is selected",
));
}
if !profile.execution.require_simulation {
@@ -1093,7 +1130,7 @@ mod tests {
};
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
profile.wallet.temporary_wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
std::result::Result::Ok(value) => value,
@@ -1263,7 +1300,7 @@ mod tests {
};
let mut profile = example_devnet_profile();
if let std::result::Result::Ok(directory) = std::env::var("KS_DEVNET_WALLET_DIR") {
profile.wallet.wallet_dir = directory;
profile.wallet.temporary_wallet_dir = directory;
}
let pool = match ks_onchain_transport::HttpEndpointPool::from_profile(&profile) {
std::result::Result::Ok(value) => value,