v0.1.0-pre.043
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# file: Cargo.toml
|
||||
# version: 3
|
||||
# version: 4
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
@@ -10,6 +10,7 @@ members = [
|
||||
"kb-logging",
|
||||
"kb-program-ids",
|
||||
"kb-pipeline",
|
||||
"kb-pipeline-demo-scenarios",
|
||||
"kb-onchain-transport",
|
||||
"kb-store",
|
||||
"kb-wallet",
|
||||
|
||||
28
kb-pipeline-demo-scenarios/Cargo.toml
Normal file
28
kb-pipeline-demo-scenarios/Cargo.toml
Normal file
@@ -0,0 +1,28 @@
|
||||
# file: kb-pipeline-demo-scenarios/Cargo.toml
|
||||
# version: 1
|
||||
|
||||
[package]
|
||||
name = "kb-pipeline-demo-scenarios"
|
||||
version.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
publish.workspace = true
|
||||
|
||||
[dependencies]
|
||||
chrono.workspace = true
|
||||
kb-core = { path = "../kb-core" }
|
||||
kb-config = { path = "../kb-config" }
|
||||
kb-lib = { path = "../kb-lib" }
|
||||
kb-onchain-transport = { path = "../kb-onchain-transport" }
|
||||
kb-pipeline = { path = "../kb-pipeline" }
|
||||
kb-program-ids = { path = "../kb-program-ids" }
|
||||
kb-store = { path = "../kb-store" }
|
||||
kb-wallet = { path = "../kb-wallet" }
|
||||
serde.workspace = true
|
||||
serde_json.workspace = true
|
||||
tokio.workspace = true
|
||||
tracing.workspace = true
|
||||
uuid.workspace = true
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
7
kb-pipeline-demo-scenarios/src/constants.rs
Normal file
7
kb-pipeline-demo-scenarios/src/constants.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
// file: kb-pipeline-demo-scenarios/src/constants.rs
|
||||
// version: 1
|
||||
|
||||
//! Demo scenario constants.
|
||||
|
||||
/// Canonical tracing target for demo pipeline scenarios.
|
||||
pub(crate) const TRACING_TARGET: &str = "kb-pipeline-demo-scenarios";
|
||||
130
kb-pipeline-demo-scenarios/src/lib.rs
Normal file
130
kb-pipeline-demo-scenarios/src/lib.rs
Normal file
@@ -0,0 +1,130 @@
|
||||
// file: kb-pipeline-demo-scenarios/src/lib.rs
|
||||
// version: 1
|
||||
|
||||
#![forbid(unsafe_code)]
|
||||
#![deny(unreachable_pub)]
|
||||
#![warn(missing_docs)]
|
||||
|
||||
//! Reusable demonstration and Devnet validation scenarios built on `kb-pipeline`.
|
||||
|
||||
mod constants;
|
||||
mod solana_ata_execution;
|
||||
mod solana_execution;
|
||||
mod solana_memo_execution;
|
||||
mod solana_token2022_devnet_execution;
|
||||
mod solana_token2022_devnet_scenarios;
|
||||
mod solana_token2022_validation;
|
||||
mod solana_token_execution;
|
||||
mod solana_token_lifecycle;
|
||||
|
||||
/// Complete request for one Devnet Associated Token Account execution.
|
||||
pub use self::solana_ata_execution::DevnetSplAssociatedTokenAccountExecutionRequest;
|
||||
/// Complete result of one Devnet Associated Token Account execution.
|
||||
pub use self::solana_ata_execution::DevnetSplAssociatedTokenAccountExecutionSummary;
|
||||
/// Executes one Devnet Associated Token Account simulation or authorized submission.
|
||||
pub use self::solana_ata_execution::execute_devnet_spl_associated_token_account;
|
||||
/// Simulates one Devnet Associated Token Account operation after stateful preflight.
|
||||
pub use self::solana_ata_execution::simulate_devnet_spl_associated_token_account;
|
||||
/// Complete request for one bounded System Program transfer on Devnet.
|
||||
pub use self::solana_execution::DevnetSystemTransferRequest;
|
||||
/// Summary returned by one bounded System Program transfer execution.
|
||||
pub use self::solana_execution::DevnetSystemTransferSummary;
|
||||
/// No-op observer suitable for CLI tools and opt-in integration tests.
|
||||
pub use self::solana_execution::NoopSolanaExecutionObserver;
|
||||
/// Observer notified during Solana execution orchestration.
|
||||
pub use self::solana_execution::SolanaExecutionObserver;
|
||||
/// Progress event emitted by Solana execution orchestration.
|
||||
pub use self::solana_execution::SolanaExecutionProgressEvent;
|
||||
/// Severity of one Solana execution progress event.
|
||||
pub use self::solana_execution::SolanaExecutionProgressLevel;
|
||||
/// Emits one execution progress event for specialized pipeline orchestrators.
|
||||
pub(crate) use self::solana_execution::emit;
|
||||
/// Rejects one execution stage when the observer reports cancellation.
|
||||
pub(crate) use self::solana_execution::ensure_not_cancelled;
|
||||
/// Executes one bounded System Program transfer on Devnet.
|
||||
pub use self::solana_execution::execute_devnet_system_transfer;
|
||||
/// Loads the persistent wallet configured by one execution profile.
|
||||
pub(crate) use self::solana_execution::load_profile_wallet;
|
||||
/// Formats one failed simulation without discarding runtime diagnostics.
|
||||
pub(crate) use self::solana_execution::simulation_failure_message;
|
||||
/// Formats safety violations for one denied execution plan.
|
||||
pub(crate) use self::solana_execution::violation_message;
|
||||
/// Complete request for one SPL Memo v4 Devnet execution.
|
||||
pub use self::solana_memo_execution::DevnetMemoExecutionRequest;
|
||||
/// Complete result of one SPL Memo v4 Devnet execution and post-validation.
|
||||
pub use self::solana_memo_execution::DevnetMemoExecutionSummary;
|
||||
/// Executes one SPL Memo v4 Devnet simulation or explicitly authorized submission.
|
||||
pub use self::solana_memo_execution::execute_devnet_memo;
|
||||
/// Complete request for one Devnet classic SPL Token execution.
|
||||
pub use self::solana_token_execution::DevnetSplTokenExecutionRequest;
|
||||
/// Complete result of one Devnet classic SPL Token execution.
|
||||
pub use self::solana_token_execution::DevnetSplTokenExecutionSummary;
|
||||
/// Canonical hydration availability helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::canonical_available;
|
||||
/// Decode completion helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::decode_completed;
|
||||
/// Executes one Devnet classic SPL Token simulation or authorized submission.
|
||||
pub use self::solana_token_execution::execute_devnet_spl_token;
|
||||
/// Canonical signature hydration helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::hydrate_signature;
|
||||
/// Targeted program replay helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::replay_program;
|
||||
/// Simulates one Devnet classic SPL Token operation after stateful preflight.
|
||||
pub use self::solana_token_execution::simulate_devnet_spl_token;
|
||||
/// Complete request to prepare raw accounts for one Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationRequest;
|
||||
/// One prepared raw account step.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationStep;
|
||||
/// Summary of raw-account preparation for one lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationSummary;
|
||||
/// Complete request for one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleRequest;
|
||||
/// Summary of one lifecycle operation step.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleStepSummary;
|
||||
/// Complete controlled lifecycle summary.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleSummary;
|
||||
/// Executes one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::execute_devnet_spl_token_lifecycle;
|
||||
/// Prepares raw accounts for one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::prepare_devnet_spl_token_lifecycle_accounts;
|
||||
/// Complete request for one Devnet Token-2022 execution.
|
||||
pub use self::solana_token2022_devnet_execution::DevnetSplToken2022ExecutionRequest;
|
||||
/// Complete result of one Devnet Token-2022 execution.
|
||||
pub use self::solana_token2022_devnet_execution::DevnetSplToken2022ExecutionSummary;
|
||||
/// Executes one Devnet Token-2022 simulation or authorized submission.
|
||||
pub use self::solana_token2022_devnet_execution::execute_devnet_spl_token2022;
|
||||
/// Simulates one Devnet Token-2022 operation after stateful preflight.
|
||||
pub use self::solana_token2022_devnet_execution::simulate_devnet_spl_token2022;
|
||||
/// Stable category of one independent Devnet validation scenario.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationFamily;
|
||||
/// Current implementation status of one Devnet validation scenario.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationImplementationStatus;
|
||||
/// One independent Devnet validation scenario exposed to applications.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationScenario;
|
||||
/// Returns the complete ordered Devnet scenario inventory.
|
||||
pub use self::solana_token2022_devnet_scenarios::devnet_spl_validation_scenarios;
|
||||
/// Maximum number of evidence records accepted in one validation report.
|
||||
pub use self::solana_token2022_validation::MAX_TOKEN2022_VALIDATION_EVIDENCE;
|
||||
/// Required validation environment for one Token-2022 scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationEnvironment;
|
||||
/// One bounded proof attached to a Token-2022 validation scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationEvidence;
|
||||
/// Machine-readable Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationMatrix;
|
||||
/// One scenario declared by the canonical validation matrix.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationMatrixScenario;
|
||||
/// Complete bounded Token-2022 validation report.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationReport;
|
||||
/// One declared Token-2022 validation scenario and its observed evidence.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationScenario;
|
||||
/// Exact status of one Token-2022 validation scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationStatus;
|
||||
/// Loads and validates the canonical Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::load_token2022_validation_matrix;
|
||||
/// Validates one Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::validate_token2022_validation_matrix;
|
||||
/// Validates one bounded Token-2022 milestone report.
|
||||
pub use self::solana_token2022_validation::validate_token2022_validation_report;
|
||||
|
||||
/// Canonical tracing target for demo pipeline scenarios.
|
||||
pub(crate) use self::constants::TRACING_TARGET;
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_ata_execution.rs
|
||||
// version: 5
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_ata_execution.rs
|
||||
// version: 6
|
||||
|
||||
//! Devnet ATA execution with stateful and canonical post-validation.
|
||||
|
||||
@@ -77,7 +77,7 @@ pub struct DevnetSplAssociatedTokenAccountExecutionSummary {
|
||||
/// Wallet balance observed before planning.
|
||||
pub balance_lamports: u64,
|
||||
/// Stateful readiness report produced before plan simulation.
|
||||
pub stateful_readiness: crate::SplAssociatedTokenAccountStatefulReadinessReport,
|
||||
pub stateful_readiness: kb_pipeline::SplAssociatedTokenAccountStatefulReadinessReport,
|
||||
/// Exact prepared Token plan.
|
||||
pub plan: kb_lib::ExApiPreparedExecutionPlan,
|
||||
/// Recent blockhash used by the exact transaction.
|
||||
@@ -92,15 +92,15 @@ pub struct DevnetSplAssociatedTokenAccountExecutionSummary {
|
||||
pub confirmation: std::option::Option<kb_lib::ExApiExecutionConfirmationResult>,
|
||||
/// Stateful account relationships observed after confirmation.
|
||||
pub post_state_validation:
|
||||
std::option::Option<crate::SplAssociatedTokenAccountPostExecutionReport>,
|
||||
std::option::Option<kb_pipeline::SplAssociatedTokenAccountPostExecutionReport>,
|
||||
/// Canonical hydration result for the exact signature.
|
||||
pub backfill: std::option::Option<crate::BackfillSummary>,
|
||||
pub backfill: std::option::Option<kb_pipeline::BackfillSummary>,
|
||||
/// Core extraction result for the exact signature.
|
||||
pub core_extraction: std::option::Option<crate::CoreExtractionSummary>,
|
||||
pub core_extraction: std::option::Option<kb_pipeline::CoreExtractionSummary>,
|
||||
/// First Token decode and materialization replay.
|
||||
pub decode_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub decode_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Second replay proving idempotence for the same decoder version and input.
|
||||
pub idempotence_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub idempotence_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Exact materialized rows produced for the submitted Token transaction.
|
||||
pub materializations: std::vec::Vec<kb_store::MaterializedEventQueryRow>,
|
||||
/// Aggregated post-execution validation diagnostic.
|
||||
@@ -294,7 +294,7 @@ where
|
||||
},
|
||||
};
|
||||
let post_state_ready =
|
||||
post_state.status == crate::SplAssociatedTokenAccountStatefulReadinessStatus::Ready;
|
||||
post_state.status == kb_pipeline::SplAssociatedTokenAccountStatefulReadinessStatus::Ready;
|
||||
summary.post_state_validation = std::option::Option::Some(post_state);
|
||||
if !post_state_ready {
|
||||
diagnostic.diagnostics.push("confirmed SPL Associated Token Account execution did not satisfy final account relationships".to_string());
|
||||
@@ -328,10 +328,10 @@ where
|
||||
summary.post_execution = std::option::Option::Some(diagnostic);
|
||||
return std::result::Result::Ok(summary);
|
||||
}
|
||||
let extraction = match crate::execute_core_extraction(
|
||||
let extraction = match kb_pipeline::execute_core_extraction(
|
||||
store,
|
||||
&crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
&kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
@@ -527,9 +527,9 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let readiness = match crate::inspect_spl_associated_token_account_stateful_readiness(
|
||||
let readiness = match kb_pipeline::inspect_spl_associated_token_account_stateful_readiness(
|
||||
http_pool,
|
||||
&crate::SplAssociatedTokenAccountStatefulReadinessRequest {
|
||||
&kb_pipeline::SplAssociatedTokenAccountStatefulReadinessRequest {
|
||||
query_role: request.query_role.clone(),
|
||||
cluster: kb_lib::ExApiExecutionCluster::Devnet,
|
||||
intent,
|
||||
@@ -541,7 +541,7 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
if readiness.status != crate::SplAssociatedTokenAccountStatefulReadinessStatus::Ready {
|
||||
if readiness.status != kb_pipeline::SplAssociatedTokenAccountStatefulReadinessStatus::Ready {
|
||||
return std::result::Result::Err(kb_core::Error::new(
|
||||
"execution_spl_associated_token_account_stateful_blocked",
|
||||
failed_readiness_message(&readiness),
|
||||
@@ -762,7 +762,7 @@ fn build_intent(
|
||||
}
|
||||
|
||||
fn failed_readiness_message(
|
||||
readiness: &crate::SplAssociatedTokenAccountStatefulReadinessReport,
|
||||
readiness: &kb_pipeline::SplAssociatedTokenAccountStatefulReadinessReport,
|
||||
) -> std::string::String {
|
||||
let failures = readiness
|
||||
.checks
|
||||
@@ -793,10 +793,10 @@ async fn validate_post_state_with_retries(
|
||||
query_role: &str,
|
||||
maximum_retries: u32,
|
||||
operation: &kb_lib::ExSplAssociatedTokenAccountOperation,
|
||||
) -> kb_core::Result<crate::SplAssociatedTokenAccountPostExecutionReport> {
|
||||
) -> kb_core::Result<kb_pipeline::SplAssociatedTokenAccountPostExecutionReport> {
|
||||
let mut retry = 0_u32;
|
||||
loop {
|
||||
let result = crate::inspect_spl_associated_token_account_post_execution(
|
||||
let result = kb_pipeline::inspect_spl_associated_token_account_post_execution(
|
||||
http_pool,
|
||||
query_role,
|
||||
kb_lib::ExApiExecutionCluster::Devnet,
|
||||
@@ -806,7 +806,7 @@ async fn validate_post_state_with_retries(
|
||||
match result {
|
||||
std::result::Result::Ok(report)
|
||||
if report.status
|
||||
== crate::SplAssociatedTokenAccountStatefulReadinessStatus::Ready
|
||||
== kb_pipeline::SplAssociatedTokenAccountStatefulReadinessStatus::Ready
|
||||
|| retry >= maximum_retries =>
|
||||
{
|
||||
return std::result::Result::Ok(report);
|
||||
@@ -834,7 +834,7 @@ async fn replay_program<S, O>(
|
||||
decoders: &[std::sync::Arc<dyn kb_lib::DcApiInstructionDecoder>],
|
||||
materializers: &[std::sync::Arc<dyn kb_lib::MtApiEventMaterializer>],
|
||||
observer: &O,
|
||||
) -> kb_core::Result<crate::DecodeReplaySummary>
|
||||
) -> kb_core::Result<kb_pipeline::DecodeReplaySummary>
|
||||
where
|
||||
S: kb_store::DecodePipelineStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
@@ -860,13 +860,13 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return crate::execute_decode_replay(
|
||||
return kb_pipeline::execute_decode_replay(
|
||||
store,
|
||||
&crate::DecodeReplayRequest {
|
||||
campaign_id: crate::new_decode_campaign_id(),
|
||||
&kb_pipeline::DecodeReplayRequest {
|
||||
campaign_id: kb_pipeline::new_decode_campaign_id(),
|
||||
selection,
|
||||
decoder_names: std::vec::Vec::new(),
|
||||
dispatch_policy: crate::DecodeDispatchPolicy::HighestPriority,
|
||||
dispatch_policy: kb_pipeline::DecodeDispatchPolicy::HighestPriority,
|
||||
max_concurrent_inputs: 1,
|
||||
force_replay: if include_materialized_state {
|
||||
false
|
||||
@@ -883,7 +883,7 @@ where
|
||||
.await;
|
||||
}
|
||||
|
||||
fn decode_completed(summary: &crate::DecodeReplaySummary) -> bool {
|
||||
fn decode_completed(summary: &kb_pipeline::DecodeReplaySummary) -> bool {
|
||||
return summary.failed_inputs == 0
|
||||
&& summary.unmatched == 0
|
||||
&& !summary.cancelled
|
||||
@@ -904,20 +904,22 @@ async fn hydrate_signature<S, O>(
|
||||
post_validation_max_retries: u32,
|
||||
observer: &O,
|
||||
signature: &kb_lib::MdSignature,
|
||||
) -> kb_core::Result<crate::BackfillSummary>
|
||||
) -> kb_core::Result<kb_pipeline::BackfillSummary>
|
||||
where
|
||||
S: kb_store::RawTransactionStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
{
|
||||
let mut retry = 0_u32;
|
||||
loop {
|
||||
let result = match crate::execute_http_backfill(
|
||||
let result = match kb_pipeline::execute_http_backfill(
|
||||
http_pool,
|
||||
store,
|
||||
&crate::BackfillRequest {
|
||||
&kb_pipeline::BackfillRequest {
|
||||
role: query_role.to_string(),
|
||||
commitment: "confirmed".to_string(),
|
||||
source: crate::BackfillSource::ExplicitSignatures(std::vec![signature.0.clone()]),
|
||||
source: kb_pipeline::BackfillSource::ExplicitSignatures(std::vec![
|
||||
signature.0.clone()
|
||||
]),
|
||||
page_size: 1,
|
||||
max_pages: 1,
|
||||
max_concurrent_requests: 1,
|
||||
@@ -945,7 +947,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn canonical_available(summary: &crate::BackfillSummary) -> bool {
|
||||
fn canonical_available(summary: &kb_pipeline::BackfillSummary) -> bool {
|
||||
return summary.failed == 0
|
||||
&& summary.missing == 0
|
||||
&& summary.candidates_completed == 1
|
||||
@@ -1156,7 +1158,7 @@ mod tests {
|
||||
.unwrap_or_else(|error| panic!("Devnet ATA execution failed: {error}"));
|
||||
assert_eq!(
|
||||
summary.stateful_readiness.status,
|
||||
crate::SplAssociatedTokenAccountStatefulReadinessStatus::Ready
|
||||
kb_pipeline::SplAssociatedTokenAccountStatefulReadinessStatus::Ready
|
||||
);
|
||||
assert!(summary.simulation.success, "{:?}", summary.simulation.error);
|
||||
if submit {
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_execution.rs
|
||||
// version: 6
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_execution.rs
|
||||
// version: 7
|
||||
|
||||
//! Devnet Solana execution orchestration with canonical post-validation.
|
||||
|
||||
@@ -62,7 +62,10 @@ impl crate::SolanaExecutionProgressEvent {
|
||||
|
||||
/// Composite observer used by execution, backfill, extraction and decode replay.
|
||||
pub trait SolanaExecutionObserver:
|
||||
crate::BackfillObserver + crate::CoreExtractionObserver + crate::DecodeReplayObserver + Sync
|
||||
kb_pipeline::BackfillObserver
|
||||
+ kb_pipeline::CoreExtractionObserver
|
||||
+ kb_pipeline::DecodeReplayObserver
|
||||
+ Sync
|
||||
{
|
||||
/// Receives one execution-specific progress event.
|
||||
fn on_execution_progress(&self, event: &crate::SolanaExecutionProgressEvent);
|
||||
@@ -74,8 +77,8 @@ pub trait SolanaExecutionObserver:
|
||||
#[derive(Clone, Copy, Debug, Default)]
|
||||
pub struct NoopSolanaExecutionObserver;
|
||||
|
||||
impl crate::BackfillObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &crate::BackfillProgressEvent) {
|
||||
impl kb_pipeline::BackfillObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::BackfillProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -84,8 +87,8 @@ impl crate::BackfillObserver for crate::NoopSolanaExecutionObserver {
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::CoreExtractionObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &crate::CoreExtractionProgressEvent) {
|
||||
impl kb_pipeline::CoreExtractionObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::CoreExtractionProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -94,8 +97,8 @@ impl crate::CoreExtractionObserver for crate::NoopSolanaExecutionObserver {
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::DecodeReplayObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &crate::DecodeReplayProgressEvent) {
|
||||
impl kb_pipeline::DecodeReplayObserver for crate::NoopSolanaExecutionObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::DecodeReplayProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -236,11 +239,11 @@ pub struct DevnetSystemTransferSummary {
|
||||
/// Confirmation result when the transaction was submitted.
|
||||
pub confirmation: std::option::Option<kb_lib::ExApiExecutionConfirmationResult>,
|
||||
/// Canonical hydration result after an observed transaction reached a terminal status.
|
||||
pub backfill: std::option::Option<crate::BackfillSummary>,
|
||||
pub backfill: std::option::Option<kb_pipeline::BackfillSummary>,
|
||||
/// Core extraction result for the exact signature.
|
||||
pub core_extraction: std::option::Option<crate::CoreExtractionSummary>,
|
||||
pub core_extraction: std::option::Option<kb_pipeline::CoreExtractionSummary>,
|
||||
/// Contextual decode result for the exact signature.
|
||||
pub decode_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub decode_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Aggregated post-execution validation diagnostic.
|
||||
pub post_execution: std::option::Option<kb_lib::ExApiPostExecutionDiagnostic>,
|
||||
}
|
||||
@@ -676,14 +679,14 @@ where
|
||||
summary.post_execution = std::option::Option::Some(post_execution);
|
||||
return std::result::Result::Ok(summary);
|
||||
}
|
||||
let extraction_request = crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
let extraction_request = kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
};
|
||||
let extraction =
|
||||
match crate::execute_core_extraction(store, &extraction_request, observer).await {
|
||||
match kb_pipeline::execute_core_extraction(store, &extraction_request, observer).await {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => {
|
||||
post_execution
|
||||
@@ -735,17 +738,17 @@ where
|
||||
return std::result::Result::Ok(summary);
|
||||
},
|
||||
};
|
||||
let decode_request = crate::DecodeReplayRequest {
|
||||
campaign_id: crate::new_decode_campaign_id(),
|
||||
let decode_request = kb_pipeline::DecodeReplayRequest {
|
||||
campaign_id: kb_pipeline::new_decode_campaign_id(),
|
||||
selection,
|
||||
decoder_names: std::vec::Vec::new(),
|
||||
dispatch_policy: crate::DecodeDispatchPolicy::HighestPriority,
|
||||
dispatch_policy: kb_pipeline::DecodeDispatchPolicy::HighestPriority,
|
||||
max_concurrent_inputs: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
force_replay_all_matching: false,
|
||||
materialize_after_decode: request.materialize_after_decode,
|
||||
};
|
||||
let decode = match crate::execute_decode_replay(
|
||||
let decode = match kb_pipeline::execute_decode_replay(
|
||||
store,
|
||||
&decode_request,
|
||||
decoders,
|
||||
@@ -831,24 +834,25 @@ async fn execute_post_validation_backfill<S, O>(
|
||||
request: &crate::DevnetSystemTransferRequest,
|
||||
observer: &O,
|
||||
signature: &kb_lib::MdSignature,
|
||||
) -> kb_core::Result<crate::BackfillSummary>
|
||||
) -> kb_core::Result<kb_pipeline::BackfillSummary>
|
||||
where
|
||||
S: kb_store::RawTransactionStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
{
|
||||
let mut retry_index = 0_u32;
|
||||
loop {
|
||||
let backfill_request = crate::BackfillRequest {
|
||||
let backfill_request = kb_pipeline::BackfillRequest {
|
||||
role: request.query_role.clone(),
|
||||
commitment: "confirmed".to_string(),
|
||||
source: crate::BackfillSource::ExplicitSignatures(std::vec![signature.0.clone()]),
|
||||
source: kb_pipeline::BackfillSource::ExplicitSignatures(std::vec![signature.0.clone()]),
|
||||
page_size: 1,
|
||||
max_pages: 1,
|
||||
max_concurrent_requests: 1,
|
||||
max_retries: 0,
|
||||
};
|
||||
let backfill =
|
||||
match crate::execute_http_backfill(http_pool, store, &backfill_request, observer).await
|
||||
match kb_pipeline::execute_http_backfill(http_pool, store, &backfill_request, observer)
|
||||
.await
|
||||
{
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
@@ -875,7 +879,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn canonical_backfill_available(summary: &crate::BackfillSummary) -> bool {
|
||||
fn canonical_backfill_available(summary: &kb_pipeline::BackfillSummary) -> bool {
|
||||
return summary.failed == 0
|
||||
&& summary.missing == 0
|
||||
&& summary.candidates_completed == 1
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_memo_execution.rs
|
||||
// version: 1
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_memo_execution.rs
|
||||
// version: 2
|
||||
|
||||
//! Devnet SPL Memo v4 execution with canonical post-validation.
|
||||
|
||||
@@ -99,13 +99,13 @@ pub struct DevnetMemoExecutionSummary {
|
||||
/// Confirmation result when submitted.
|
||||
pub confirmation: std::option::Option<kb_lib::ExApiExecutionConfirmationResult>,
|
||||
/// Canonical hydration result for the exact signature.
|
||||
pub backfill: std::option::Option<crate::BackfillSummary>,
|
||||
pub backfill: std::option::Option<kb_pipeline::BackfillSummary>,
|
||||
/// Core extraction result for the exact signature.
|
||||
pub core_extraction: std::option::Option<crate::CoreExtractionSummary>,
|
||||
pub core_extraction: std::option::Option<kb_pipeline::CoreExtractionSummary>,
|
||||
/// First Memo decode and materialization replay.
|
||||
pub decode_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub decode_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Second replay proving that the same decoder version and input are idempotent.
|
||||
pub idempotence_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub idempotence_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Exact persisted transaction annotation rows for the submitted signature.
|
||||
pub annotations: std::vec::Vec<kb_store::MaterializedEventQueryRow>,
|
||||
/// Aggregated post-execution validation diagnostic.
|
||||
@@ -415,10 +415,10 @@ where
|
||||
summary.post_execution = std::option::Option::Some(diagnostic);
|
||||
return std::result::Result::Ok(summary);
|
||||
}
|
||||
let extraction = match crate::execute_core_extraction(
|
||||
let extraction = match kb_pipeline::execute_core_extraction(
|
||||
store,
|
||||
&crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
&kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
@@ -621,20 +621,22 @@ async fn hydrate_signature<S, O>(
|
||||
request: &crate::DevnetMemoExecutionRequest,
|
||||
observer: &O,
|
||||
signature: &kb_lib::MdSignature,
|
||||
) -> kb_core::Result<crate::BackfillSummary>
|
||||
) -> kb_core::Result<kb_pipeline::BackfillSummary>
|
||||
where
|
||||
S: kb_store::RawTransactionStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
{
|
||||
let mut retry = 0_u32;
|
||||
loop {
|
||||
let result = match crate::execute_http_backfill(
|
||||
let result = match kb_pipeline::execute_http_backfill(
|
||||
http_pool,
|
||||
store,
|
||||
&crate::BackfillRequest {
|
||||
&kb_pipeline::BackfillRequest {
|
||||
role: request.query_role.clone(),
|
||||
commitment: "confirmed".to_string(),
|
||||
source: crate::BackfillSource::ExplicitSignatures(std::vec![signature.0.clone()]),
|
||||
source: kb_pipeline::BackfillSource::ExplicitSignatures(std::vec![
|
||||
signature.0.clone()
|
||||
]),
|
||||
page_size: 1,
|
||||
max_pages: 1,
|
||||
max_concurrent_requests: 1,
|
||||
@@ -662,7 +664,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
fn canonical_available(summary: &crate::BackfillSummary) -> bool {
|
||||
fn canonical_available(summary: &kb_pipeline::BackfillSummary) -> bool {
|
||||
return summary.failed == 0
|
||||
&& summary.missing == 0
|
||||
&& summary.candidates_completed == 1
|
||||
@@ -683,7 +685,7 @@ async fn replay_memo<S, O>(
|
||||
decoders: &[std::sync::Arc<dyn kb_lib::DcApiInstructionDecoder>],
|
||||
materializers: &[std::sync::Arc<dyn kb_lib::MtApiEventMaterializer>],
|
||||
observer: &O,
|
||||
) -> kb_core::Result<crate::DecodeReplaySummary>
|
||||
) -> kb_core::Result<kb_pipeline::DecodeReplaySummary>
|
||||
where
|
||||
S: kb_store::DecodePipelineStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
@@ -709,13 +711,13 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return crate::execute_decode_replay(
|
||||
return kb_pipeline::execute_decode_replay(
|
||||
store,
|
||||
&crate::DecodeReplayRequest {
|
||||
campaign_id: crate::new_decode_campaign_id(),
|
||||
&kb_pipeline::DecodeReplayRequest {
|
||||
campaign_id: kb_pipeline::new_decode_campaign_id(),
|
||||
selection,
|
||||
decoder_names: std::vec::Vec::new(),
|
||||
dispatch_policy: crate::DecodeDispatchPolicy::HighestPriority,
|
||||
dispatch_policy: kb_pipeline::DecodeDispatchPolicy::HighestPriority,
|
||||
max_concurrent_inputs: 1,
|
||||
force_replay: if include_materialized_state {
|
||||
false
|
||||
@@ -732,7 +734,7 @@ where
|
||||
.await;
|
||||
}
|
||||
|
||||
fn decode_completed(summary: &crate::DecodeReplaySummary) -> bool {
|
||||
fn decode_completed(summary: &kb_pipeline::DecodeReplaySummary) -> bool {
|
||||
return summary.failed_inputs == 0
|
||||
&& summary.unmatched == 0
|
||||
&& !summary.cancelled
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_token2022_devnet_execution.rs
|
||||
// version: 1
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_token2022_devnet_execution.rs
|
||||
// version: 2
|
||||
|
||||
//! Devnet Token-2022 execution with stateful and canonical post-validation.
|
||||
|
||||
@@ -77,7 +77,7 @@ pub struct DevnetSplToken2022ExecutionSummary {
|
||||
/// Wallet balance observed before planning.
|
||||
pub balance_lamports: u64,
|
||||
/// Stateful readiness report produced before plan simulation.
|
||||
pub stateful_preflight: crate::Token2022PreflightReport,
|
||||
pub stateful_preflight: kb_pipeline::Token2022PreflightReport,
|
||||
/// Exact prepared Token plan.
|
||||
pub plan: kb_lib::ExApiPreparedExecutionPlan,
|
||||
/// Recent blockhash used by the exact transaction.
|
||||
@@ -91,13 +91,13 @@ pub struct DevnetSplToken2022ExecutionSummary {
|
||||
/// Confirmation result when submitted.
|
||||
pub confirmation: std::option::Option<kb_lib::ExApiExecutionConfirmationResult>,
|
||||
/// Canonical hydration result for the exact signature.
|
||||
pub backfill: std::option::Option<crate::BackfillSummary>,
|
||||
pub backfill: std::option::Option<kb_pipeline::BackfillSummary>,
|
||||
/// Core extraction result for the exact signature.
|
||||
pub core_extraction: std::option::Option<crate::CoreExtractionSummary>,
|
||||
pub core_extraction: std::option::Option<kb_pipeline::CoreExtractionSummary>,
|
||||
/// First Token decode and materialization replay.
|
||||
pub decode_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub decode_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Second replay proving idempotence for the same decoder version and input.
|
||||
pub idempotence_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub idempotence_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Exact materialized rows produced for the submitted Token transaction.
|
||||
pub materializations: std::vec::Vec<kb_store::MaterializedEventQueryRow>,
|
||||
/// Aggregated post-execution validation diagnostic.
|
||||
@@ -297,10 +297,10 @@ where
|
||||
summary.post_execution = std::option::Option::Some(diagnostic);
|
||||
return std::result::Result::Ok(summary);
|
||||
}
|
||||
let extraction = match crate::execute_core_extraction(
|
||||
let extraction = match kb_pipeline::execute_core_extraction(
|
||||
store,
|
||||
&crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
&kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
@@ -462,7 +462,8 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let readiness = match crate::inspect_token2022_preflight(http_pool, &preflight_request).await {
|
||||
let readiness =
|
||||
match kb_pipeline::inspect_token2022_preflight(http_pool, &preflight_request).await {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
@@ -617,7 +618,7 @@ where
|
||||
|
||||
fn preflight_request(
|
||||
request: &crate::DevnetSplToken2022ExecutionRequest,
|
||||
) -> kb_core::Result<crate::Token2022PreflightRequest> {
|
||||
) -> kb_core::Result<kb_pipeline::Token2022PreflightRequest> {
|
||||
let operation = match &request.operation {
|
||||
kb_lib::ExSplToken2022Operation::Instruction { value } => value.as_ref(),
|
||||
kb_lib::ExSplToken2022Operation::Batch { instructions: _ } => {
|
||||
@@ -756,11 +757,11 @@ fn preflight_request(
|
||||
));
|
||||
},
|
||||
}
|
||||
return std::result::Result::Ok(crate::Token2022PreflightRequest {
|
||||
return std::result::Result::Ok(kb_pipeline::Token2022PreflightRequest {
|
||||
query_role: request.query_role.clone(),
|
||||
min_context_slot: std::option::Option::None,
|
||||
max_accounts: crate::MAX_TOKEN2022_PREFLIGHT_ACCOUNTS,
|
||||
max_total_data_bytes: crate::MAX_TOKEN2022_PREFLIGHT_TOTAL_BYTES,
|
||||
max_accounts: kb_pipeline::MAX_TOKEN2022_PREFLIGHT_ACCOUNTS,
|
||||
max_total_data_bytes: kb_pipeline::MAX_TOKEN2022_PREFLIGHT_TOTAL_BYTES,
|
||||
requirements,
|
||||
elgamal_registry: std::option::Option::None,
|
||||
});
|
||||
@@ -780,8 +781,8 @@ fn mint_requirement(
|
||||
role: &str,
|
||||
mint: &kb_lib::MdPubkey,
|
||||
decimals: std::option::Option<u8>,
|
||||
) -> crate::Token2022PreflightRequirement {
|
||||
return crate::Token2022PreflightRequirement {
|
||||
) -> kb_pipeline::Token2022PreflightRequirement {
|
||||
return kb_pipeline::Token2022PreflightRequirement {
|
||||
role: role.to_string(),
|
||||
account: mint.clone(),
|
||||
kind: kb_lib::DcToken2022StateKind::Mint,
|
||||
@@ -790,7 +791,7 @@ fn mint_requirement(
|
||||
expected_owner: std::option::Option::None,
|
||||
expected_decimals: decimals,
|
||||
required_extensions: std::vec::Vec::new(),
|
||||
context: crate::Token2022StatefulContext::default(),
|
||||
context: kb_pipeline::Token2022StatefulContext::default(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -799,8 +800,8 @@ fn account_requirement(
|
||||
account: &kb_lib::MdPubkey,
|
||||
mint: &kb_lib::MdPubkey,
|
||||
owner: std::option::Option<kb_lib::MdPubkey>,
|
||||
) -> crate::Token2022PreflightRequirement {
|
||||
return crate::Token2022PreflightRequirement {
|
||||
) -> kb_pipeline::Token2022PreflightRequirement {
|
||||
return kb_pipeline::Token2022PreflightRequirement {
|
||||
role: role.to_string(),
|
||||
account: account.clone(),
|
||||
kind: kb_lib::DcToken2022StateKind::Account,
|
||||
@@ -809,7 +810,7 @@ fn account_requirement(
|
||||
expected_owner: owner,
|
||||
expected_decimals: std::option::Option::None,
|
||||
required_extensions: std::vec::Vec::new(),
|
||||
context: crate::Token2022StatefulContext::default(),
|
||||
context: kb_pipeline::Token2022StatefulContext::default(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_token2022_devnet_scenarios.rs
|
||||
// version: 4
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_token2022_devnet_scenarios.rs
|
||||
// version: 5
|
||||
|
||||
//! Stable Devnet validation scenarios required to close milestone 0.4.6.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_token2022_validation.rs
|
||||
// version: 4
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_token2022_validation.rs
|
||||
// version: 5
|
||||
|
||||
//! Machine-readable validation evidence contract for the Token-2022 milestone.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_token_execution.rs
|
||||
// version: 5
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_token_execution.rs
|
||||
// version: 6
|
||||
|
||||
//! Devnet classic SPL Token execution with stateful and canonical post-validation.
|
||||
|
||||
@@ -77,7 +77,7 @@ pub struct DevnetSplTokenExecutionSummary {
|
||||
/// Wallet balance observed before planning.
|
||||
pub balance_lamports: u64,
|
||||
/// Stateful readiness report produced before plan simulation.
|
||||
pub stateful_readiness: crate::SplTokenStatefulReadinessReport,
|
||||
pub stateful_readiness: kb_pipeline::SplTokenStatefulReadinessReport,
|
||||
/// Exact prepared Token plan.
|
||||
pub plan: kb_lib::ExApiPreparedExecutionPlan,
|
||||
/// Recent blockhash used by the exact transaction.
|
||||
@@ -91,13 +91,13 @@ pub struct DevnetSplTokenExecutionSummary {
|
||||
/// Confirmation result when submitted.
|
||||
pub confirmation: std::option::Option<kb_lib::ExApiExecutionConfirmationResult>,
|
||||
/// Canonical hydration result for the exact signature.
|
||||
pub backfill: std::option::Option<crate::BackfillSummary>,
|
||||
pub backfill: std::option::Option<kb_pipeline::BackfillSummary>,
|
||||
/// Core extraction result for the exact signature.
|
||||
pub core_extraction: std::option::Option<crate::CoreExtractionSummary>,
|
||||
pub core_extraction: std::option::Option<kb_pipeline::CoreExtractionSummary>,
|
||||
/// First Token decode and materialization replay.
|
||||
pub decode_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub decode_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Second replay proving idempotence for the same decoder version and input.
|
||||
pub idempotence_replay: std::option::Option<crate::DecodeReplaySummary>,
|
||||
pub idempotence_replay: std::option::Option<kb_pipeline::DecodeReplaySummary>,
|
||||
/// Exact materialized rows produced for the submitted Token transaction.
|
||||
pub materializations: std::vec::Vec<kb_store::MaterializedEventQueryRow>,
|
||||
/// Aggregated post-execution validation diagnostic.
|
||||
@@ -297,10 +297,10 @@ where
|
||||
summary.post_execution = std::option::Option::Some(diagnostic);
|
||||
return std::result::Result::Ok(summary);
|
||||
}
|
||||
let extraction = match crate::execute_core_extraction(
|
||||
let extraction = match kb_pipeline::execute_core_extraction(
|
||||
store,
|
||||
&crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
&kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: request.force_post_validation_replay,
|
||||
@@ -458,9 +458,9 @@ where
|
||||
),
|
||||
));
|
||||
}
|
||||
let readiness = match crate::inspect_spl_token_stateful_readiness(
|
||||
let readiness = match kb_pipeline::inspect_spl_token_stateful_readiness(
|
||||
http_pool,
|
||||
&crate::SplTokenStatefulReadinessRequest {
|
||||
&kb_pipeline::SplTokenStatefulReadinessRequest {
|
||||
query_role: request.query_role.clone(),
|
||||
cluster: kb_lib::ExApiExecutionCluster::Devnet,
|
||||
operation: request.operation.clone(),
|
||||
@@ -471,7 +471,7 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
if readiness.status != crate::SplTokenStatefulReadinessStatus::Ready {
|
||||
if readiness.status != kb_pipeline::SplTokenStatefulReadinessStatus::Ready {
|
||||
return std::result::Result::Err(kb_core::Error::new(
|
||||
"execution_spl_token_stateful_blocked",
|
||||
failed_readiness_message(&readiness),
|
||||
@@ -800,7 +800,7 @@ fn single_requires_materialization(operation: &kb_lib::ExSplClassicTokenSingleOp
|
||||
}
|
||||
|
||||
fn failed_readiness_message(
|
||||
readiness: &crate::SplTokenStatefulReadinessReport,
|
||||
readiness: &kb_pipeline::SplTokenStatefulReadinessReport,
|
||||
) -> std::string::String {
|
||||
let failures = readiness
|
||||
.checks
|
||||
@@ -840,20 +840,22 @@ pub(crate) async fn hydrate_signature<S, O>(
|
||||
post_validation_max_retries: u32,
|
||||
observer: &O,
|
||||
signature: &kb_lib::MdSignature,
|
||||
) -> kb_core::Result<crate::BackfillSummary>
|
||||
) -> kb_core::Result<kb_pipeline::BackfillSummary>
|
||||
where
|
||||
S: kb_store::RawTransactionStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
{
|
||||
let mut retry = 0_u32;
|
||||
loop {
|
||||
let result = match crate::execute_http_backfill(
|
||||
let result = match kb_pipeline::execute_http_backfill(
|
||||
http_pool,
|
||||
store,
|
||||
&crate::BackfillRequest {
|
||||
&kb_pipeline::BackfillRequest {
|
||||
role: query_role.to_string(),
|
||||
commitment: "confirmed".to_string(),
|
||||
source: crate::BackfillSource::ExplicitSignatures(std::vec![signature.0.clone()]),
|
||||
source: kb_pipeline::BackfillSource::ExplicitSignatures(std::vec![
|
||||
signature.0.clone()
|
||||
]),
|
||||
page_size: 1,
|
||||
max_pages: 1,
|
||||
max_concurrent_requests: 1,
|
||||
@@ -881,7 +883,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn canonical_available(summary: &crate::BackfillSummary) -> bool {
|
||||
pub(crate) fn canonical_available(summary: &kb_pipeline::BackfillSummary) -> bool {
|
||||
return summary.failed == 0
|
||||
&& summary.missing == 0
|
||||
&& summary.candidates_completed == 1
|
||||
@@ -903,7 +905,7 @@ pub(crate) async fn replay_program<S, O>(
|
||||
decoders: &[std::sync::Arc<dyn kb_lib::DcApiInstructionDecoder>],
|
||||
materializers: &[std::sync::Arc<dyn kb_lib::MtApiEventMaterializer>],
|
||||
observer: &O,
|
||||
) -> kb_core::Result<crate::DecodeReplaySummary>
|
||||
) -> kb_core::Result<kb_pipeline::DecodeReplaySummary>
|
||||
where
|
||||
S: kb_store::DecodePipelineStore + Sync,
|
||||
O: crate::SolanaExecutionObserver,
|
||||
@@ -929,13 +931,13 @@ where
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return crate::execute_decode_replay(
|
||||
return kb_pipeline::execute_decode_replay(
|
||||
store,
|
||||
&crate::DecodeReplayRequest {
|
||||
campaign_id: crate::new_decode_campaign_id(),
|
||||
&kb_pipeline::DecodeReplayRequest {
|
||||
campaign_id: kb_pipeline::new_decode_campaign_id(),
|
||||
selection,
|
||||
decoder_names: std::vec::Vec::new(),
|
||||
dispatch_policy: crate::DecodeDispatchPolicy::HighestPriority,
|
||||
dispatch_policy: kb_pipeline::DecodeDispatchPolicy::HighestPriority,
|
||||
max_concurrent_inputs: 1,
|
||||
force_replay: if include_materialized_state {
|
||||
false
|
||||
@@ -952,7 +954,7 @@ where
|
||||
.await;
|
||||
}
|
||||
|
||||
pub(crate) fn decode_completed(summary: &crate::DecodeReplaySummary) -> bool {
|
||||
pub(crate) fn decode_completed(summary: &kb_pipeline::DecodeReplaySummary) -> bool {
|
||||
return summary.failed_inputs == 0
|
||||
&& summary.unmatched == 0
|
||||
&& !summary.cancelled
|
||||
@@ -1133,7 +1135,7 @@ mod tests {
|
||||
};
|
||||
assert_eq!(
|
||||
summary.stateful_readiness.status,
|
||||
crate::SplTokenStatefulReadinessStatus::Ready
|
||||
kb_pipeline::SplTokenStatefulReadinessStatus::Ready
|
||||
);
|
||||
assert!(summary.simulation.success, "{:#?}", summary.simulation);
|
||||
return;
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/solana_token_lifecycle.rs
|
||||
// version: 4
|
||||
// file: kb-pipeline-demo-scenarios/src/solana_token_lifecycle.rs
|
||||
// version: 5
|
||||
|
||||
//! Controlled Devnet lifecycle for freshly prepared classic SPL Token accounts.
|
||||
|
||||
@@ -616,10 +616,10 @@ where
|
||||
"confirmed lifecycle predecessor is unavailable for canonical recovery",
|
||||
));
|
||||
}
|
||||
let extraction = match crate::execute_core_extraction(
|
||||
let extraction = match kb_pipeline::execute_core_extraction(
|
||||
store,
|
||||
&crate::CoreExtractionRequest {
|
||||
source: crate::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
&kb_pipeline::CoreExtractionRequest {
|
||||
source: kb_pipeline::CoreExtractionSource::Signatures(std::vec![signature.0.clone()]),
|
||||
limit: 1,
|
||||
max_concurrent_extractions: 1,
|
||||
force_replay: false,
|
||||
@@ -1308,8 +1308,8 @@ fn incomplete_step(index: usize, operation_code: &str, stage: &str) -> kb_core::
|
||||
mod tests {
|
||||
struct LifecycleTestObserver;
|
||||
|
||||
impl crate::BackfillObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &crate::BackfillProgressEvent) {
|
||||
impl kb_pipeline::BackfillObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::BackfillProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1318,8 +1318,8 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::CoreExtractionObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &crate::CoreExtractionProgressEvent) {
|
||||
impl kb_pipeline::CoreExtractionObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::CoreExtractionProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1328,8 +1328,8 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
impl crate::DecodeReplayObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &crate::DecodeReplayProgressEvent) {
|
||||
impl kb_pipeline::DecodeReplayObserver for LifecycleTestObserver {
|
||||
fn on_progress(&self, _event: &kb_pipeline::DecodeReplayProgressEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# file: kb-pipeline/Cargo.toml
|
||||
# version: 12
|
||||
# version: 13
|
||||
|
||||
[package]
|
||||
name = "kb-pipeline"
|
||||
@@ -19,7 +19,6 @@ kb-lib = { path = "../kb-lib" }
|
||||
kb-onchain-transport = { path = "../kb-onchain-transport" }
|
||||
kb-program-ids = { path = "../kb-program-ids" }
|
||||
kb-store = { path = "../kb-store" }
|
||||
kb-wallet = { path = "../kb-wallet" }
|
||||
serde.workspace = true
|
||||
serde_json.workspace = true
|
||||
solana-address-lookup-table-interface.workspace = true
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-pipeline/src/lib.rs
|
||||
// version: 15
|
||||
// version: 16
|
||||
|
||||
#![forbid(unsafe_code)]
|
||||
#![deny(unreachable_pub)]
|
||||
@@ -12,36 +12,17 @@ mod constants;
|
||||
mod core_extraction;
|
||||
mod decode_replay;
|
||||
mod plan;
|
||||
mod solana_ata_execution;
|
||||
mod solana_ata_stateful;
|
||||
mod solana_elgamal_registry_stateful;
|
||||
mod solana_execution;
|
||||
mod solana_memo_execution;
|
||||
mod solana_stateful;
|
||||
mod solana_token2022_correlation;
|
||||
mod solana_token2022_crypto_preflight;
|
||||
mod solana_token2022_devnet_execution;
|
||||
mod solana_token2022_devnet_scenarios;
|
||||
mod solana_token2022_execution_orchestration;
|
||||
mod solana_token2022_preflight;
|
||||
mod solana_token2022_proof_orchestration;
|
||||
mod solana_token2022_stateful;
|
||||
mod solana_token2022_validation;
|
||||
mod solana_token_execution;
|
||||
mod solana_token_lifecycle;
|
||||
mod solana_token_stateful;
|
||||
|
||||
/// Emits one execution progress event for specialized pipeline orchestrators.
|
||||
pub(crate) use self::solana_execution::emit;
|
||||
/// Rejects one execution stage when the observer reports cancellation.
|
||||
pub(crate) use self::solana_execution::ensure_not_cancelled;
|
||||
/// Loads the persistent wallet configured by one execution profile.
|
||||
pub(crate) use self::solana_execution::load_profile_wallet;
|
||||
/// Formats one failed simulation without discarding runtime diagnostics.
|
||||
pub(crate) use self::solana_execution::simulation_failure_message;
|
||||
/// Formats safety violations for one denied execution plan.
|
||||
pub(crate) use self::solana_execution::violation_message;
|
||||
|
||||
/// Address category used by one targeted backfill campaign.
|
||||
pub use self::backfill::BackfillAddressKind;
|
||||
/// Chronological direction relative to one anchor signature.
|
||||
@@ -110,14 +91,6 @@ pub use self::decode_replay::new_decode_campaign_id;
|
||||
pub use self::plan::PipelineStage;
|
||||
/// Replay selection scope.
|
||||
pub use self::plan::ReplayScope;
|
||||
/// Complete request for one Devnet Associated Token Account execution.
|
||||
pub use self::solana_ata_execution::DevnetSplAssociatedTokenAccountExecutionRequest;
|
||||
/// Complete result of one Devnet Associated Token Account execution.
|
||||
pub use self::solana_ata_execution::DevnetSplAssociatedTokenAccountExecutionSummary;
|
||||
/// Executes one Devnet Associated Token Account simulation or authorized submission.
|
||||
pub use self::solana_ata_execution::execute_devnet_spl_associated_token_account;
|
||||
/// Simulates one Devnet Associated Token Account operation after stateful preflight.
|
||||
pub use self::solana_ata_execution::simulate_devnet_spl_associated_token_account;
|
||||
/// Stateful invariants observed after one confirmed Associated Token Account execution.
|
||||
pub use self::solana_ata_stateful::SplAssociatedTokenAccountPostExecutionReport;
|
||||
/// One machine-readable Associated Token Account stateful check.
|
||||
@@ -148,26 +121,6 @@ pub use self::solana_elgamal_registry_stateful::materialize_elgamal_registry_acc
|
||||
pub use self::solana_elgamal_registry_stateful::materialize_elgamal_registry_stateful_snapshot;
|
||||
/// Migrated read_elgamal_registry_stateful_snapshot contract.
|
||||
pub use self::solana_elgamal_registry_stateful::read_elgamal_registry_stateful_snapshot;
|
||||
/// Complete request for one bounded System Program transfer on Devnet.
|
||||
pub use self::solana_execution::DevnetSystemTransferRequest;
|
||||
/// Summary returned by one bounded System Program transfer execution.
|
||||
pub use self::solana_execution::DevnetSystemTransferSummary;
|
||||
/// No-op observer suitable for CLI tools and opt-in integration tests.
|
||||
pub use self::solana_execution::NoopSolanaExecutionObserver;
|
||||
/// Observer notified during Solana execution orchestration.
|
||||
pub use self::solana_execution::SolanaExecutionObserver;
|
||||
/// Progress event emitted by Solana execution orchestration.
|
||||
pub use self::solana_execution::SolanaExecutionProgressEvent;
|
||||
/// Severity of one Solana execution progress event.
|
||||
pub use self::solana_execution::SolanaExecutionProgressLevel;
|
||||
/// Executes one bounded System Program transfer on Devnet.
|
||||
pub use self::solana_execution::execute_devnet_system_transfer;
|
||||
/// Complete request for one SPL Memo v4 Devnet execution.
|
||||
pub use self::solana_memo_execution::DevnetMemoExecutionRequest;
|
||||
/// Complete result of one SPL Memo v4 Devnet execution and post-validation.
|
||||
pub use self::solana_memo_execution::DevnetMemoExecutionSummary;
|
||||
/// Executes one SPL Memo v4 Devnet simulation or explicitly authorized submission.
|
||||
pub use self::solana_memo_execution::execute_devnet_memo;
|
||||
/// One machine-readable native Solana stateful readiness check.
|
||||
pub use self::solana_stateful::SolanaCoreStatefulCheck;
|
||||
/// One contextual fact measured during native Solana stateful readiness.
|
||||
@@ -180,38 +133,6 @@ pub use self::solana_stateful::SolanaCoreStatefulReadinessRequest;
|
||||
pub use self::solana_stateful::SolanaCoreStatefulReadinessStatus;
|
||||
/// Inspects state required before simulating one native Solana operation.
|
||||
pub use self::solana_stateful::inspect_solana_core_stateful_readiness;
|
||||
/// Complete request for one Devnet classic SPL Token execution.
|
||||
pub use self::solana_token_execution::DevnetSplTokenExecutionRequest;
|
||||
/// Complete result of one Devnet classic SPL Token execution.
|
||||
pub use self::solana_token_execution::DevnetSplTokenExecutionSummary;
|
||||
/// Canonical hydration availability helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::canonical_available;
|
||||
/// Decode completion helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::decode_completed;
|
||||
/// Executes one Devnet classic SPL Token simulation or authorized submission.
|
||||
pub use self::solana_token_execution::execute_devnet_spl_token;
|
||||
/// Canonical signature hydration helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::hydrate_signature;
|
||||
/// Targeted program replay helper shared by Token lifecycle orchestration.
|
||||
pub(crate) use self::solana_token_execution::replay_program;
|
||||
/// Simulates one Devnet classic SPL Token operation after stateful preflight.
|
||||
pub use self::solana_token_execution::simulate_devnet_spl_token;
|
||||
/// Complete request to prepare raw accounts for one Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationRequest;
|
||||
/// One prepared raw account step.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationStep;
|
||||
/// Summary of raw-account preparation for one lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecyclePreparationSummary;
|
||||
/// Complete request for one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleRequest;
|
||||
/// Summary of one lifecycle operation step.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleStepSummary;
|
||||
/// Complete controlled lifecycle summary.
|
||||
pub use self::solana_token_lifecycle::DevnetSplTokenLifecycleSummary;
|
||||
/// Executes one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::execute_devnet_spl_token_lifecycle;
|
||||
/// Prepares raw accounts for one controlled Devnet SPL Token lifecycle.
|
||||
pub use self::solana_token_lifecycle::prepare_devnet_spl_token_lifecycle_accounts;
|
||||
/// One machine-readable classic SPL Token stateful check.
|
||||
pub use self::solana_token_stateful::SplTokenStatefulCheck;
|
||||
/// One contextual classic SPL Token stateful fact.
|
||||
@@ -244,22 +165,6 @@ pub use self::solana_token2022_crypto_preflight::Token2022ProofContextRequiremen
|
||||
pub use self::solana_token2022_crypto_preflight::ZK_PROOF_CONTEXT_META_BYTES;
|
||||
/// Inspects bounded Token-2022 cryptographic proof contexts.
|
||||
pub use self::solana_token2022_crypto_preflight::inspect_token2022_cryptographic_preflight;
|
||||
/// Complete request for one Devnet Token-2022 execution.
|
||||
pub use self::solana_token2022_devnet_execution::DevnetSplToken2022ExecutionRequest;
|
||||
/// Complete result of one Devnet Token-2022 execution.
|
||||
pub use self::solana_token2022_devnet_execution::DevnetSplToken2022ExecutionSummary;
|
||||
/// Executes one Devnet Token-2022 simulation or authorized submission.
|
||||
pub use self::solana_token2022_devnet_execution::execute_devnet_spl_token2022;
|
||||
/// Simulates one Devnet Token-2022 operation after stateful preflight.
|
||||
pub use self::solana_token2022_devnet_execution::simulate_devnet_spl_token2022;
|
||||
/// Stable category of one independent Devnet validation scenario.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationFamily;
|
||||
/// Current implementation status of one Devnet validation scenario.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationImplementationStatus;
|
||||
/// One independent Devnet validation scenario exposed to applications.
|
||||
pub use self::solana_token2022_devnet_scenarios::DevnetSplValidationScenario;
|
||||
/// Returns the complete ordered Devnet scenario inventory.
|
||||
pub use self::solana_token2022_devnet_scenarios::devnet_spl_validation_scenarios;
|
||||
/// Maximum number of distinct signers accepted by one Token-2022 execution envelope.
|
||||
pub use self::solana_token2022_execution_orchestration::MAX_TOKEN2022_EXECUTION_SIGNERS;
|
||||
/// One explicit stateful postcondition retained after Token-2022 execution.
|
||||
@@ -316,28 +221,6 @@ pub use self::solana_token2022_stateful::materialize_token2022_account_info_resu
|
||||
pub use self::solana_token2022_stateful::materialize_token2022_stateful_snapshot;
|
||||
/// Migrated read_token2022_stateful_snapshot contract.
|
||||
pub use self::solana_token2022_stateful::read_token2022_stateful_snapshot;
|
||||
/// Maximum number of evidence records accepted in one validation report.
|
||||
pub use self::solana_token2022_validation::MAX_TOKEN2022_VALIDATION_EVIDENCE;
|
||||
/// Required validation environment for one Token-2022 scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationEnvironment;
|
||||
/// One bounded proof attached to a Token-2022 validation scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationEvidence;
|
||||
/// Machine-readable Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationMatrix;
|
||||
/// One scenario declared by the canonical validation matrix.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationMatrixScenario;
|
||||
/// Complete bounded Token-2022 validation report.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationReport;
|
||||
/// One declared Token-2022 validation scenario and its observed evidence.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationScenario;
|
||||
/// Exact status of one Token-2022 validation scenario.
|
||||
pub use self::solana_token2022_validation::Token2022ValidationStatus;
|
||||
/// Loads and validates the canonical Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::load_token2022_validation_matrix;
|
||||
/// Validates one Token-2022 validation matrix.
|
||||
pub use self::solana_token2022_validation::validate_token2022_validation_matrix;
|
||||
/// Validates one bounded Token-2022 milestone report.
|
||||
pub use self::solana_token2022_validation::validate_token2022_validation_report;
|
||||
|
||||
/// Canonical tracing target for pipeline orchestration.
|
||||
pub(crate) use self::constants::TRACING_TARGET;
|
||||
|
||||
Reference in New Issue
Block a user