v0.1.0-pre.061
This commit is contained in:
@@ -178,7 +178,7 @@ pub(crate) struct DemoBackfillSummaryPayload {
|
||||
/// Number of source attempts.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) attempts: u64,
|
||||
/// Whether the operator cancelled the campaign.
|
||||
/// Whether the operator canceled the campaign.
|
||||
pub(crate) cancelled: bool,
|
||||
/// Optional cursor for continuing an older-history scan.
|
||||
pub(crate) resume_before_signature: std::option::Option<std::string::String>,
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
// file: kb-app-demo-desktop/src/demo_core_extraction.rs
|
||||
// version: 10
|
||||
// version: 11
|
||||
|
||||
//! Tauri commands and UI payloads for canonical transaction to core extraction.
|
||||
|
||||
use tauri::Emitter; // rust-rules: trait-import
|
||||
use ts_rs::TS; // rust-rules: derive-import
|
||||
|
||||
/// One registered program offered as a non-blocking core extraction suggestion.
|
||||
#[derive(Clone, Debug, serde::Serialize, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(
|
||||
export,
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_core_extraction/DemoCoreExtractionProgramOption.ts"
|
||||
)]
|
||||
pub(crate) struct DemoCoreExtractionProgramOption {
|
||||
/// Stable registry code.
|
||||
pub(crate) code: std::string::String,
|
||||
/// Canonical Solana program id.
|
||||
pub(crate) program_id: std::string::String,
|
||||
}
|
||||
|
||||
/// Initial options shown by the core extraction demo.
|
||||
#[derive(Clone, Debug, serde::Serialize, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
@@ -22,6 +36,8 @@ pub(crate) struct DemoCoreExtractionOptionsPayload {
|
||||
pub(crate) default_max_concurrent_extractions: u32,
|
||||
/// Whether one extraction campaign is currently running.
|
||||
pub(crate) running: bool,
|
||||
/// Registered program ids offered without restricting free text entry.
|
||||
pub(crate) programs: std::vec::Vec<crate::DemoCoreExtractionProgramOption>,
|
||||
}
|
||||
|
||||
/// UI request for one bounded core extraction campaign.
|
||||
@@ -166,6 +182,15 @@ pub(crate) fn demo_core_extraction_options_payload(
|
||||
default_limit: 100,
|
||||
default_max_concurrent_extractions: 4,
|
||||
running: state.demo_core_extraction_running().load(std::sync::atomic::Ordering::Acquire),
|
||||
programs: kb_program_ids::registered_program_ids()
|
||||
.iter()
|
||||
.map(|entry| {
|
||||
return crate::DemoCoreExtractionProgramOption {
|
||||
code: entry.code().to_string(),
|
||||
program_id: entry.program_id().to_string(),
|
||||
};
|
||||
})
|
||||
.collect(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_decode_replay.rs
|
||||
// version: 30
|
||||
// version: 32
|
||||
|
||||
//! Tauri commands and UI payloads for contextual instruction decode replay.
|
||||
|
||||
@@ -143,9 +143,12 @@ pub(crate) struct DemoDecodeProcessorSummaryPayload {
|
||||
/// Unsupported input count.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) unsupported: u64,
|
||||
/// Failed input count.
|
||||
/// Explicit decoder failure count.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) failed: u64,
|
||||
/// Orchestration, storage or other processing error count.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) processing_errors: u64,
|
||||
/// Materialized output count.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) materialized_outputs: u64,
|
||||
@@ -181,9 +184,12 @@ pub(crate) struct DemoDecodeReplaySummaryPayload {
|
||||
/// Number never started after cancellation.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) not_started: u64,
|
||||
/// Number of failed contextual inputs.
|
||||
/// Number of inputs returning an explicit decoder failure.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) failed_inputs: u64,
|
||||
/// Number of inputs interrupted by orchestration, storage or processing errors.
|
||||
#[ts(type = "number")]
|
||||
pub(crate) processing_error_inputs: u64,
|
||||
/// Whether cancellation was observed.
|
||||
pub(crate) cancelled: bool,
|
||||
/// Per-processor counters.
|
||||
@@ -544,6 +550,7 @@ pub(crate) fn demo_decode_replay_summary_payload(
|
||||
unmatched: summary.unmatched,
|
||||
not_started: summary.not_started,
|
||||
failed_inputs: summary.failed_inputs,
|
||||
processing_error_inputs: summary.processing_error_inputs,
|
||||
cancelled: summary.cancelled,
|
||||
processors: summary
|
||||
.processors
|
||||
@@ -558,6 +565,7 @@ pub(crate) fn demo_decode_replay_summary_payload(
|
||||
ignored: processor.ignored,
|
||||
unsupported: processor.unsupported,
|
||||
failed: processor.failed,
|
||||
processing_errors: processor.processing_errors,
|
||||
materialized_outputs: processor.materialized_outputs,
|
||||
materialization_refused: processor.materialization_refused,
|
||||
};
|
||||
@@ -733,7 +741,7 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn native_memo_token2022_elgamal_classic_token_and_ata_decoders_are_registered() {
|
||||
fn native_memo_token_2022_elgamal_classic_token_and_ata_decoders_are_registered() {
|
||||
let decoders = crate::available_decoders();
|
||||
assert_eq!(decoders.len(), 7);
|
||||
let mut names = decoders
|
||||
@@ -748,7 +756,7 @@ mod tests {
|
||||
"spl_elgamal_registry".to_string(),
|
||||
"spl_memo".to_string(),
|
||||
"spl_token".to_string(),
|
||||
"spl_token2022".to_string(),
|
||||
"spl_token_2022".to_string(),
|
||||
];
|
||||
expected_names.sort();
|
||||
assert_eq!(names, expected_names);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_execution_solana_core.rs
|
||||
// version: 5
|
||||
// version: 6
|
||||
|
||||
//! Tauri adapter for bounded Solana Core execution on Devnet.
|
||||
|
||||
@@ -187,9 +187,12 @@ pub(crate) struct DemoExecutionSolanaCoreSummaryPayload {
|
||||
/// Contextual decode inputs completed after submission.
|
||||
#[ts(type = "number | null")]
|
||||
pub(crate) decode_completed: std::option::Option<u64>,
|
||||
/// Contextual decode input failures after submission.
|
||||
/// Explicit contextual decoder failures after submission.
|
||||
#[ts(type = "number | null")]
|
||||
pub(crate) decode_failed_inputs: std::option::Option<u64>,
|
||||
/// Contextual decode processing or storage errors after submission.
|
||||
#[ts(type = "number | null")]
|
||||
pub(crate) decode_processing_error_inputs: std::option::Option<u64>,
|
||||
/// Pretty JSON representation of the exact execution plan.
|
||||
pub(crate) plan_json: std::string::String,
|
||||
/// Pretty JSON representation of the simulation result.
|
||||
@@ -421,6 +424,8 @@ pub(crate) fn demo_execution_solana_core_summary_payload(
|
||||
let decode_completed = summary.decode_replay.as_ref().map(|value| return value.completed);
|
||||
let decode_failed_inputs =
|
||||
summary.decode_replay.as_ref().map(|value| return value.failed_inputs);
|
||||
let decode_processing_error_inputs =
|
||||
summary.decode_replay.as_ref().map(|value| return value.processing_error_inputs);
|
||||
let diagnostics_value = serde_json::json!({
|
||||
"airdropConfirmation": summary.airdrop_confirmation.as_ref(),
|
||||
"confirmation": summary.confirmation.as_ref(),
|
||||
@@ -449,6 +454,7 @@ pub(crate) fn demo_execution_solana_core_summary_payload(
|
||||
"completed": value.completed,
|
||||
"unmatched": value.unmatched,
|
||||
"failedInputs": value.failed_inputs,
|
||||
"processingErrorInputs": value.processing_error_inputs,
|
||||
"cancelled": value.cancelled
|
||||
});
|
||||
})
|
||||
@@ -477,6 +483,7 @@ pub(crate) fn demo_execution_solana_core_summary_payload(
|
||||
core_extracted,
|
||||
decode_completed,
|
||||
decode_failed_inputs,
|
||||
decode_processing_error_inputs,
|
||||
plan_json,
|
||||
simulation_json,
|
||||
diagnostics_json,
|
||||
@@ -507,9 +514,11 @@ pub(crate) fn demo_execution_solana_core_memo_summary_payload(
|
||||
summary.post_execution.as_ref().is_some_and(|value| return value.materialized);
|
||||
let idempotence_validated = summary.idempotence_replay.as_ref().is_some_and(|replay| {
|
||||
return replay.failed_inputs == 0
|
||||
&& replay.processing_error_inputs == 0
|
||||
&& !replay.cancelled
|
||||
&& replay.processors.iter().all(|processor| {
|
||||
return processor.failed == 0
|
||||
&& processor.processing_errors == 0
|
||||
&& processor.materialized_outputs == 0
|
||||
&& processor.materialization_refused == 0;
|
||||
})
|
||||
@@ -546,6 +555,7 @@ pub(crate) fn demo_execution_solana_core_memo_summary_payload(
|
||||
"selected": value.selected,
|
||||
"completed": value.completed,
|
||||
"failedInputs": value.failed_inputs,
|
||||
"processingErrorInputs": value.processing_error_inputs,
|
||||
"processors": value.processors.iter().map(|processor| {
|
||||
return serde_json::json!({
|
||||
"name": processor.processor_name,
|
||||
@@ -553,6 +563,7 @@ pub(crate) fn demo_execution_solana_core_memo_summary_payload(
|
||||
"decoded": processor.decoded,
|
||||
"skipped": processor.skipped,
|
||||
"failed": processor.failed,
|
||||
"processingErrors": processor.processing_errors,
|
||||
"materializedOutputs": processor.materialized_outputs,
|
||||
"materializationRefused": processor.materialization_refused
|
||||
});
|
||||
@@ -565,6 +576,7 @@ pub(crate) fn demo_execution_solana_core_memo_summary_payload(
|
||||
"selected": value.selected,
|
||||
"completed": value.completed,
|
||||
"failedInputs": value.failed_inputs,
|
||||
"processingErrorInputs": value.processing_error_inputs,
|
||||
"processors": value.processors.iter().map(|processor| {
|
||||
return serde_json::json!({
|
||||
"name": processor.processor_name,
|
||||
@@ -572,6 +584,7 @@ pub(crate) fn demo_execution_solana_core_memo_summary_payload(
|
||||
"decoded": processor.decoded,
|
||||
"skipped": processor.skipped,
|
||||
"failed": processor.failed,
|
||||
"processingErrors": processor.processing_errors,
|
||||
"materializedOutputs": processor.materialized_outputs,
|
||||
"materializationRefused": processor.materialization_refused
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_spl_ata.rs
|
||||
// version: 4
|
||||
// version: 7
|
||||
|
||||
//! Thin Tauri adapter for ATA execution, derivation and lifecycle journal reads.
|
||||
|
||||
@@ -19,7 +19,7 @@ pub(crate) struct DemoExecutionSplAtaRequest {
|
||||
pub(crate) wallet_owner: std::string::String,
|
||||
/// Mint account.
|
||||
pub(crate) mint: std::string::String,
|
||||
/// `classic` or `token2022`.
|
||||
/// `classic` or `token_2022`.
|
||||
pub(crate) token_program: std::string::String,
|
||||
/// `create` or `create_idempotent`.
|
||||
pub(crate) mode: std::string::String,
|
||||
@@ -43,7 +43,7 @@ pub(crate) struct DemoSplAtaDerivationRequest {
|
||||
pub(crate) profile_name: std::string::String,
|
||||
/// Mint account.
|
||||
pub(crate) mint: std::string::String,
|
||||
/// `classic` or `token2022`.
|
||||
/// `classic` or `token_2022`.
|
||||
pub(crate) token_program: std::string::String,
|
||||
}
|
||||
|
||||
@@ -185,8 +185,8 @@ pub(crate) fn parse_token_program(
|
||||
) -> std::result::Result<kb_lib::ExSplAssociatedTokenProgram, std::string::String> {
|
||||
return match value.trim() {
|
||||
"classic" => std::result::Result::Ok(kb_lib::ExSplAssociatedTokenProgram::Classic),
|
||||
"token2022" => std::result::Result::Ok(kb_lib::ExSplAssociatedTokenProgram::Token2022),
|
||||
_ => std::result::Result::Err("Token Program must be classic or token2022".to_string()),
|
||||
"token_2022" => std::result::Result::Ok(kb_lib::ExSplAssociatedTokenProgram::Token2022),
|
||||
_ => std::result::Result::Err("Token Program must be classic or token_2022".to_string()),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -247,8 +247,10 @@ pub(crate) fn demo_spl_ata_summary_payload(
|
||||
});
|
||||
let idempotence_validated = summary.idempotence_replay.as_ref().is_some_and(|replay| {
|
||||
return replay.failed_inputs == 0
|
||||
&& replay.processing_error_inputs == 0
|
||||
&& replay.processors.iter().all(|processor| {
|
||||
return processor.failed == 0
|
||||
&& processor.processing_errors == 0
|
||||
&& processor.materialized_outputs == 0
|
||||
&& processor.materialization_refused == 0;
|
||||
});
|
||||
@@ -289,6 +291,7 @@ pub(crate) fn demo_spl_ata_summary_payload(
|
||||
"completed": value.completed,
|
||||
"unmatched": value.unmatched,
|
||||
"failedInputs": value.failed_inputs,
|
||||
"processingErrorInputs": value.processing_error_inputs,
|
||||
"cancelled": value.cancelled
|
||||
});
|
||||
}),
|
||||
@@ -299,6 +302,7 @@ pub(crate) fn demo_spl_ata_summary_payload(
|
||||
"completed": value.completed,
|
||||
"unmatched": value.unmatched,
|
||||
"failedInputs": value.failed_inputs,
|
||||
"processingErrorInputs": value.processing_error_inputs,
|
||||
"cancelled": value.cancelled,
|
||||
"materializedOutputs": value.processors.iter().map(|processor| {
|
||||
return processor.materialized_outputs;
|
||||
@@ -397,15 +401,15 @@ pub(crate) fn journal_row(row: kb_store::MaterializedEventQueryRow) -> crate::De
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
#[test]
|
||||
fn classic_and_token2022_derivations_are_distinct_and_canonical() {
|
||||
fn classic_and_token_2022_derivations_are_distinct_and_canonical() {
|
||||
let wallet = kb_program_ids::SYSTEM_PROGRAM_ID;
|
||||
let mint = "So11111111111111111111111111111111111111112";
|
||||
let classic = crate::derive_ata(wallet, mint, kb_program_ids::SPL_TOKEN_PROGRAM_ID)
|
||||
.unwrap_or_else(|error| panic!("classic derivation failed: {error}"));
|
||||
let token2022 = crate::derive_ata(wallet, mint, kb_program_ids::SPL_TOKEN2022_PROGRAM_ID)
|
||||
let token_2022 = crate::derive_ata(wallet, mint, kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID)
|
||||
.unwrap_or_else(|error| panic!("Token-2022 derivation failed: {error}"));
|
||||
assert_eq!(classic, "aqxoAhCwpy3oB1BpNw9hL1HdLYLgPpbPjzxDrrQj3Fs");
|
||||
assert_eq!(token2022, "2sZUUBGq1i6aE47ZoxCaCW89jmYm2EXLPPmNMgMDXHMS");
|
||||
assert_eq!(token_2022, "2sZUUBGq1i6aE47ZoxCaCW89jmYm2EXLPPmNMgMDXHMS");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_spl_token.rs
|
||||
// version: 2
|
||||
// version: 3
|
||||
|
||||
//! Thin Tauri adapter for classic SPL Token execution and materialized journals.
|
||||
|
||||
@@ -172,9 +172,11 @@ pub(crate) fn demo_spl_token_summary_payload(
|
||||
let decode_replayed = post_execution.is_some_and(|value| return value.decode_replayed);
|
||||
let idempotence_validated = summary.idempotence_replay.as_ref().is_some_and(|replay| {
|
||||
return replay.failed_inputs == 0
|
||||
&& replay.processing_error_inputs == 0
|
||||
&& !replay.cancelled
|
||||
&& replay.processors.iter().all(|processor| {
|
||||
return processor.failed == 0
|
||||
&& processor.processing_errors == 0
|
||||
&& processor.materialized_outputs == 0
|
||||
&& processor.materialization_refused == 0;
|
||||
});
|
||||
@@ -248,6 +250,7 @@ fn replay_diagnostics(summary: &kb_pipeline::DecodeReplaySummary) -> serde_json:
|
||||
"selected": summary.selected,
|
||||
"completed": summary.completed,
|
||||
"failedInputs": summary.failed_inputs,
|
||||
"processingErrorInputs": summary.processing_error_inputs,
|
||||
"cancelled": summary.cancelled,
|
||||
"processors": summary.processors.iter().map(|processor| {
|
||||
return serde_json::json!({
|
||||
@@ -256,6 +259,7 @@ fn replay_diagnostics(summary: &kb_pipeline::DecodeReplaySummary) -> serde_json:
|
||||
"decoded": processor.decoded,
|
||||
"skipped": processor.skipped,
|
||||
"failed": processor.failed,
|
||||
"processingErrors": processor.processing_errors,
|
||||
"materializedOutputs": processor.materialized_outputs,
|
||||
"materializationRefused": processor.materialization_refused
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_spl_token2022.rs
|
||||
// version: 4
|
||||
// file: kb-app-demo-desktop/src/demo_spl_token_2022.rs
|
||||
// version: 6
|
||||
|
||||
//! Thin Tauri adapter for independent public Token-2022 Devnet validation scenarios.
|
||||
|
||||
@@ -10,7 +10,7 @@ use ts_rs::TS; // rust-rules: derive-import
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(
|
||||
export,
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token2022/DemoSplToken2022FixturePayload.ts"
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token_2022/DemoSplToken2022FixturePayload.ts"
|
||||
)]
|
||||
pub(crate) struct DemoSplToken2022FixturePayload {
|
||||
/// Fixture file used by the application.
|
||||
@@ -42,7 +42,7 @@ pub(crate) struct DemoSplToken2022FixturePayload {
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(
|
||||
export,
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token2022/DemoExecutionSplToken2022Request.ts"
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token_2022/DemoExecutionSplToken2022Request.ts"
|
||||
)]
|
||||
pub(crate) struct DemoExecutionSplToken2022Request {
|
||||
/// Selected Devnet profile.
|
||||
@@ -78,7 +78,7 @@ pub(crate) struct DemoExecutionSplToken2022Request {
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(
|
||||
export,
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token2022/DemoExecutionSplToken2022SummaryPayload.ts"
|
||||
export_to = "../frontend/ts/bindings/kb_app_demo_desktop/demo_spl_token_2022/DemoExecutionSplToken2022SummaryPayload.ts"
|
||||
)]
|
||||
pub(crate) struct DemoExecutionSplToken2022SummaryPayload {
|
||||
/// Stable scenario identifier.
|
||||
@@ -137,14 +137,14 @@ pub(crate) fn operation_from_request(
|
||||
multisig_signers: std::vec::Vec::new(),
|
||||
};
|
||||
let value = match request.scenario_id.trim() {
|
||||
"token2022_mint_to_checked" => kb_lib::ExSplTokenSingleOperation::MintToChecked {
|
||||
"token_2022_mint_to_checked" => kb_lib::ExSplTokenSingleOperation::MintToChecked {
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
destination: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
authority,
|
||||
amount: kb_lib::ExSplTokenAmount(request.amount_raw.trim().to_string()),
|
||||
decimals: request.decimals,
|
||||
},
|
||||
"token2022_transfer_checked" => kb_lib::ExSplTokenSingleOperation::TransferChecked {
|
||||
"token_2022_transfer_checked" => kb_lib::ExSplTokenSingleOperation::TransferChecked {
|
||||
source: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
destination: kb_lib::MdPubkey(request.destination.trim().to_string()),
|
||||
@@ -152,7 +152,7 @@ pub(crate) fn operation_from_request(
|
||||
amount: kb_lib::ExSplTokenAmount(request.amount_raw.trim().to_string()),
|
||||
decimals: request.decimals,
|
||||
},
|
||||
"token2022_approve_checked" => kb_lib::ExSplTokenSingleOperation::ApproveChecked {
|
||||
"token_2022_approve_checked" => kb_lib::ExSplTokenSingleOperation::ApproveChecked {
|
||||
source: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
delegate: kb_lib::MdPubkey(request.delegate.trim().to_string()),
|
||||
@@ -160,28 +160,28 @@ pub(crate) fn operation_from_request(
|
||||
amount: kb_lib::ExSplTokenAmount(request.amount_raw.trim().to_string()),
|
||||
decimals: request.decimals,
|
||||
},
|
||||
"token2022_revoke" => kb_lib::ExSplTokenSingleOperation::Revoke {
|
||||
"token_2022_revoke" => kb_lib::ExSplTokenSingleOperation::Revoke {
|
||||
source: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
authority,
|
||||
},
|
||||
"token2022_burn_checked" => kb_lib::ExSplTokenSingleOperation::BurnChecked {
|
||||
"token_2022_burn_checked" => kb_lib::ExSplTokenSingleOperation::BurnChecked {
|
||||
source: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
authority,
|
||||
amount: kb_lib::ExSplTokenAmount(request.amount_raw.trim().to_string()),
|
||||
decimals: request.decimals,
|
||||
},
|
||||
"token2022_freeze_account" => kb_lib::ExSplTokenSingleOperation::FreezeAccount {
|
||||
"token_2022_freeze_account" => kb_lib::ExSplTokenSingleOperation::FreezeAccount {
|
||||
account: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
authority: freeze_authority,
|
||||
},
|
||||
"token2022_thaw_account" => kb_lib::ExSplTokenSingleOperation::ThawAccount {
|
||||
"token_2022_thaw_account" => kb_lib::ExSplTokenSingleOperation::ThawAccount {
|
||||
account: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
mint: kb_lib::MdPubkey(request.mint.trim().to_string()),
|
||||
authority: freeze_authority,
|
||||
},
|
||||
"token2022_close_destination" => kb_lib::ExSplTokenSingleOperation::CloseAccount {
|
||||
"token_2022_close_destination" => kb_lib::ExSplTokenSingleOperation::CloseAccount {
|
||||
account: kb_lib::MdPubkey(request.source.trim().to_string()),
|
||||
destination: kb_lib::MdPubkey(request.destination.trim().to_string()),
|
||||
authority,
|
||||
@@ -197,7 +197,7 @@ pub(crate) fn operation_from_request(
|
||||
});
|
||||
}
|
||||
|
||||
pub(crate) fn demo_spl_token2022_summary_payload(
|
||||
pub(crate) fn demo_spl_token_2022_summary_payload(
|
||||
scenario_id: std::string::String,
|
||||
operation: std::string::String,
|
||||
summary: kb_pipeline_demo_scenarios::DevnetSplToken2022ExecutionSummary,
|
||||
@@ -216,9 +216,11 @@ pub(crate) fn demo_spl_token2022_summary_payload(
|
||||
let decode_replayed = post_execution.is_some_and(|value| return value.decode_replayed);
|
||||
let idempotence_validated = summary.idempotence_replay.as_ref().is_some_and(|replay| {
|
||||
return replay.failed_inputs == 0
|
||||
&& replay.processing_error_inputs == 0
|
||||
&& !replay.cancelled
|
||||
&& replay.processors.iter().all(|processor| {
|
||||
return processor.failed == 0
|
||||
&& processor.processing_errors == 0
|
||||
&& processor.materialized_outputs == 0
|
||||
&& processor.materialization_refused == 0;
|
||||
});
|
||||
@@ -340,6 +342,7 @@ fn decode_replay_summary_json(summary: &kb_pipeline::DecodeReplaySummary) -> ser
|
||||
"ignored": processor.ignored,
|
||||
"unsupported": processor.unsupported,
|
||||
"failed": processor.failed,
|
||||
"processingErrors": processor.processing_errors,
|
||||
"materializedOutputs": processor.materialized_outputs,
|
||||
"materializationRefused": processor.materialization_refused
|
||||
});
|
||||
@@ -354,6 +357,7 @@ fn decode_replay_summary_json(summary: &kb_pipeline::DecodeReplaySummary) -> ser
|
||||
"unmatched": summary.unmatched,
|
||||
"notStarted": summary.not_started,
|
||||
"failedInputs": summary.failed_inputs,
|
||||
"processingErrorInputs": summary.processing_error_inputs,
|
||||
"cancelled": summary.cancelled,
|
||||
"processors": processors,
|
||||
"startedAt": summary.started_at,
|
||||
@@ -384,14 +388,14 @@ mod tests {
|
||||
#[test]
|
||||
fn every_public_scenario_builds_one_typed_operation() {
|
||||
for scenario in [
|
||||
"token2022_mint_to_checked",
|
||||
"token2022_transfer_checked",
|
||||
"token2022_approve_checked",
|
||||
"token2022_revoke",
|
||||
"token2022_burn_checked",
|
||||
"token2022_freeze_account",
|
||||
"token2022_thaw_account",
|
||||
"token2022_close_destination",
|
||||
"token_2022_mint_to_checked",
|
||||
"token_2022_transfer_checked",
|
||||
"token_2022_approve_checked",
|
||||
"token_2022_revoke",
|
||||
"token_2022_burn_checked",
|
||||
"token_2022_freeze_account",
|
||||
"token_2022_thaw_account",
|
||||
"token_2022_close_destination",
|
||||
] {
|
||||
assert!(crate::operation_from_request(&request(scenario)).is_ok());
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_sql_common.rs
|
||||
// version: 10
|
||||
// version: 11
|
||||
|
||||
//! Shared SQL demo helpers and serializable payloads.
|
||||
|
||||
@@ -138,7 +138,10 @@ pub(crate) async fn initialize_postgres_schema_for_startup(
|
||||
tracing::debug!(target: crate::TRACING_TARGET, backend = profile.database.backend.as_str(), "database backend is not postgres; skip SQL schema initialization");
|
||||
return;
|
||||
}
|
||||
let options_result = postgres_store_options_from_profile(profile, false);
|
||||
let options_result = postgres_store_options_from_profile(
|
||||
profile,
|
||||
profile.database.postgres.auto_initialize_schema,
|
||||
);
|
||||
let mut options = match options_result {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/demo_ws.rs
|
||||
// version: 16
|
||||
// version: 17
|
||||
|
||||
//! Standard Solana WebSocket demo commands backed by `kb_onchain_transport::WsSession`.
|
||||
|
||||
@@ -922,7 +922,7 @@ mod tests {
|
||||
);
|
||||
let program = super::build_standard_ws_request(
|
||||
"programSubscribe",
|
||||
std::option::Option::Some(kb_program_ids::SPL_TOKEN2022_PROGRAM_ID.to_string()),
|
||||
std::option::Option::Some(kb_program_ids::SPL_TOKEN_2022_PROGRAM_ID.to_string()),
|
||||
std::option::Option::None,
|
||||
std::option::Option::Some(r#"{"encoding":"jsonParsed"}"#.to_string()),
|
||||
);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/lib.rs
|
||||
// version: 11
|
||||
// version: 13
|
||||
|
||||
//! Tauri desktop demo application for `khadhroony-bot3`.
|
||||
|
||||
@@ -18,7 +18,7 @@ mod demo_execution_spl;
|
||||
mod demo_http;
|
||||
mod demo_spl_ata;
|
||||
mod demo_spl_token;
|
||||
mod demo_spl_token2022;
|
||||
mod demo_spl_token_2022;
|
||||
mod demo_sql_common;
|
||||
mod demo_sql_diag;
|
||||
mod demo_sql_pg_core;
|
||||
@@ -66,6 +66,8 @@ pub(crate) use self::demo_core_extraction::DemoCoreExtractionObserver;
|
||||
/// Internal demo core extraction item.
|
||||
pub(crate) use self::demo_core_extraction::DemoCoreExtractionOptionsPayload;
|
||||
/// Internal demo core extraction item.
|
||||
pub(crate) use self::demo_core_extraction::DemoCoreExtractionProgramOption;
|
||||
/// Internal demo core extraction item.
|
||||
pub(crate) use self::demo_core_extraction::DemoCoreExtractionProgressPayload;
|
||||
/// Internal demo core extraction item.
|
||||
pub(crate) use self::demo_core_extraction::DemoCoreExtractionRequest;
|
||||
@@ -95,7 +97,7 @@ pub(crate) use self::demo_decode_replay::DemoDecodeReplayDecoderOption;
|
||||
pub(crate) use self::demo_decode_replay::DemoDecodeReplayObserver;
|
||||
/// Internal demo decode replay item.
|
||||
pub(crate) use self::demo_decode_replay::DemoDecodeReplayOptionsPayload;
|
||||
/// One known program suggested by the free-form Program ID field.
|
||||
/// Internal demo decode replay program option.
|
||||
pub(crate) use self::demo_decode_replay::DemoDecodeReplayProgramOption;
|
||||
/// Internal demo decode replay item.
|
||||
pub(crate) use self::demo_decode_replay::DemoDecodeReplayProgressPayload;
|
||||
@@ -220,17 +222,17 @@ pub(crate) use self::demo_spl_token::payload_matches;
|
||||
/// Loads a bounded, typed journal of committed classic SPL Token projections.
|
||||
pub(crate) use self::demo_spl_token::validate_journal_request;
|
||||
/// Request for one independent public Token-2022 Devnet scenario.
|
||||
pub(crate) use self::demo_spl_token2022::DemoExecutionSplToken2022Request;
|
||||
pub(crate) use self::demo_spl_token_2022::DemoExecutionSplToken2022Request;
|
||||
/// UI-safe result of one public Token-2022 Devnet orchestration.
|
||||
pub(crate) use self::demo_spl_token2022::DemoExecutionSplToken2022SummaryPayload;
|
||||
pub(crate) use self::demo_spl_token_2022::DemoExecutionSplToken2022SummaryPayload;
|
||||
/// Public values loaded from one persisted Token-2022 validation fixture.
|
||||
pub(crate) use self::demo_spl_token2022::DemoSplToken2022FixturePayload;
|
||||
pub(crate) use self::demo_spl_token_2022::DemoSplToken2022FixturePayload;
|
||||
/// ????
|
||||
pub(crate) use self::demo_spl_token2022::demo_spl_token2022_summary_payload;
|
||||
pub(crate) use self::demo_spl_token_2022::demo_spl_token_2022_summary_payload;
|
||||
/// ????
|
||||
pub(crate) use self::demo_spl_token2022::operation_from_request;
|
||||
pub(crate) use self::demo_spl_token_2022::operation_from_request;
|
||||
/// ????
|
||||
pub(crate) use self::demo_spl_token2022::parse_fixture;
|
||||
pub(crate) use self::demo_spl_token_2022::parse_fixture;
|
||||
/// UI-safe SQL table diagnostic snapshot.
|
||||
pub(crate) use self::demo_sql_common::DemoSqlTableSnapshot;
|
||||
/// Connects to the configured PostgreSQL store.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: kb-app-demo-desktop/src/tauri.rs
|
||||
// version: 15
|
||||
// version: 17
|
||||
|
||||
//! Tauri runtime assembly and private command wrappers.
|
||||
|
||||
@@ -76,8 +76,8 @@ pub fn run() -> kb_core::Result<()> {
|
||||
demo_execution_spl_validation_scenarios,
|
||||
demo_execution_spl_token_execute,
|
||||
demo_spl_token_journal,
|
||||
demo_execution_spl_token2022_execute,
|
||||
demo_spl_token2022_fixture,
|
||||
demo_execution_spl_token_2022_execute,
|
||||
demo_spl_token_2022_fixture,
|
||||
demo_spl_ata_derive,
|
||||
demo_execution_spl_ata_execute,
|
||||
demo_spl_ata_journal,
|
||||
@@ -424,6 +424,7 @@ async fn demo_decode_replay_execute(
|
||||
unmatched = summary.unmatched,
|
||||
not_started = summary.not_started,
|
||||
failed_inputs = summary.failed_inputs,
|
||||
processing_error_inputs = summary.processing_error_inputs,
|
||||
cancelled = summary.cancelled,
|
||||
processors = ?summary.processors,
|
||||
"contextual decode replay command completed"
|
||||
@@ -1326,13 +1327,13 @@ fn demo_execution_spl_validation_scenarios()
|
||||
label: scenario.label,
|
||||
family: match scenario.family {
|
||||
kb_pipeline_demo_scenarios::DevnetSplValidationFamily::Token2022Public => {
|
||||
"token2022_public".to_string()
|
||||
"token_2022_public".to_string()
|
||||
},
|
||||
kb_pipeline_demo_scenarios::DevnetSplValidationFamily::ElGamalRegistry => {
|
||||
"elgamal_registry".to_string()
|
||||
},
|
||||
kb_pipeline_demo_scenarios::DevnetSplValidationFamily::Token2022Confidential => {
|
||||
"token2022_confidential".to_string()
|
||||
"token_2022_confidential".to_string()
|
||||
},
|
||||
},
|
||||
operation_code: scenario.operation_code,
|
||||
@@ -1712,7 +1713,7 @@ async fn demo_spl_ata_journal(
|
||||
|
||||
/// Executes one public Token-2022 simulation or explicitly authorized Devnet submission.
|
||||
#[tauri::command]
|
||||
async fn demo_execution_spl_token2022_execute(
|
||||
async fn demo_execution_spl_token_2022_execute(
|
||||
app_handle: tauri::AppHandle,
|
||||
state: tauri::State<'_, crate::AppState>,
|
||||
request: crate::DemoExecutionSplToken2022Request,
|
||||
@@ -1775,7 +1776,7 @@ async fn demo_execution_spl_token2022_execute(
|
||||
cancel_requested: state.demo_execution_solana_core_cancel_requested(),
|
||||
};
|
||||
let workspace_root = crate::workspace_root_dir();
|
||||
let summary = match kb_pipeline_demo_scenarios::execute_devnet_spl_token2022(
|
||||
let summary = match kb_pipeline_demo_scenarios::execute_devnet_spl_token_2022(
|
||||
&http_pool,
|
||||
&store,
|
||||
&profile,
|
||||
@@ -1790,7 +1791,7 @@ async fn demo_execution_spl_token2022_execute(
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error.to_string()),
|
||||
};
|
||||
return std::result::Result::Ok(crate::demo_spl_token2022_summary_payload(
|
||||
return std::result::Result::Ok(crate::demo_spl_token_2022_summary_payload(
|
||||
request.scenario_id,
|
||||
operation_code,
|
||||
summary,
|
||||
@@ -1799,7 +1800,7 @@ async fn demo_execution_spl_token2022_execute(
|
||||
|
||||
/// Loads public Token-2022 fixture values without reading private key bytes.
|
||||
#[tauri::command]
|
||||
fn demo_spl_token2022_fixture(
|
||||
fn demo_spl_token_2022_fixture(
|
||||
state: tauri::State<'_, crate::AppState>,
|
||||
profile_name: std::string::String,
|
||||
) -> std::result::Result<crate::DemoSplToken2022FixturePayload, std::string::String> {
|
||||
@@ -1813,7 +1814,7 @@ fn demo_spl_token2022_fixture(
|
||||
} else {
|
||||
crate::workspace_root_dir().join(configured)
|
||||
};
|
||||
let fixture_path = wallet_dir.join("spl_token2022_validation").join("fixture.env");
|
||||
let fixture_path = wallet_dir.join("spl_token_2022_validation").join("fixture.env");
|
||||
let contents = match std::fs::read_to_string(&fixture_path) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => {
|
||||
|
||||
Reference in New Issue
Block a user