490 lines
27 KiB
Rust
490 lines
27 KiB
Rust
// file: crates/ksp-worker-raw-transaction-ingest-lib/tests/cross_layer_completeness.rs
|
|
// version: 3
|
|
|
|
//! Cross-layer completeness and security canaries through `0.3.14-pre.013`.
|
|
|
|
fn dependency_names(manifest: &str) -> std::vec::Vec<&str> {
|
|
let mut section = "";
|
|
let mut names = std::vec::Vec::new();
|
|
for line in manifest.lines() {
|
|
let trimmed = line.trim();
|
|
if trimmed.starts_with('[') && trimmed.ends_with(']') {
|
|
section = trimmed;
|
|
continue;
|
|
}
|
|
if section != "[dependencies]" || trimmed.is_empty() || trimmed.starts_with('#') {
|
|
continue;
|
|
}
|
|
let name = match trimmed.split_once('=') {
|
|
std::option::Option::Some((name, _)) => name.trim().trim_end_matches(".workspace"),
|
|
std::option::Option::None => continue,
|
|
};
|
|
names.push(name);
|
|
}
|
|
names.sort_unstable();
|
|
return names;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_12_pre_010_dependency_firewall_is_exact_across_transport_worker_common_raw_store() {
|
|
let transport = dependency_names(include_str!("../../ksp-onchain-transport-lib/Cargo.toml"));
|
|
let worker = dependency_names(include_str!("../Cargo.toml"));
|
|
let common_raw = dependency_names(include_str!("../../ksp-raw-transaction-lib/Cargo.toml"));
|
|
let store_api = dependency_names(include_str!("../../ksp-store-api/Cargo.toml"));
|
|
let store = dependency_names(include_str!("../../ksp-store-lib/Cargo.toml"));
|
|
assert_eq!(
|
|
transport,
|
|
std::vec![
|
|
"futures-util",
|
|
"http",
|
|
"ksp-core-lib",
|
|
"ksp-logging-lib",
|
|
"reqwest",
|
|
"serde",
|
|
"serde_json",
|
|
"tokio",
|
|
"tokio-tungstenite",
|
|
"tonic",
|
|
"tonic-prost",
|
|
"yellowstone-grpc-proto",
|
|
]
|
|
);
|
|
assert_eq!(
|
|
worker,
|
|
std::vec![
|
|
"ksp-core-lib",
|
|
"ksp-logging-lib",
|
|
"ksp-onchain-transport-lib",
|
|
"ksp-raw-transaction-lib",
|
|
"ksp-store-lib",
|
|
"ksp-worker-api",
|
|
"sha2",
|
|
"tokio",
|
|
]
|
|
);
|
|
assert_eq!(common_raw, std::vec!["base64", "ksp-core-lib", "ksp-store-api", "serde_json", "sha2"]);
|
|
assert_eq!(store_api, std::vec!["ksp-core-lib"]);
|
|
assert_eq!(store, std::vec!["ksp-logging-lib", "ksp-store-api", "ksp-store-postgres-lib"]);
|
|
for forbidden in ["ksp-config-lib", "ksp-job-api", "ksp-job-backfill-lib", "ksp-store-lib", "ksp-worker-api", "ksp-worker-raw-transaction-ingest-lib"] {
|
|
assert!(!transport.contains(&forbidden), "Transport crossed upward dependency boundary: {forbidden}");
|
|
}
|
|
for forbidden in [
|
|
"ksp-config-lib",
|
|
"ksp-job-api",
|
|
"ksp-job-backfill-lib",
|
|
"ksp-store-api",
|
|
"ksp-store-postgres-lib",
|
|
"reqwest",
|
|
"tonic",
|
|
"yellowstone-grpc-proto",
|
|
] {
|
|
assert!(!worker.contains(&forbidden), "Worker crossed direct lower/backend dependency boundary: {forbidden}");
|
|
}
|
|
for forbidden in [
|
|
"ksp-config-lib",
|
|
"ksp-job-api",
|
|
"ksp-job-backfill-lib",
|
|
"ksp-onchain-transport-lib",
|
|
"ksp-store-lib",
|
|
"ksp-store-postgres-lib",
|
|
"ksp-worker-api",
|
|
] {
|
|
assert!(!common_raw.contains(&forbidden), "Common RAW crossed dependency boundary: {forbidden}");
|
|
}
|
|
for forbidden in ["ksp-config-lib", "ksp-onchain-transport-lib", "ksp-raw-transaction-lib", "ksp-store-lib", "ksp-store-postgres-lib", "ksp-worker-api"] {
|
|
assert!(!store_api.contains(&forbidden), "Store API crossed dependency boundary: {forbidden}");
|
|
}
|
|
for forbidden in ["ksp-config-lib", "ksp-job-api", "ksp-job-backfill-lib", "ksp-onchain-transport-lib", "ksp-raw-transaction-lib", "ksp-worker-api"] {
|
|
assert!(!store.contains(&forbidden), "Store facade crossed dependency boundary: {forbidden}");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_12_pre_010_legacy_v0_fixture_matrix_is_exact_across_transport_worker_and_common_raw() {
|
|
let worker = include_str!("../unit_tests/runtime_resources.rs");
|
|
let common_raw_wire = include_str!("../../ksp-raw-transaction-lib/unit_tests/wire.rs");
|
|
let transport = include_str!("../../ksp-onchain-transport-lib/unit_tests/rpc_transactions.rs");
|
|
for required in [
|
|
"pre_004_observed_get_transaction_closes_signal_to_common_raw_ingress_with_composite_provenance",
|
|
"pre_004_finalized_hydration_preserves_request_and_provenance_commitment",
|
|
"pre_004_v0_null_and_omitted_wire_fields_preserve_common_raw_semantics",
|
|
r#"\"version\":\"legacy\""#,
|
|
r#"\"version\":0"#,
|
|
] {
|
|
assert!(worker.contains(required), "Worker Legacy/V0 fixture missing: {required}");
|
|
}
|
|
for required in [
|
|
"LEGACY_GOLDEN_BASE64",
|
|
"V0_GOLDEN_BASE64",
|
|
"pre_006_legacy_v0_and_v1_wire_goldens_are_exact",
|
|
"RawSolanaMessageVersion::Legacy",
|
|
"RawSolanaMessageVersion::V0",
|
|
] {
|
|
assert!(common_raw_wire.contains(required), "Common RAW Legacy/V0 golden missing: {required}");
|
|
}
|
|
for required in [
|
|
"confirmed_transaction_fixture_preserves_meta_version_and_transaction_index_states",
|
|
"typed_get_transaction_modern_covers_all_agave_v4_2_1_encoding_labels_and_response_shapes",
|
|
"SolanaTransactionVersion::Legacy",
|
|
] {
|
|
assert!(transport.contains(required), "Transport getTransaction fixture missing: {required}");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_12_pre_010_redaction_scanner_matrix_is_present_across_all_layers() {
|
|
let transport_subscribe = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let transport_unary = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_unary.rs");
|
|
let worker = include_str!("hardening.rs");
|
|
let common_raw = include_str!("../../ksp-raw-transaction-lib/unit_tests/canonical.rs");
|
|
let store_api = include_str!("../../ksp-store-api/tests/security_hardening.rs");
|
|
let store = include_str!("../../ksp-store-lib/tests/hardening_completeness.rs");
|
|
assert!(transport_subscribe.contains("yellowstone_subscribe_debug_omits_filter_names_and_future_payloads"));
|
|
assert!(transport_unary.contains("yellowstone_remote_status_does_not_copy_message_details_or_metadata"));
|
|
for required in [
|
|
"pre_010_debug_and_settings_errors_redact_worker_identity_and_invalid_values",
|
|
"v0_3_12_pre_003_private_signal_debug_and_shape_do_not_expose_signature_filters_or_payload",
|
|
"v0_3_12_pre_004_hydration_provenance_and_remote_material_are_bounded_and_redacted",
|
|
"v0_3_12_pre_008_reconnect_projection_is_source_neutral_bounded_and_contains_no_replay_material",
|
|
"v0_3_12_pre_009_hydration_retry_ownership_and_no_orphan_cleanup_are_explicit",
|
|
] {
|
|
assert!(worker.contains(required), "Worker security scanner missing: {required}");
|
|
}
|
|
assert!(common_raw.contains("pre_002_material_and_wire_debug_do_not_render_transaction_or_meta_material"));
|
|
assert!(store_api.contains("pre_007_raw_debug_surfaces_do_not_render_payload_hash_signature_or_account_bytes"));
|
|
assert!(store.contains("pre_009_secret_canary_never_crosses_settings_or_pre_io_error_debug"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_12_pre_010_public_roots_keep_implementation_modules_private() {
|
|
let roots = [
|
|
("transport", include_str!("../../ksp-onchain-transport-lib/src/lib.rs")),
|
|
("worker", include_str!("../src/lib.rs")),
|
|
("common_raw", include_str!("../../ksp-raw-transaction-lib/src/lib.rs")),
|
|
("store_api", include_str!("../../ksp-store-api/src/lib.rs")),
|
|
("store", include_str!("../../ksp-store-lib/src/lib.rs")),
|
|
];
|
|
for (layer, root) in roots {
|
|
assert!(!root.contains("pub mod "), "public implementation module leaked from {layer}");
|
|
}
|
|
let worker = include_str!("../src/lib.rs");
|
|
for line in worker.lines() {
|
|
let trimmed = line.trim();
|
|
if !trimmed.starts_with("pub use ") {
|
|
continue;
|
|
}
|
|
for forbidden in [
|
|
"RawTransactionAdmission",
|
|
"RawTransactionIngress",
|
|
"RawTransactionIngestPersistencePort",
|
|
"JoinHandle",
|
|
"JoinSet",
|
|
"HttpTransportPool",
|
|
"SolanaYellowstoneGrpcSubscribeSession",
|
|
] {
|
|
assert!(!trimmed.contains(forbidden), "Worker implementation type leaked publicly: {forbidden}");
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_13_pre_012_all_five_live_source_families_share_one_worker_common_raw_store_pipeline() {
|
|
let transport_root = include_str!("../../ksp-onchain-transport-lib/src/lib.rs");
|
|
let transport_http_transactions = include_str!("../../ksp-onchain-transport-lib/src/rpc_transactions.rs");
|
|
let transport_http_blocks = include_str!("../../ksp-onchain-transport-lib/src/rpc_blocks.rs");
|
|
let transport_ws_protocol = include_str!("../../ksp-onchain-transport-lib/src/ws_protocol_session.rs");
|
|
let transport_grpc_stream = include_str!("../../ksp-onchain-transport-lib/src/grpc_stream.rs");
|
|
let worker_resources = include_str!("../src/runtime_resources.rs");
|
|
let worker_persistence = include_str!("../src/persistence.rs");
|
|
let common_raw_root = include_str!("../../ksp-raw-transaction-lib/src/lib.rs");
|
|
let store_root = include_str!("../../ksp-store-lib/src/lib.rs");
|
|
let store = include_str!("../../ksp-store-lib/src/store.rs");
|
|
for required in [
|
|
"HeliusTransaction(crate::RawTransactionIngestHeliusTransactionSource)",
|
|
"HttpBlockPolling(crate::RawTransactionIngestHttpBlockPollingSource)",
|
|
"StandardBlock(crate::RawTransactionIngestStandardBlockSource)",
|
|
"StandardLogs(crate::RawTransactionIngestStandardLogsSource)",
|
|
"Yellowstone(crate::RawTransactionIngestYellowstoneSource)",
|
|
"RawTransactionIngestGlobalHydrationRegistry",
|
|
"run_live_sources",
|
|
"RawTransactionIngress",
|
|
] {
|
|
assert!(worker_resources.contains(required), "pre.012 Worker source/pipeline contract missing: {required}");
|
|
}
|
|
for required in ["persist_raw_transaction_ingest_converged_acquisition", "RawTransactionIngestPersistenceConvergence", "record_observation"] {
|
|
assert!(worker_persistence.contains(required), "pre.012 Worker persistence contract missing: {required}");
|
|
}
|
|
for required in ["SolanaStandardWsSession", "HeliusLaserStreamWsSession"] {
|
|
assert!(transport_ws_protocol.contains(required), "pre.012 WS Transport facade missing: {required}");
|
|
}
|
|
assert!(transport_grpc_stream.contains("pub struct SolanaYellowstoneGrpcSubscribeSession"));
|
|
assert!(transport_http_transactions.contains("pub async fn get_transaction_observed("));
|
|
assert!(transport_http_blocks.contains("pub async fn get_block_observed("));
|
|
assert!(transport_http_blocks.contains("pub async fn get_blocks_with_limit("));
|
|
for required in ["RawTransactionAcquisition", "RawSolanaMessageVersion", "RawSolanaTransactionWire"] {
|
|
assert!(common_raw_root.contains(required), "pre.012 Common RAW contract missing: {required}");
|
|
}
|
|
for required in ["RawTransactionWrite", "RawTransactionObservationWrite", "RawPayload"] {
|
|
assert!(store_root.contains(required), "pre.012 Store facade contract missing: {required}");
|
|
}
|
|
for required in ["persist_raw_transaction_acquisition", "record_raw_transaction_observation"] {
|
|
assert!(store.contains(required), "pre.012 Store dispatch contract missing: {required}");
|
|
}
|
|
assert!(!transport_root.contains("ksp_raw_transaction_lib"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_13_pre_012_legacy_v0_v1_is_proven_from_transport_through_worker_common_raw_to_store() {
|
|
let transport_grpc = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let transport_blocks = include_str!("../../ksp-onchain-transport-lib/unit_tests/rpc_blocks.rs");
|
|
let worker = include_str!("../unit_tests/runtime_resources.rs");
|
|
let worker_resources = include_str!("../src/runtime_resources.rs");
|
|
let worker_persistence = include_str!("../src/persistence.rs");
|
|
let common_raw_wire = include_str!("../../ksp-raw-transaction-lib/unit_tests/wire.rs");
|
|
let common_raw_canonical = include_str!("../../ksp-raw-transaction-lib/unit_tests/canonical.rs");
|
|
let store_api = include_str!("../../ksp-store-api/tests/public_api.rs");
|
|
let store = include_str!("../../ksp-store-lib/src/store.rs");
|
|
assert!(transport_grpc.contains("yellowstone_transaction_update_decodes_current_storage_wire_including_v1_config_and_meta"));
|
|
assert!(transport_blocks.contains("typed_get_block_modern_full_config_preserves_rich_wire_and_simd_fields"));
|
|
for required in [
|
|
"v0_3_13_pre_004_standard_block_qualifies_legacy_v0_v1_and_rejects_ambiguous_or_future_versions",
|
|
"v0_3_13_pre_004_legacy_v0_v1_block_materials_are_direct_common_raw_with_exact_version_and_index",
|
|
"v0_3_13_pre_006_http_block_polling_qualifies_legacy_v0_v1_and_rejects_ambiguous_or_future_versions",
|
|
"RawSolanaMessageVersion::Legacy",
|
|
"RawSolanaMessageVersion::V0",
|
|
"RawSolanaMessageVersion::V1",
|
|
] {
|
|
assert!(worker.contains(required), "pre.012 Worker Legacy/V0/V1 proof missing: {required}");
|
|
}
|
|
assert!(worker_resources.contains("SolanaGetTransactionConfig::new"));
|
|
assert!(worker_resources.contains("std::option::Option::Some(1),"));
|
|
for required in [
|
|
"pre_006_legacy_v0_and_v1_wire_goldens_are_exact",
|
|
"pre_006_v1_structural_guards_reject_alt_duplicates_and_missing_config",
|
|
"RawSolanaMessageVersion::V1",
|
|
] {
|
|
assert!(common_raw_wire.contains(required), "pre.012 Common RAW V1 proof missing: {required}");
|
|
}
|
|
assert!(common_raw_canonical.contains("pre_002_canonical_raw_v1_golden_bytes_and_hash_are_exact"));
|
|
for required in ["block_time", "content_hash", "format_id", "format_version", "slot"] {
|
|
assert!(worker_persistence.contains(required), "pre.012 canonical Store identity field missing: {required}");
|
|
}
|
|
assert!(store_api.contains("public_pre_003_raw_transaction_and_observation_are_constructible_from_crate_root"));
|
|
assert!(store_api.contains("RawPayload::try_new(format, 1"));
|
|
assert!(store.contains("persist_raw_transaction_acquisition"));
|
|
assert!(store.contains("record_raw_transaction_observation"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_13_pre_012_yellowstone_non_regression_covers_identity_v1_reconnect_gap_and_worker_hydration() {
|
|
let transport_subscribe = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let transport_stream = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_stream.rs");
|
|
let transport_public = include_str!("../../ksp-onchain-transport-lib/tests/public_api.rs");
|
|
let worker = include_str!("../unit_tests/runtime_resources.rs");
|
|
let worker_hardening = include_str!("hardening.rs");
|
|
for required in [
|
|
"yellowstone_subscribe_request_identity_is_order_stable_exact_and_debug_redacted",
|
|
"yellowstone_transaction_update_decodes_current_storage_wire_including_v1_config_and_meta",
|
|
"yellowstone_transaction_status_update_preserves_error_and_rejects_malformed_signature",
|
|
"yellowstone_block_update_reuses_transaction_account_entry_dtos_and_preserves_server_counts",
|
|
] {
|
|
assert!(transport_subscribe.contains(required), "pre.012 Yellowstone Transport subscribe proof missing: {required}");
|
|
}
|
|
for required in [
|
|
"yellowstone_reconnect_replays_from_last_observed_slot_and_counts_duplicate_identity",
|
|
"yellowstone_replay_info_proves_and_clamps_retention_gap_without_lossless_claim",
|
|
"yellowstone_shutdown_interrupts_reconnect_backoff_and_mutation_is_rejected_during_reconnect",
|
|
] {
|
|
assert!(transport_stream.contains(required), "pre.012 Yellowstone Transport lifecycle proof missing: {required}");
|
|
}
|
|
assert!(transport_public.contains("public_v0_3_13_pre_002_yellowstone_subscribe_identity_is_opaque_and_available_from_crate_root"));
|
|
for required in [
|
|
"pre_002_source_accepts_matching_confirmed_transaction_and_get_transaction_route_without_io",
|
|
"v0_3_13_pre_002_live_source_key_is_stable_and_request_sensitive",
|
|
"pre_003_transaction_signal_fixture_preserves_exact_source_neutral_identity",
|
|
"pre_005_block_projects_transaction_signals_in_exact_source_order",
|
|
"pre_005_block_meta_and_slot_project_continuity_only_without_remote_dead_error",
|
|
"pre_004_observed_get_transaction_closes_signal_to_common_raw_ingress_with_composite_provenance",
|
|
"pre_008_reconnect_replay_and_proven_gap_are_distinct_monotone_and_frontier_preserving",
|
|
"v0_3_13_pre_008_global_hydration_registry_coalesces_cross_source_key_to_one_leader",
|
|
] {
|
|
assert!(worker.contains(required), "pre.012 Yellowstone Worker non-regression proof missing: {required}");
|
|
}
|
|
for required in [
|
|
"v0_3_12_pre_003_private_signal_debug_and_shape_do_not_expose_signature_filters_or_payload",
|
|
"v0_3_12_pre_008_reconnect_projection_is_source_neutral_bounded_and_contains_no_replay_material",
|
|
] {
|
|
assert!(worker_hardening.contains(required), "pre.012 Yellowstone Worker hardening proof missing: {required}");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_13_pre_012_security_redaction_matrix_covers_all_live_sources_and_lower_layers() {
|
|
let transport_subscribe = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let transport_unary = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_unary.rs");
|
|
let transport_ws = include_str!("../../ksp-onchain-transport-lib/unit_tests/ws_helius_transactions.rs");
|
|
let worker = include_str!("hardening.rs");
|
|
let common_raw = include_str!("../../ksp-raw-transaction-lib/unit_tests/canonical.rs");
|
|
let store_api = include_str!("../../ksp-store-api/tests/security_hardening.rs");
|
|
let store = include_str!("../../ksp-store-lib/tests/hardening_completeness.rs");
|
|
let postgres = include_str!("../../ksp-store-postgres-lib/tests/hardening_completeness.rs");
|
|
for required in [
|
|
"yellowstone_subscribe_debug_omits_filter_names_and_future_payloads",
|
|
"yellowstone_transaction_filters_encode_complete_current_wire_and_redact_selectors",
|
|
] {
|
|
assert!(transport_subscribe.contains(required), "pre.012 Transport gRPC redaction proof missing: {required}");
|
|
}
|
|
assert!(transport_unary.contains("yellowstone_remote_status_does_not_copy_message_details_or_metadata"));
|
|
assert!(transport_ws.contains("helius_transaction_notification_debug_omits_raw_provider_payloads"));
|
|
for required in [
|
|
"v0_3_12_pre_003_private_signal_debug_and_shape_do_not_expose_signature_filters_or_payload",
|
|
"v0_3_13_pre_003_standard_logs_redaction_and_reference_only_contract_are_explicit",
|
|
"v0_3_13_pre_004_standard_block_redaction_version_and_null_guards_are_explicit",
|
|
"v0_3_13_pre_005_helius_transaction_redaction_full_reference_and_tier_neutrality_are_explicit",
|
|
"v0_3_13_pre_006_http_block_polling_is_bounded_run_local_stop_preemptible_and_redacted",
|
|
"v0_3_13_pre_007_multi_source_supervisor_is_fail_closed_joined_and_does_not_publish_source_identity",
|
|
"v0_3_13_pre_008_cross_source_convergence_is_bounded_conflict_checked_and_private",
|
|
"v0_3_13_pre_009_duplicate_storm_disagreement_and_starvation_guards_are_explicit",
|
|
"v0_3_13_pre_010_multi_source_health_is_conservative_counted_and_redacted",
|
|
"v0_3_13_pre_011_shutdown_races_are_bounded_joined_atomic_and_counter_safe",
|
|
] {
|
|
assert!(worker.contains(required), "pre.012 Worker security proof missing: {required}");
|
|
}
|
|
assert!(common_raw.contains("pre_002_material_and_wire_debug_do_not_render_transaction_or_meta_material"));
|
|
assert!(store_api.contains("pre_007_raw_debug_surfaces_do_not_render_payload_hash_signature_or_account_bytes"));
|
|
assert!(store.contains("pre_009_secret_canary_never_crosses_settings_or_pre_io_error_debug"));
|
|
assert!(postgres.contains("pre_009_backend_error_bridge_cannot_retain_external_error_or_secret_text"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_14_pre_013_gap_repair_closure_keeps_one_transport_worker_common_raw_store_pipeline() {
|
|
let transport_transactions = include_str!("../../ksp-onchain-transport-lib/src/rpc_transactions.rs");
|
|
let transport_blocks = include_str!("../../ksp-onchain-transport-lib/src/rpc_blocks.rs");
|
|
let worker_root = include_str!("../src/lib.rs");
|
|
let worker_resources = include_str!("../src/runtime_resources.rs");
|
|
let worker_runtime = include_str!("../src/runtime.rs");
|
|
let worker_persistence = include_str!("../src/persistence.rs");
|
|
let common_raw_root = include_str!("../../ksp-raw-transaction-lib/src/lib.rs");
|
|
let store_api_root = include_str!("../../ksp-store-api/src/lib.rs");
|
|
let store = include_str!("../../ksp-store-lib/src/store.rs");
|
|
assert!(transport_transactions.contains("pub async fn get_transaction_observed("));
|
|
assert!(transport_blocks.contains("pub async fn get_block_observed("));
|
|
for required in [
|
|
"RawTransactionIngestContinuityContracts",
|
|
"RawTransactionIngestGlobalHydrationRegistry",
|
|
"RawTransactionAdmission",
|
|
"persist_raw_transaction_ingest_converged_acquisition",
|
|
] {
|
|
assert!(
|
|
worker_root.contains(required) || worker_resources.contains(required) || worker_runtime.contains(required),
|
|
"pre.013 Worker single-pipeline proof missing: {required}"
|
|
);
|
|
}
|
|
assert!(worker_persistence.contains("ksp_store_lib::RawTransactionWrite::persist_raw_transaction_acquisition"));
|
|
assert!(common_raw_root.contains("pub use self::acquisition::RawTransactionAcquisition;"));
|
|
assert!(common_raw_root.contains("pub use self::wire::RawSolanaMessageVersion;"));
|
|
assert!(store_api_root.contains("pub use self::model::raw_transaction::RawTransaction;"));
|
|
assert!(store_api_root.contains("pub use self::model::raw_transaction::RawTransactionObservation;"));
|
|
assert!(store.contains("persist_raw_transaction_acquisition"));
|
|
assert!(store.contains("record_raw_transaction_observation"));
|
|
for forbidden in [
|
|
"ksp_store_postgres_lib::",
|
|
"ksp_config_lib::",
|
|
"ksp_job_backfill_lib::",
|
|
"reqwest::",
|
|
"tokio_tungstenite::connect_async",
|
|
"yellowstone_grpc_proto::",
|
|
] {
|
|
assert!(
|
|
!worker_runtime.contains(forbidden) && !worker_resources.contains(forbidden) && !worker_persistence.contains(forbidden),
|
|
"pre.013 Worker bypassed the single facade pipeline: {forbidden}"
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_14_pre_013_security_redaction_covers_gap_repair_and_terminal_paths() {
|
|
let transport_subscribe = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let transport_unary = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_unary.rs");
|
|
let worker_hardening = include_str!("hardening.rs");
|
|
let worker_root = include_str!("../src/lib.rs");
|
|
let common_raw = include_str!("../../ksp-raw-transaction-lib/unit_tests/canonical.rs");
|
|
let store_api = include_str!("../../ksp-store-api/tests/security_hardening.rs");
|
|
let store = include_str!("../../ksp-store-lib/tests/hardening_completeness.rs");
|
|
let postgres = include_str!("../../ksp-store-postgres-lib/tests/hardening_completeness.rs");
|
|
assert!(transport_subscribe.contains("yellowstone_subscribe_debug_omits_filter_names_and_future_payloads"));
|
|
assert!(transport_unary.contains("yellowstone_remote_status_does_not_copy_message_details_or_metadata"));
|
|
for required in [
|
|
"v0_3_14_pre_009_health_policy_is_present_future_coverage_gated_and_source_neutral",
|
|
"v0_3_14_pre_010_repair_fairness_shares_existing_bounds_without_second_pipeline",
|
|
"v0_3_14_pre_011_gap_observability_is_bounded_checked_and_redacted",
|
|
"v0_3_14_pre_012_shutdown_races_are_bounded_across_source_and_worker_drains",
|
|
] {
|
|
assert!(worker_hardening.contains(required), "pre.013 Worker security closure proof missing: {required}");
|
|
}
|
|
for forbidden in ["source_key", "provider_gap", "endpoint_gap", "signature_gap", "payload_gap"] {
|
|
assert!(!worker_root.contains(forbidden), "pre.013 public Worker root leaked sensitive gap material: {forbidden}");
|
|
}
|
|
assert!(common_raw.contains("pre_002_material_and_wire_debug_do_not_render_transaction_or_meta_material"));
|
|
assert!(store_api.contains("pre_007_raw_debug_surfaces_do_not_render_payload_hash_signature_or_account_bytes"));
|
|
assert!(store.contains("pre_009_secret_canary_never_crosses_settings_or_pre_io_error_debug"));
|
|
assert!(postgres.contains("pre_009_backend_error_bridge_cannot_retain_external_error_or_secret_text"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_14_pre_013_legacy_v0_v1_remains_proven_after_gap_repair_hardening() {
|
|
let transport = include_str!("../../ksp-onchain-transport-lib/unit_tests/grpc_subscribe.rs");
|
|
let worker = include_str!("../unit_tests/runtime_resources.rs");
|
|
let common_raw = include_str!("../../ksp-raw-transaction-lib/unit_tests/wire.rs");
|
|
let store_api = include_str!("../../ksp-store-api/tests/public_api.rs");
|
|
for required in [
|
|
"yellowstone_transaction_update_decodes_current_storage_wire_including_v1_config_and_meta",
|
|
"yellowstone_block_update_reuses_transaction_account_entry_dtos_and_preserves_server_counts",
|
|
] {
|
|
assert!(transport.contains(required), "pre.013 Transport Legacy/V0/V1 proof missing: {required}");
|
|
}
|
|
for required in [
|
|
"v0_3_13_pre_004_legacy_v0_v1_block_materials_are_direct_common_raw_with_exact_version_and_index",
|
|
"v0_3_13_pre_006_http_block_polling_qualifies_legacy_v0_v1_and_rejects_ambiguous_or_future_versions",
|
|
"v0_3_14_pre_008_proven_full_ledger_epoch_survives_filtered_peer_loss_without_worker_respawn",
|
|
"v0_3_14_pre_012_source_fault_preserves_first_fault_and_aborts_non_cooperative_sibling",
|
|
] {
|
|
assert!(worker.contains(required), "pre.013 Worker Legacy/V0/V1 or continuity proof missing: {required}");
|
|
}
|
|
for required in [
|
|
"pre_006_legacy_v0_and_v1_wire_goldens_are_exact",
|
|
"RawSolanaMessageVersion::Legacy",
|
|
"RawSolanaMessageVersion::V0",
|
|
"RawSolanaMessageVersion::V1",
|
|
] {
|
|
assert!(common_raw.contains(required), "pre.013 Common RAW version proof missing: {required}");
|
|
}
|
|
assert!(store_api.contains("public_pre_003_raw_transaction_and_observation_are_constructible_from_crate_root"));
|
|
return;
|
|
}
|
|
|
|
#[test]
|
|
fn v0_3_14_pre_013_worker_and_backfill_remain_independent_producers() {
|
|
let worker = dependency_names(include_str!("../Cargo.toml"));
|
|
let backfill = dependency_names(include_str!("../../ksp-job-backfill-lib/Cargo.toml"));
|
|
assert!(!worker.contains(&"ksp-job-api"));
|
|
assert!(!worker.contains(&"ksp-job-backfill-lib"));
|
|
assert!(!backfill.contains(&"ksp-worker-api"));
|
|
assert!(!backfill.contains(&"ksp-worker-raw-transaction-ingest-lib"));
|
|
for shared in ["ksp-onchain-transport-lib", "ksp-raw-transaction-lib", "ksp-store-lib"] {
|
|
assert!(worker.contains(&shared), "Worker common RAW producer edge missing: {shared}");
|
|
assert!(backfill.contains(&shared), "Backfill common RAW producer edge missing: {shared}");
|
|
}
|
|
return;
|
|
}
|