From 9a998e7b52858714a3820ba0b8b8c215059627de Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sat, 5 Sep 2026 13:53:36 +0200 Subject: [PATCH] v0.3.9-pre.006-fix.003 --- .env.example | 10 ++-- Cargo.toml | 4 +- ROADMAP.md | 6 +-- config/examples/std.store.example.json | 2 +- config/examples/std.transport.example.json | 12 ++--- config/std.store.json | 2 +- config/std.transport.json | 28 +++++----- .../unit_tests/backfill_request.rs | 10 ++-- .../unit_tests/backfill_run.rs | 4 +- .../unit_tests/backfill_status.rs | 4 +- .../unit_tests/store_runtime.rs | 4 +- .../unit_tests/dto_common.rs | 4 +- crates/ksp-config-lib/USAGE.md | 4 +- .../unit_tests/fixtures/std.store.json | 2 +- .../unit_tests/fixtures/std.transport.json | 2 +- .../unit_tests/fixtures_v3/std.transport.json | 18 +++---- crates/ksp-config-lib/unit_tests/store.rs | 4 +- crates/ksp-config-lib/unit_tests/transport.rs | 14 ++--- .../unit_tests/request.rs | 4 +- crates/ksp-onchain-transport-lib/USAGE.md | 4 +- .../tests/yellowstone_publicnode_smoke.rs | 11 ++-- crates/ksp-store-api/tests/public_api.rs | 10 ++-- .../ksp-store-api/tests/security_hardening.rs | 6 +-- .../unit_tests/model/raw_account.rs | 4 +- .../unit_tests/model/raw_inspection.rs | 6 +-- .../unit_tests/model/raw_pagination.rs | 6 +-- .../unit_tests/model/raw_primitives.rs | 4 +- .../unit_tests/model/raw_retention.rs | 4 +- .../unit_tests/model/raw_transaction.rs | 6 +-- .../unit_tests/raw_account.rs | 10 ++-- .../unit_tests/raw_transaction.rs | 10 ++-- deltas/0.3.9/pre.006-fix.003.md | 52 +++++++++++++++++++ .../009-ACQUISITION_WORKERS_AND_JOBS.md | 19 ++----- .../011-RAW_TRANSACTION_ACQUISITION.md | 4 +- ...9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md | 8 ++- ...V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md | 15 +++++- 36 files changed, 186 insertions(+), 131 deletions(-) create mode 100644 deltas/0.3.9/pre.006-fix.003.md diff --git a/.env.example b/.env.example index b033eb4..9522fe1 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ # file: .env.example -# version: 13 +# version: 14 # KSP Logging root directory. Used by config/std.logging.json for relative log output paths. # The current Config document fallback is "logs" when neither the process environment nor .env defines this variable. @@ -28,16 +28,16 @@ KSP_WALLETS_DIRECTORY=wallets KSP_PUBLIC_SOLANA_DEVNET_HTTP_URL=https://api.devnet.solana.com # Optional public Solana Mainnet HTTP endpoint override used by config/std.transport.json and its example. -# The committed Transport document falls back to https://api.mainnet-beta.solana.com when this variable is absent. -KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL=https://api.mainnet-beta.solana.com +# The committed Transport document falls back to https://api.mainnet.solana.com when this variable is absent. +KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL=https://api.mainnet.solana.com # Optional public Solana Devnet WebSocket endpoint override used by config/std.transport.json. # The committed Transport document falls back to wss://api.devnet.solana.com when this variable is absent. KSP_PUBLIC_SOLANA_DEVNET_WS_URL=wss://api.devnet.solana.com # Optional public Solana Mainnet WebSocket endpoint override used by config/std.transport.json and its example. -# The committed Transport document falls back to wss://api.mainnet-beta.solana.com when this variable is absent. -KSP_PUBLIC_SOLANA_MAINNET_WS_URL=wss://api.mainnet-beta.solana.com +# The committed Transport document falls back to wss://api.mainnet.solana.com when this variable is absent. +KSP_PUBLIC_SOLANA_MAINNET_WS_URL=wss://api.mainnet.solana.com # Optional complete private-provider HTTP endpoint URL used only by the Transport example when explicitly selected. # Keep provider credentials in a KSP_SECRET_* variable; do not copy a real credential-bearing URL into committed JSON. diff --git a/Cargo.toml b/Cargo.toml index fb37b56..f9861fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 483 +# version: 484 [workspace] resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api"] [workspace.package] -version = "0.3.9-pre.6" +version = "0.3.9-pre.6.fix.3" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/ROADMAP.md b/ROADMAP.md index 8979ddd..90cacfb 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,5 +1,5 @@ - + # Roadmap KSP @@ -102,7 +102,7 @@ RAW -> STRUCTURAL -> DECODED -> DOMAIN - [X] `0.3.7` — `ksp-app-backfill-desk` livrée comme Desk Tauri KSP spécialisée : composition Config Mainnet/Devnet/Testnet, quatre scopes HTTP, validation/start single-run, monitoring latest-value `ksp-backfill-status`, Cancel ciblé/idempotent, Resume in-session par checkpoint Rust-only réémis pour un nouveau JobId, autocomplete libre depuis `ksp-core-lib`, hardening IPC/dependency boundaries et build Linux `.deb`/`.rpm`/`.AppImage`. Aucun SQL/backend/provider physique ni checkpoint durable n’est exposé. - [X] `0.3.8` — `ksp-app-store-desk` V1 RAW livrée sur le gabarit KSP courant comme application Tauri read-only backend-neutral. La Desk compose Config + Logging + `ksp-store-lib`, expose health/runtime sûrs, DataTables `serverSide` pour `RawTransaction`, `RawAccountState` et leurs observations, détails bornés, provenance sûre et états de rétention/tombstone, sans SQL/backend physique/Transport dans l'application. La nouvelle inspection random-access `offset + limit + counts exacts` reste distincte de la pagination machine cursor/keyset conservée pour workers/backfills/replays. Le gate final et les builds Linux `.deb`/`.rpm` sont verts. - [ ] `0.3.9` — Introduire `ksp-worker-api` comme API **générique et volontairement courte** de lifecycle/health/progression/snapshot pour services continus, distincte de `ksp-job-api` et sans dépendance Solana/Transport/Store/Tauri. Une fois l'API Worker fonctionnellement fermée, terminer la release par un audit fonctionnel exhaustif des sources/méthodes d'acquisition `RawTransaction` : HTTP, WS standard, extensions provider, Yellowstone gRPC, blocks/slots, discovery + hydration, replay/gap-repair et combinaisons multi-provider. Cet audit prépare `0.3.10` sans ajouter d'endpoint ni de Config provider dans `0.3.9`. -- [ ] `0.3.10` — Introduire `ksp-worker-raw-transaction-ingest-lib` **multi-source dès V1**. Le worker compose les stratégies retenues par l'audit `0.3.9` comme sources alternatives, complémentaires, redondantes ou spécialisées live/catch-up/gap-repair, converge vers `RawTransaction + RawTransactionObservation`, persiste par `ksp-store-lib` et utilise `ksp-worker-api` pour supervision/cancellation. Cette release porte aussi, et seulement si l'audit les justifie, les adaptations nécessaires de `ksp-onchain-transport-lib`/`ksp-config-lib` : futures sources Helius HTTP/WS Mainnet/Devnet avec réutilisation de `KSP_SECRET_HELIUS_API_KEY`, capabilities/tier réaudités au moment du travail, et éventuelle canonicalisation `mainnet`/`mainnet-beta` uniquement avec stratégie de compatibilité sûre. Aucun decode Program ni dépendance backend/provider directe dans le worker. +- [ ] `0.3.10` — Introduire `ksp-worker-raw-transaction-ingest-lib` **multi-source dès V1**. Le worker compose les stratégies retenues par l'audit `0.3.9` comme sources alternatives, complémentaires, redondantes ou spécialisées live/catch-up/gap-repair, converge vers `RawTransaction + RawTransactionObservation`, persiste par `ksp-store-lib` et utilise `ksp-worker-api` pour supervision/cancellation. Cette release porte aussi, et seulement si l'audit les justifie, les adaptations nécessaires de `ksp-onchain-transport-lib`/`ksp-config-lib` : futures sources Helius HTTP/WS Mainnet/Devnet avec réutilisation de `KSP_SECRET_HELIUS_API_KEY`, capabilities/tier réaudités au moment du travail, la canonicalisation logique `mainnet` étant déjà matérialisée en `0.3.9-pre.006-fix.003`, `0.3.10` ne doit ajouter qu'un éventuel alias de frontière si une source externe l'exige réellement. Aucun decode Program ni dépendance backend/provider directe dans le worker. - [ ] `0.3.11` — Introduire `ksp-app-raw-transaction-ingest-desk`, Desk Tauri KSP spécialisée qui choisit et supervise **une ou plusieurs sources/méthodes** réellement admises par `0.3.10` : lifecycle, health, rates, backpressure, reconnect/recovery, gap state et compteurs sûrs. La Desk ne réimplémente ni discovery, hydration, déduplication, reprise ni persistence ; l'inspection détaillée des RAW persistés reste la responsabilité de `ksp-app-store-desk`. - [ ] `0.3.12` — Étendre `ksp-job-backfill-lib` et `ksp-app-backfill-desk` au **backfill multi-source/multi-stratégie** à partir de la même matrice d'acquisition auditée en `0.3.9`. Conserver la stratégie actuelle `getSignaturesForAddress + getTransaction` comme première voie HTTP valide, puis ajouter seulement les voies historiques/catch-up/gap-repair réellement pertinentes et sûres (par exemple block/slot, replay provider lorsqu'il existe), sans supposer qu'une source live WS constitue un historique universel. @@ -116,7 +116,7 @@ RAW -> STRUCTURAL -> DECODED -> DOMAIN - [ ] **TODO** — maintenir la matrice d’admission HTTP/WS/gRPC/provider lors de toute nouvelle famille N1 : plusieurs sources ne convergent vers un même struct que si elles satisfont la même sémantique sans perte. - [ ] **TODO `0.3.9`** — produire après fermeture de `ksp-worker-api` une matrice RAW Transaction unique et réutilisable par `0.3.10` puis `0.3.12`, couvrant discovery, hydration/direct payload, filtres, ordering/duplicates, reconnect/replay, gap repair, backpressure, commitment, provenance, quotas, gaps Transport/Config et applicability continuous-ingest/catch-up/backfill. - [ ] **TODO Helius futur** — ne pas ajouter d'URL/endpoints Helius en `0.3.8` ni pendant la construction générique de Worker API. L'audit `0.3.9` réévalue les capabilities/tier courants ; `0.3.10` peut ensuite ajouter les profils HTTP/WS réellement nécessaires en réutilisant exclusivement `KSP_SECRET_HELIUS_API_KEY` via Config. -- [ ] **TODO réseau** — auditer `mainnet` vs `mainnet-beta` avant tout renommage : Store persisté, Config, Transport, checkpoints/fingerprints et aliases externes doivent converger vers une identité KSP unique pour le même cluster ; aucune migration/canonicalisation n'est supposée avant cette preuve. +- [X] **TODO réseau** — audit fermé en `0.3.9` : `mainnet` est l'identité logique canonique KSP ; `mainnet-beta` reste un alias legacy/externe. `pre.006-fix.003` normalise Config/Store/Transport/tests pendant N1 RAW sans migration des données expérimentales, qui peuvent être droppées/recréées. - [X] `RawAccountState` + observation — contrat commun stabilisé en `0.3.1` avec bytes complets + slot, provenance séparée et enrichissements source-specific optionnels ; la persistence PostgreSQL physique est complétée en `0.3.4` avec les quatre capabilities account et la conformance RAW 10/10. - [ ] **TODO** — statut/commitment transactionnel restant : `0.3.5` couvre uniquement le fait passif d’exécution `slot + signature + outcome`; réauditer séparément `signatureSubscribe` et `getSignatureStatuses` lorsqu’un consumer de commitment/snapshot réel apparaît, sans fusionner snapshot, transition et execution update dans un modèle Option-soup. - [ ] **IDEA** — logs realtime enrichis : `logsSubscribe` alimente déjà la projection minimale `TransactionExecutionEvent`, mais un éventuel `TransactionLogEvent` portant les lignes de log reste différé dans `docs/IDEAS.md` jusqu’à démonstration d’un consumer et de bornes explicites. `logMessages` reste dans `RawTransaction` jusqu’à STRUCTURAL ; le wake-up post-commit reste distinct et Store API-owned conformément à `KSP-NOTIFY-*`. diff --git a/config/examples/std.store.example.json b/config/examples/std.store.example.json index 904a758..039c42b 100644 --- a/config/examples/std.store.example.json +++ b/config/examples/std.store.example.json @@ -29,7 +29,7 @@ }, { "profile_id": "mainnet", - "network": "mainnet-beta", + "network": "mainnet", "backend": "postgres", "postgres": { "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", diff --git a/config/examples/std.transport.example.json b/config/examples/std.transport.example.json index 0ee6885..5d244eb 100644 --- a/config/examples/std.transport.example.json +++ b/config/examples/std.transport.example.json @@ -31,8 +31,8 @@ "name": "mainnet_public", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", + "cluster": "mainnet", + "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}", "connect_timeout_ms": 5000, "request_timeout_ms": 15000, "max_idle_connections_per_host": 8, @@ -57,7 +57,7 @@ "name": "mainnet_private", "enabled": true, "provider": "private-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "url": "${KSP_SECRET_SOLANA_HTTP_URL:-https://example.invalid}", "connect_timeout_ms": 5000, "request_timeout_ms": 10000, @@ -85,15 +85,15 @@ "name": "mainnet_public_ws", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet-beta.solana.com}" + "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet.solana.com}" }, { "name": "mainnet_helius_ws", "enabled": true, "provider": "helius", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "helius_laserstream", "url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-replace-me}", "session": { diff --git a/config/std.store.json b/config/std.store.json index 8653c04..041497b 100644 --- a/config/std.store.json +++ b/config/std.store.json @@ -29,7 +29,7 @@ }, { "profile_id": "mainnet", - "network": "mainnet-beta", + "network": "mainnet", "backend": "postgres", "postgres": { "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", diff --git a/config/std.transport.json b/config/std.transport.json index 79c8582..21ac4da 100644 --- a/config/std.transport.json +++ b/config/std.transport.json @@ -144,8 +144,8 @@ "name": "solana_mainnet_public", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", + "cluster": "mainnet", + "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}", "connect_timeout_ms": 5000, "request_timeout_ms": 15000, "max_idle_connections_per_host": 8, @@ -172,9 +172,9 @@ "name": "solana_mainnet_public_ws", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet-beta.solana.com}" + "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet.solana.com}" } ] }, @@ -185,8 +185,8 @@ "name": "solana_mainnet_public", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", + "cluster": "mainnet", + "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}", "connect_timeout_ms": 5000, "request_timeout_ms": 15000, "max_idle_connections_per_host": 8, @@ -225,7 +225,7 @@ "name": "publicnode_solana_mainnet_http", "enabled": true, "provider": "publicnode", - "cluster": "mainnet-beta", + "cluster": "mainnet", "url": "https://solana-rpc.publicnode.com", "connect_timeout_ms": 5000, "request_timeout_ms": 15000, @@ -267,9 +267,9 @@ "name": "solana_mainnet_public_ws", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet-beta.solana.com}" + "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet.solana.com}" } ] }, @@ -280,8 +280,8 @@ "name": "solana_mainnet_public", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", + "cluster": "mainnet", + "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}", "connect_timeout_ms": 5000, "request_timeout_ms": 15000, "max_idle_connections_per_host": 8, @@ -308,9 +308,9 @@ "name": "solana_mainnet_public_ws", "enabled": true, "provider": "solana-public", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", - "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet-beta.solana.com}" + "url": "${KSP_PUBLIC_SOLANA_MAINNET_WS_URL:-wss://api.mainnet.solana.com}" } ], "grpc_endpoints": [ @@ -318,7 +318,7 @@ "name": "publicnode_solana_mainnet_yellowstone", "enabled": true, "provider": "publicnode", - "cluster": "mainnet-beta", + "cluster": "mainnet", "protocol": "solana_yellowstone", "url": "https://solana-yellowstone-grpc.publicnode.com:443", "secret_metadata": [ diff --git a/crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs b/crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs index 7b5c5ed..470b7b4 100644 --- a/crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs +++ b/crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs -// version: 3 +// version: 4 fn ready_options() -> crate::BackfillDeskOptionsDto { let limits = crate::backfill_request_limits(); @@ -22,7 +22,7 @@ fn ready_options() -> crate::BackfillDeskOptionsDto { return crate::BackfillDeskOptionsDto { commitments: crate::backfill_commitment_codes(), composition_ready: true, - configured_networks: vec!["mainnet-beta".to_owned()], + configured_networks: vec!["mainnet".to_owned()], http_routes: vec![ crate::BackfillHttpRouteOptionDto { pooled: true, @@ -36,7 +36,7 @@ fn ready_options() -> crate::BackfillDeskOptionsDto { program_id_options: crate::program_id_autocomplete_options(), scope_kinds: crate::backfill_scope_kind_codes(), store_diagnostic: std::option::Option::None, - store_network: std::option::Option::Some("mainnet-beta".to_owned()), + store_network: std::option::Option::Some("mainnet".to_owned()), store_ready: true, transport_diagnostic: std::option::Option::None, transport_ready: true, @@ -81,7 +81,7 @@ fn latest_address_maps_to_backend_network_role_commitment_and_bounds() { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; - assert_eq!(mapped.network().as_str(), "mainnet-beta"); + assert_eq!(mapped.network().as_str(), "mainnet"); assert_eq!(mapped.role().as_str(), "backfill_pool"); assert_eq!(mapped.commitment(), ksp_job_backfill_lib::BackfillCommitment::Finalized); assert_eq!(mapped.scope().kind(), ksp_job_backfill_lib::BackfillScopeKind::LatestAddress); @@ -193,7 +193,7 @@ fn request_preview_never_contains_address_or_signature_values() { if let std::result::Result::Ok(serialized) = serialized { assert!(!serialized.contains("11111111111111111111111111111111")); assert!(!serialized.contains(&"1".repeat(64))); - assert!(serialized.contains("mainnet-beta")); + assert!(serialized.contains("mainnet")); assert!(serialized.contains("backfill_pool")); } } diff --git a/crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs b/crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs index 7282ca1..e00cc7e 100644 --- a/crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs +++ b/crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs -// version: 3 +// version: 4 #[test] fn generated_run_ids_are_backend_owned_bounded_and_unique_in_session() { @@ -30,7 +30,7 @@ fn cancellable_runtime( std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return std::option::Option::None, }; - let network = match ksp_store_lib::RawNetworkId::new("mainnet-beta") { + let network = match ksp_store_lib::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return std::option::Option::None, }; diff --git a/crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs b/crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs index 4397e71..cddbb08 100644 --- a/crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs +++ b/crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs -// version: 1 +// version: 2 fn initial_notification() -> std::option::Option> { let signature = match ksp_job_backfill_lib::BackfillSignature::new("1".repeat(ksp_job_backfill_lib::MIN_BACKFILL_SIGNATURE_TEXT_BYTES)) { @@ -14,7 +14,7 @@ fn initial_notification() -> std::option::Option value, std::result::Result::Err(_) => return std::option::Option::None, }; - let network = match ksp_store_lib::RawNetworkId::new("mainnet-beta") { + let network = match ksp_store_lib::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return std::option::Option::None, }; diff --git a/crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs b/crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs index df0743f..791b779 100644 --- a/crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs +++ b/crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs -// version: 1 +// version: 2 #[test] fn store_health_mapping_is_explicit_and_conservative() { @@ -10,7 +10,7 @@ fn store_health_mapping_is_explicit_and_conservative() { #[test] fn store_transport_network_coherence_requires_exact_logical_identity() { assert!(super::validate_network_coherence("devnet", "devnet").is_ok()); - let mismatch = super::validate_network_coherence("mainnet-beta", "devnet"); + let mismatch = super::validate_network_coherence("mainnet", "devnet"); assert!(mismatch.is_err()); if let std::result::Result::Err(error) = mismatch { assert_eq!(error.code(), crate::ERROR_CODE_STORE_NETWORK_MISMATCH); diff --git a/crates/ksp-app-store-desk/unit_tests/dto_common.rs b/crates/ksp-app-store-desk/unit_tests/dto_common.rs index 93aa67e..1af6c9d 100644 --- a/crates/ksp-app-store-desk/unit_tests/dto_common.rs +++ b/crates/ksp-app-store-desk/unit_tests/dto_common.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-store-desk/unit_tests/dto_common.rs -// version: 2 +// version: 3 #[test] fn command_error_projection_keeps_only_stable_public_fields() { @@ -19,7 +19,7 @@ fn store_runtime_status_dto_contains_only_safe_portable_fields() { diagnostic: std::option::Option::None, health_state: "ready".to_owned(), migration_version_decimal: std::option::Option::Some("2".to_owned()), - network: std::option::Option::Some("mainnet-beta".to_owned()), + network: std::option::Option::Some("mainnet".to_owned()), pending_migration_count: 0, pool_available: 1, pool_capacity: 8, diff --git a/crates/ksp-config-lib/USAGE.md b/crates/ksp-config-lib/USAGE.md index 42bc6c0..2bc09b8 100644 --- a/crates/ksp-config-lib/USAGE.md +++ b/crates/ksp-config-lib/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de ksp-config-lib @@ -250,7 +250,7 @@ Targets committed : ```text devnet -> network devnet -> KSP_SECRET_STORE_DEVNET_POSTGRES_URI -mainnet -> network mainnet-beta -> KSP_SECRET_STORE_MAINNET_POSTGRES_URI +mainnet -> network mainnet -> KSP_SECRET_STORE_MAINNET_POSTGRES_URI testnet -> network testnet -> KSP_SECRET_STORE_TESTNET_POSTGRES_URI ``` diff --git a/crates/ksp-config-lib/unit_tests/fixtures/std.store.json b/crates/ksp-config-lib/unit_tests/fixtures/std.store.json index 8653c04..041497b 100644 --- a/crates/ksp-config-lib/unit_tests/fixtures/std.store.json +++ b/crates/ksp-config-lib/unit_tests/fixtures/std.store.json @@ -29,7 +29,7 @@ }, { "profile_id": "mainnet", - "network": "mainnet-beta", + "network": "mainnet", "backend": "postgres", "postgres": { "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", diff --git a/crates/ksp-config-lib/unit_tests/fixtures/std.transport.json b/crates/ksp-config-lib/unit_tests/fixtures/std.transport.json index f67b34f..2df195d 100644 --- a/crates/ksp-config-lib/unit_tests/fixtures/std.transport.json +++ b/crates/ksp-config-lib/unit_tests/fixtures/std.transport.json @@ -76,7 +76,7 @@ "name": "fixture_helius_ws", "enabled": true, "provider": "helius", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "helius_laserstream", "url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-fixture-helius-key}" } diff --git a/crates/ksp-config-lib/unit_tests/fixtures_v3/std.transport.json b/crates/ksp-config-lib/unit_tests/fixtures_v3/std.transport.json index 24ceada..dd7079c 100644 --- a/crates/ksp-config-lib/unit_tests/fixtures_v3/std.transport.json +++ b/crates/ksp-config-lib/unit_tests/fixtures_v3/std.transport.json @@ -45,7 +45,7 @@ "name": "fixture_http", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "url": "https://fallback.invalid", "connect_timeout_ms": 1000, "request_timeout_ms": 3000, @@ -73,7 +73,7 @@ "name": "fixture_ws", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", "url": "wss://fallback.invalid" } @@ -83,7 +83,7 @@ "name": "fixture_grpc", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "protocol": "solana_yellowstone", "url": "https://grpc.invalid", "metadata": [ @@ -115,7 +115,7 @@ "name": "fixture_http", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "url": "https://fallback.invalid", "connect_timeout_ms": 1000, "request_timeout_ms": 3000, @@ -143,7 +143,7 @@ "name": "fixture_ws", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", "url": "wss://fallback.invalid" } @@ -153,7 +153,7 @@ "name": "fixture_grpc", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "protocol": "solana_yellowstone", "url": "https://grpc.invalid", "metadata": [ @@ -180,7 +180,7 @@ "name": "fixture_http", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "url": "https://fallback.invalid", "connect_timeout_ms": 1000, "request_timeout_ms": 3000, @@ -208,7 +208,7 @@ "name": "fixture_ws", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "kind": "solana_standard", "url": "wss://fallback.invalid" } @@ -218,7 +218,7 @@ "name": "fixture_grpc", "enabled": true, "provider": "fixture-provider", - "cluster": "mainnet-beta", + "cluster": "mainnet", "protocol": "solana_yellowstone", "url": "https://grpc.invalid", "metadata": [], diff --git a/crates/ksp-config-lib/unit_tests/store.rs b/crates/ksp-config-lib/unit_tests/store.rs index 26e8062..4530ad9 100644 --- a/crates/ksp-config-lib/unit_tests/store.rs +++ b/crates/ksp-config-lib/unit_tests/store.rs @@ -1,5 +1,5 @@ // file: crates/ksp-config-lib/unit_tests/store.rs -// version: 4 +// version: 5 #[test] fn committed_store_profile_maps_exact_runtime_settings_and_secret_fallback() { @@ -122,7 +122,7 @@ fn named_store_targets_select_one_network_and_database_without_runtime_multiplex let environment = crate::ConfigEnvironment::from_maps(process, std::collections::BTreeMap::new()); for (target_id, network, expected_uri) in [ ("devnet", "devnet", "postgresql://devnet.invalid/ksp_devnet"), - ("mainnet", "mainnet-beta", "postgresql://mainnet.invalid/ksp_mainnet"), + ("mainnet", "mainnet", "postgresql://mainnet.invalid/ksp_mainnet"), ("testnet", "testnet", "postgresql://testnet.invalid/ksp_testnet"), ] { let resolved = engine.load_resolved_store_config(std::option::Option::Some(target_id), &environment); diff --git a/crates/ksp-config-lib/unit_tests/transport.rs b/crates/ksp-config-lib/unit_tests/transport.rs index f15a81f..6678e22 100644 --- a/crates/ksp-config-lib/unit_tests/transport.rs +++ b/crates/ksp-config-lib/unit_tests/transport.rs @@ -1,5 +1,5 @@ // file: crates/ksp-config-lib/unit_tests/transport.rs -// version: 12 +// version: 13 #[test] fn fixture_transport_profile_maps_complete_runtime_contract() { @@ -68,7 +68,7 @@ fn fixture_transport_profile_maps_complete_runtime_contract() { let helius = &ws.endpoints()[1]; assert_eq!(helius.name(), "fixture_helius_ws"); assert_eq!(helius.provider().as_str(), "helius"); - assert_eq!(helius.cluster().as_str(), "mainnet-beta"); + assert_eq!(helius.cluster().as_str(), "mainnet"); assert_eq!(helius.protocol(), ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream); assert_eq!(helius.url().as_str(), "wss://mainnet.helius-rpc.com/?api-key=fixture-helius-key"); let _connect_future = ksp_onchain_transport_lib::HeliusLaserStreamWsSession::connect(helius.clone()); @@ -122,13 +122,13 @@ fn committed_transport_document_maps_default_and_explicit_profiles() { if let std::result::Result::Ok(mainnet) = mainnet { assert_eq!(mainnet.profile_id(), "mainnet_public"); assert_eq!(mainnet.selection_source(), crate::ConfigProfileSelectionSource::Explicit); - assert_eq!(mainnet.settings().endpoints()[0].cluster().as_str(), "mainnet-beta"); - assert_eq!(mainnet.settings().endpoints()[0].url().as_str(), "https://api.mainnet-beta.solana.com"); + assert_eq!(mainnet.settings().endpoints()[0].cluster().as_str(), "mainnet"); + assert_eq!(mainnet.settings().endpoints()[0].url().as_str(), "https://api.mainnet.solana.com"); assert!(mainnet.grpc_settings().is_none(), "generic Mainnet profile must stay distinct from the PublicNode gRPC profile"); let ws = mainnet.ws_settings(); assert!(ws.is_some(), "committed V3 Mainnet profile should expose WebSocket settings"); if let std::option::Option::Some(ws) = ws { - assert_eq!(ws.endpoints()[0].url().as_str(), "wss://api.mainnet-beta.solana.com"); + assert_eq!(ws.endpoints()[0].url().as_str(), "wss://api.mainnet.solana.com"); } } } @@ -190,7 +190,7 @@ fn committed_v3_publicnode_profiles_map_provider_neutral_yellowstone_grpc_with_n ( "publicnode_mainnet", "publicnode_solana_mainnet_yellowstone", - "mainnet-beta", + "mainnet", "https://solana-yellowstone-grpc.publicnode.com:443", "KSP_SECRET_PUBLICNODE_MAINNET_GRPC_X_TOKEN", "PUBLICNODE-MAINNET-GRPC-X-TOKEN-CANARY", @@ -480,7 +480,7 @@ fn helius_laserstream_mainnet_and_devnet_api_key_map_to_protocol_and_safe_redact assert_eq!(ws.endpoints().len(), 2); let endpoint = &ws.endpoints()[1]; assert_eq!(endpoint.provider().as_str(), "helius"); - assert_eq!(endpoint.cluster().as_str(), "mainnet-beta"); + assert_eq!(endpoint.cluster().as_str(), "mainnet"); assert_eq!(endpoint.protocol(), ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream); assert_eq!(endpoint.url().as_str(), "wss://mainnet.helius-rpc.com/?api-key=helius-api-key-canary"); } diff --git a/crates/ksp-job-backfill-lib/unit_tests/request.rs b/crates/ksp-job-backfill-lib/unit_tests/request.rs index 96b67cc..c590c3a 100644 --- a/crates/ksp-job-backfill-lib/unit_tests/request.rs +++ b/crates/ksp-job-backfill-lib/unit_tests/request.rs @@ -1,5 +1,5 @@ // file: crates/ksp-job-backfill-lib/unit_tests/request.rs -// version: 2 +// version: 3 fn signature(character: char) -> std::option::Option { return match crate::BackfillSignature::new(character.to_string().repeat(crate::MIN_BACKFILL_SIGNATURE_TEXT_BYTES)) { @@ -235,7 +235,7 @@ fn pre_005_scope_kind_and_anchor_are_distinct_semantics() { #[test] fn pre_011_resume_reissues_checkpoint_for_new_job_without_changing_scope_semantics() { - let network = match network("mainnet-beta") { + let network = match network("mainnet") { std::option::Option::Some(value) => value, std::option::Option::None => return, }; diff --git a/crates/ksp-onchain-transport-lib/USAGE.md b/crates/ksp-onchain-transport-lib/USAGE.md index 424a104..6d04f92 100644 --- a/crates/ksp-onchain-transport-lib/USAGE.md +++ b/crates/ksp-onchain-transport-lib/USAGE.md @@ -1,5 +1,5 @@ - + # Utilisation de `ksp-onchain-transport-lib` @@ -281,7 +281,7 @@ let grpc_endpoint = match ksp_onchain_transport_lib::YellowstoneGrpcEndpointSett "publicnode_mainnet_yellowstone", true, ksp_onchain_transport_lib::YellowstoneGrpcProviderName::new("publicnode"), - ksp_onchain_transport_lib::YellowstoneGrpcClusterName::new("mainnet-beta"), + ksp_onchain_transport_lib::YellowstoneGrpcClusterName::new("mainnet"), grpc_url, ksp_onchain_transport_lib::YellowstoneGrpcSessionSettings::default(), ) diff --git a/crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs b/crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs index 92362fe..6a876e9 100644 --- a/crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs +++ b/crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs -// version: 5 +// version: 6 //! Opt-in live PublicNode Mainnet/Testnet smokes for authenticated provider-neutral Yellowstone gRPC Subscribe. @@ -146,13 +146,8 @@ async fn assert_publicnode_slot_stream(name: &str, cluster: &str, url: &str, x_t #[ignore = "opt-in live PublicNode Mainnet Yellowstone gRPC smoke; reads the first personal x-token line from stdin and performs an external TLS/Subscribe request"] async fn publicnode_mainnet_yellowstone_streams_slots_with_network_scoped_secret_x_token() { let tokens = publicnode_x_tokens(); - assert_publicnode_slot_stream( - "publicnode_mainnet_yellowstone", - "mainnet-beta", - "https://solana-yellowstone-grpc.publicnode.com:443", - tokens.mainnet.as_str(), - ) - .await; + assert_publicnode_slot_stream("publicnode_mainnet_yellowstone", "mainnet", "https://solana-yellowstone-grpc.publicnode.com:443", tokens.mainnet.as_str()) + .await; } #[tokio::test(flavor = "current_thread")] diff --git a/crates/ksp-store-api/tests/public_api.rs b/crates/ksp-store-api/tests/public_api.rs index 45d90b8..1859418 100644 --- a/crates/ksp-store-api/tests/public_api.rs +++ b/crates/ksp-store-api/tests/public_api.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-api/tests/public_api.rs -// version: 8 +// version: 9 //! Integration canaries for the public `ksp-store-api` surface. @@ -30,7 +30,7 @@ fn public_pre_002_core_facade_remains_available_from_crate_root() { #[test] fn public_pre_003_raw_transaction_and_observation_are_constructible_from_crate_root() { - let network = match ksp_store_api::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match ksp_store_api::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; @@ -65,7 +65,7 @@ fn public_pre_003_raw_transaction_and_observation_are_constructible_from_crate_r let observation = ksp_store_api::RawTransactionObservation::new(ksp_store_api::RawObservationKey::new([3_u8; 32]), reference, provenance); assert_eq!(transaction.slot(), 123); assert_eq!(transaction.payload().bytes(), &[1_u8, 2_u8, 3_u8]); - assert_eq!(observation.transaction().network().as_str(), "mainnet-beta"); + assert_eq!(observation.transaction().network().as_str(), "mainnet"); assert_eq!(observation.provenance().acquisition_method().as_str(), "getTransaction"); assert_eq!(ksp_store_api::ERROR_CODE_RAW_PAYLOAD_INVALID.domain(), "store_api"); return; @@ -83,7 +83,7 @@ fn public_pre_003_surface_keeps_backend_and_structural_types_out() { #[test] fn public_pre_004_raw_account_state_and_observation_are_constructible_from_crate_root() { - let network = match ksp_store_api::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match ksp_store_api::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; @@ -159,7 +159,7 @@ fn public_pre_006_query_outcome_and_retention_contracts_are_available_from_crate std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; - let network = match ksp_store_api::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match ksp_store_api::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; diff --git a/crates/ksp-store-api/tests/security_hardening.rs b/crates/ksp-store-api/tests/security_hardening.rs index ee6047d..1a631a6 100644 --- a/crates/ksp-store-api/tests/security_hardening.rs +++ b/crates/ksp-store-api/tests/security_hardening.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-api/tests/security_hardening.rs -// version: 2 +// version: 3 //! Adversarial and retention-race canaries for the Store API RAW foundation. @@ -62,7 +62,7 @@ fn pre_007_raw_debug_surfaces_do_not_render_payload_hash_signature_or_account_by }; assert!(!std::format!("{payload:?}").contains(HOSTILE_MARKER)); assert_eq!(std::format!("{:?}", payload.content_hash()), "RawContentHash(..)"); - let network = match ksp_store_api::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match ksp_store_api::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; @@ -125,7 +125,7 @@ fn pre_007_retention_outcome_distinguishes_lost_compare_and_transition_race() { #[test] fn v0_3_8_pre_003_inspection_summaries_and_counts_reject_payload_shaped_or_inconsistent_state() { - let network = match ksp_store_api::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match ksp_store_api::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; diff --git a/crates/ksp-store-api/unit_tests/model/raw_account.rs b/crates/ksp-store-api/unit_tests/model/raw_account.rs index 95e2c19..121edd6 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_account.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_account.rs @@ -1,8 +1,8 @@ // file: crates/ksp-store-api/unit_tests/model/raw_account.rs -// version: 1 +// version: 2 fn network() -> std::option::Option { - return match crate::RawNetworkId::new("mainnet-beta".to_owned()) { + return match crate::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => std::option::Option::Some(value), std::result::Result::Err(_) => std::option::Option::None, }; diff --git a/crates/ksp-store-api/unit_tests/model/raw_inspection.rs b/crates/ksp-store-api/unit_tests/model/raw_inspection.rs index a2e08fa..36a6f42 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_inspection.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_inspection.rs @@ -1,10 +1,10 @@ // file: crates/ksp-store-api/unit_tests/model/raw_inspection.rs -// version: 2 +// version: 3 //! Unit tests for backend-neutral RAW inspection contracts. fn network() -> std::option::Option { - return match crate::RawNetworkId::new("mainnet-beta".to_owned()) { + return match crate::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => std::option::Option::Some(value), std::result::Result::Err(_) => std::option::Option::None, }; @@ -61,7 +61,7 @@ fn inspection_queries_keep_backend_neutral_filters_and_random_access_page() { }; let transaction = crate::RawTransactionInspectionQuery::new(network.clone(), slots, crate::RawSortDirection::Descending, crate::RawInspectionPageRequest::new(50, limit)); - assert_eq!(transaction.network().as_str(), "mainnet-beta"); + assert_eq!(transaction.network().as_str(), "mainnet"); assert_eq!(transaction.page().offset(), 50); assert_eq!(transaction.slots().end_inclusive(), std::option::Option::Some(20)); assert_eq!(transaction.direction(), crate::RawSortDirection::Descending); diff --git a/crates/ksp-store-api/unit_tests/model/raw_pagination.rs b/crates/ksp-store-api/unit_tests/model/raw_pagination.rs index 8e3d3df..974eee8 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_pagination.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_pagination.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-api/unit_tests/model/raw_pagination.rs -// version: 1 +// version: 2 #[test] fn page_limit_rejects_only_zero_and_keeps_no_ksp_policy_maximum() { @@ -32,7 +32,7 @@ fn cursor_is_opaque_bounded_and_debug_does_not_render_bytes() { #[test] fn transaction_query_preserves_caller_limit_range_direction_and_network() { - let network = match crate::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match crate::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; @@ -45,7 +45,7 @@ fn transaction_query_preserves_caller_limit_range_direction_and_network() { std::result::Result::Err(_) => return, }; let query = crate::RawTransactionQuery::new(network, slots, crate::RawSortDirection::Ascending, crate::RawPageRequest::first(limit)); - assert_eq!(query.network().as_str(), "mainnet-beta"); + assert_eq!(query.network().as_str(), "mainnet"); assert_eq!(query.slots().start_inclusive(), std::option::Option::Some(10)); assert_eq!(query.page().limit().get(), 5_000_000); assert_eq!(query.direction(), crate::RawSortDirection::Ascending); diff --git a/crates/ksp-store-api/unit_tests/model/raw_primitives.rs b/crates/ksp-store-api/unit_tests/model/raw_primitives.rs index a195f2c..e2a2eee 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_primitives.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_primitives.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-api/unit_tests/model/raw_primitives.rs -// version: 1 +// version: 2 fn code(value: &str) -> std::option::Option { return match crate::RawProvenanceCode::new(value.to_owned()) { @@ -17,7 +17,7 @@ fn timestamp(unix_millis: u64) -> std::option::Option { #[test] fn raw_codes_are_bounded_nonempty_and_reject_url_like_or_control_values() { - let network = crate::RawNetworkId::new("mainnet-beta".to_owned()); + let network = crate::RawNetworkId::new("mainnet".to_owned()); assert!(network.is_ok()); let format = crate::RawFormatId::new("ksp.solana.raw_transaction".to_owned()); assert!(format.is_ok()); diff --git a/crates/ksp-store-api/unit_tests/model/raw_retention.rs b/crates/ksp-store-api/unit_tests/model/raw_retention.rs index 71087d3..3401a0f 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_retention.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_retention.rs @@ -1,8 +1,8 @@ // file: crates/ksp-store-api/unit_tests/model/raw_retention.rs -// version: 2 +// version: 3 fn reference() -> std::option::Option { - let network = match crate::RawNetworkId::new("mainnet-beta".to_owned()) { + let network = match crate::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return std::option::Option::None, }; diff --git a/crates/ksp-store-api/unit_tests/model/raw_transaction.rs b/crates/ksp-store-api/unit_tests/model/raw_transaction.rs index b8d8a7b..bae4bda 100644 --- a/crates/ksp-store-api/unit_tests/model/raw_transaction.rs +++ b/crates/ksp-store-api/unit_tests/model/raw_transaction.rs @@ -1,8 +1,8 @@ // file: crates/ksp-store-api/unit_tests/model/raw_transaction.rs -// version: 1 +// version: 2 fn network() -> std::option::Option { - return match crate::RawNetworkId::new("mainnet-beta".to_owned()) { + return match crate::RawNetworkId::new("mainnet".to_owned()) { std::result::Result::Ok(value) => std::option::Option::Some(value), std::result::Result::Err(_) => std::option::Option::None, }; @@ -57,7 +57,7 @@ fn raw_transaction_identity_is_network_plus_signature_and_payload_remains_whole( let signature = crate::RawTransactionSignature::new([9_u8; 64]); let reference = crate::RawTransactionReference::new(network, signature); let transaction = crate::RawTransaction::new(reference, 42, std::option::Option::None, payload); - assert_eq!(transaction.reference().network().as_str(), "mainnet-beta"); + assert_eq!(transaction.reference().network().as_str(), "mainnet"); assert_eq!(transaction.reference().signature(), signature); assert_eq!(transaction.slot(), 42); assert!(transaction.block_time().is_none()); diff --git a/crates/ksp-store-postgres-lib/unit_tests/raw_account.rs b/crates/ksp-store-postgres-lib/unit_tests/raw_account.rs index 6095d21..3a624c7 100644 --- a/crates/ksp-store-postgres-lib/unit_tests/raw_account.rs +++ b/crates/ksp-store-postgres-lib/unit_tests/raw_account.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/unit_tests/raw_account.rs -// version: 7 +// version: 8 fn network() -> ksp_store_api::RawNetworkId { return match ksp_store_api::RawNetworkId::new("devnet") { @@ -311,7 +311,7 @@ fn pre_004_account_observation_rejects_hostile_rows_without_echoing_values() { #[test] fn pre_004_account_wrong_network_guard_is_pre_io_and_static() { let backend = network(); - let foreign = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let foreign = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), }; @@ -343,7 +343,7 @@ fn pre_005_account_acquisition_input_guard_requires_network_and_exact_reference( std::result::Result::Err(error) => panic!("valid account observation rejected: {error:?}"), }; assert!(super::ensure_acquisition_inputs(&backend, &valid_state, &valid_observation).is_ok()); - let foreign = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let foreign = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), }; @@ -437,7 +437,7 @@ fn pre_005_account_origin_encoding_is_exact_and_static() { #[test] fn pre_006_additional_observation_input_guard_rejects_wrong_network_before_io() { let backend = network(); - let foreign = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let foreign = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), }; @@ -532,7 +532,7 @@ fn pre_007_account_cursor_rejects_replay_across_query_context_and_transaction_fa std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid account cursor encoding rejected: {error:?}"), }; - let other_network = page_query("mainnet-beta", Some(pubkey), Some(10), Some(20), ksp_store_api::RawSortDirection::Ascending); + let other_network = page_query("mainnet", Some(pubkey), Some(10), Some(20), ksp_store_api::RawSortDirection::Ascending); let other_pubkey = page_query("devnet", Some(ksp_store_api::Pubkey::new_from_array([6_u8; 32])), Some(10), Some(20), ksp_store_api::RawSortDirection::Ascending); let other_direction = page_query("devnet", Some(pubkey), Some(10), Some(20), ksp_store_api::RawSortDirection::Descending); diff --git a/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs b/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs index 2a0cf32..30575ea 100644 --- a/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs +++ b/crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs @@ -1,5 +1,5 @@ // file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs -// version: 5 +// version: 6 fn network() -> ksp_store_api::RawNetworkId { return match ksp_store_api::RawNetworkId::new("devnet") { @@ -271,7 +271,7 @@ fn v0_3_8_pre_004_inspection_summary_rejects_physical_retention_shape_residue() #[test] fn pre_004_wrong_network_is_rejected_by_the_private_pre_io_guard() { let backend_network = network(); - let other_network = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let other_network = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), }; @@ -330,7 +330,7 @@ fn pre_005_atomic_acquisition_pre_io_guard_requires_backend_network_and_exact_re let mismatched = observation(other_reference, 4, "publicnode"); let mismatch = super::ensure_acquisition_inputs(&backend_network, &raw_transaction, &mismatched); assert_eq!(mismatch.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::Conflict)); - let other_network = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let other_network = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), }; @@ -508,7 +508,7 @@ fn pre_006_cursor_v1_rejects_replay_across_network_direction_and_range() { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid cursor encoding rejected: {error:?}"), }; - let other_network = page_query("mainnet-beta", Some(10), Some(20), ksp_store_api::RawSortDirection::Ascending, None); + let other_network = page_query("mainnet", Some(10), Some(20), ksp_store_api::RawSortDirection::Ascending, None); let other_direction = page_query("devnet", Some(10), Some(20), ksp_store_api::RawSortDirection::Descending, None); let other_range = page_query("devnet", Some(11), Some(20), ksp_store_api::RawSortDirection::Ascending, None); for candidate in [&other_network, &other_direction, &other_range] { @@ -640,7 +640,7 @@ fn pre_007_compacted_transitions_are_rejected_by_the_pre_io_guard() { #[test] fn pre_007_retention_transition_pre_io_guard_rejects_wrong_network() { let backend_network = network(); - let other_network = match ksp_store_api::RawNetworkId::new("mainnet-beta") { + let other_network = match ksp_store_api::RawNetworkId::new("mainnet") { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), }; diff --git a/deltas/0.3.9/pre.006-fix.003.md b/deltas/0.3.9/pre.006-fix.003.md new file mode 100644 index 0000000..fef7809 --- /dev/null +++ b/deltas/0.3.9/pre.006-fix.003.md @@ -0,0 +1,52 @@ + + + +# Delta v0.3.9-pre.006-fix.003 — canonicalisation technique `mainnet` + +## 1. Objet + +Ce correctif matérialise la décision documentaire de `pre.006-fix.002` : l'identité logique KSP du réseau de production Solana devient `mainnet` dans les configurations runtime, exemples, fixtures et tests concernés. `mainnet-beta` reste un alias legacy/externe ou un libellé historique/provider, pas une seconde identité persistée KSP. + +## 2. Changements runtime/configuration + +- `std.store` et son exemple utilisent désormais `network = mainnet` pour le profil Mainnet ; +- `std.transport`, son exemple et les fixtures utilisent `cluster = mainnet` pour les endpoints Mainnet ; +- les endpoints publics Solana engagés passent à `https://api.mainnet.solana.com` et `wss://api.mainnet.solana.com` ; +- `.env.example` suit ces endpoints ; +- aucune migration des données N1 RAW n'est ajoutée : la base de test peut être droppée/recréée si elle contient encore l'identité `mainnet-beta`. + +## 3. Tests et documentation durable + +Les canaries Config, Store API/PostgreSQL, Job Backfill, Backfill Desk et Store Desk concernées utilisent `mainnet`. Les guides Config/Transport et les owners d'architecture sont synchronisés. Les occurrences historiques de `mainnet-beta` dans les anciens plans/deltas restent volontairement intactes. + +Le gate opérateur fourni le 5 septembre 2026 couvre : + +```text +Rust rule audits PASS +Markdown audit PASS (332 tables, 742 files) +cargo check --workspace PASS +clippy all-targets/all-features PASS (-D warnings) +cargo test workspace all targets PASS (live/diagnostic smokes ignored by policy) +5 x Tauri deb/rpm bundles PASS +cargo tree --duplicates executed +``` + +Les smokes live restent opt-in. La documentation Solana courante confirme les nouveaux endpoints publics Mainnet HTTP/WSS ; aucune preuve live supplémentaire n'est exigée pour accepter ce correctif. + +## 4. Version + +La livraison est `0.3.9-pre.006-fix.003`. Comme elle modifie de la configuration exécutable, `workspace.package.version` devient : + +```text +0.3.9-pre.6.fix.3 +``` + +Cette forme respecte `VER-ID-007` et `VER-ID-010`. La forme locale intermédiaire `0.3.9-pre.6-fix.3` utilisée pour le premier gate n'est pas retenue comme version Cargo canonique. + +## 5. Hors périmètre + +- aucune migration SQL ; +- aucun alias automatique `mainnet-beta -> mainnet` dans Store ; +- aucun changement de logique Worker/Job ; +- aucun ajout de provider ; +- aucun changement des libellés externes lorsqu'un provider les publie réellement sous `mainnet-beta`. diff --git a/docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md b/docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md index 8d83b57..a1ef81e 100644 --- a/docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md +++ b/docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md @@ -1,5 +1,5 @@ - + # Acquisition, workers, jobs et pipelines spécialisés @@ -204,20 +204,11 @@ L'archive kbot3 doit être relue uniquement comme **référence fonctionnelle** #### `mainnet` et `mainnet-beta` -La terminologie réseau est un audit explicite avant toute modification. Les sources Solana actuelles utilisent de plus en plus `mainnet` alors que plusieurs surfaces/outils historiques conservent `mainnet-beta`. +L'audit `0.3.9` a conclu que `mainnet` est l'identité logique canonique KSP du réseau de production Solana. `mainnet-beta` reste un alias legacy/externe ou un libellé provider lorsqu'une API externe l'emploie réellement ; il ne constitue plus l'identité persistée cible de Store/RAW/Config. -KSP ne doit jamais créer deux identités persistées pour le même cluster par simple renommage. L'audit doit donc inventorier : +Depuis `0.3.9-pre.006-fix.003`, les profils Mainnet engagés dans Config/Store/Transport utilisent `mainnet`, de même que les tests et exemples runtime associés. KSP ne crée donc pas deux identités persistées pour le même cluster. Les anciennes données N1 RAW portant `mainnet-beta` sont considérées comme expérimentales et peuvent être droppées/recréées ; aucune migration destructive n'est imposée avant finalisation des Jobs/Workers RAW. -```text -RawNetworkId et valeurs persistées Store -Config profile ids / cluster labels -Transport descriptors et provider metadata -CLI/external aliases réellement acceptés -compatibilité des checkpoints/fingerprints existants -migration ou canonicalisation éventuellement nécessaire -``` - -Aucun renommage de données persistées ou de profil n'est effectué en `0.3.8`. `0.3.10` ne l'implémente que si l'audit `0.3.9` établit une stratégie de compatibilité sûre. +Les frontières externes restent libres de documenter ou d'accepter un nom provider legacy lorsque nécessaire, sans recopier ce nom dans `RawNetworkId` canonique. #### Idempotence et multi-source @@ -527,7 +518,7 @@ selon les capacités réellement introduites. - nom final de la crate pipeline RAW si la réutilisation worker + backfill justifie réellement une crate dédiée ; - taxonomie exacte des stratégies/source capabilities de `ksp-worker-raw-transaction-ingest-lib`, à décider par l'audit de fin `0.3.9` ; -- stratégie sûre de canonicalisation/aliasing `mainnet` / `mainnet-beta`, si un changement KSP est réellement nécessaire ; +- politique d'alias externe `mainnet-beta` à matérialiser uniquement aux frontières qui en ont réellement besoin, sans créer une seconde identité Store ; - modèle de claim/lease PostgreSQL pour les futurs processors continus ; - taille de batch et stratégie backpressure des workers de processing ; - découpage des workers DECODE/SPECIALIZED par groupe lorsque les premiers groupes existent ; diff --git a/docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md b/docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md index a2892ca..6f37df1 100644 --- a/docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md +++ b/docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md @@ -1,5 +1,5 @@ - + # Acquisition et alimentation `RawTransaction` @@ -609,7 +609,7 @@ priorités/composition Les prix/tiers d'audit ne doivent pas devenir une politique runtime. -`mainnet` devient l'identité réseau durable KSP. `mainnet-beta` reste uniquement un alias de compatibilité/historique ou un libellé externe lorsqu'un provider/API l'emploie. La phase N1 RAW étant encore une phase de test, aucune donnée existante ne doit forcer la conservation de `mainnet-beta` comme identité canonique : la base peut être droppée/recréée lors de la normalisation si nécessaire. +`mainnet` est l'identité réseau durable KSP. `mainnet-beta` reste uniquement un alias de compatibilité/historique ou un libellé externe lorsqu'un provider/API l'emploie. Depuis `0.3.9-pre.006-fix.003`, les profils Config/Store/Transport Mainnet engagés utilisent `mainnet` comme identité logique, et les exemples/tests associés ont été normalisés. Les endpoints publics Solana engagés suivent également la nomenclature Mainnet courante (`https://api.mainnet.solana.com` et `wss://api.mainnet.solana.com`). Aucune migration de données N1 n'est exigée : les données RAW Mainnet encore expérimentales peuvent être droppées/recréées si elles portent l'ancienne identité. ## 13. Normalisation RAW commune sans couplage Job/Worker diff --git a/docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md b/docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md index 1336553..f1f5ebd 100644 --- a/docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md +++ b/docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md @@ -1,5 +1,5 @@ - + # Plan v0.3.9 — Worker API générique + audit RAW Transaction @@ -612,6 +612,12 @@ Réécriture complète de `docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md` La synthèse corrige la direction de compatibilité réseau : `mainnet` devient l'identité KSP canonique et `mainnet-beta` devient un alias legacy/externe, jamais l'inverse. Les libellés provider natifs qui utilisent encore `mainnet-beta` restent documentés comme tels, sans imposer cette valeur à l'identité Store. La base N1 RAW actuelle reste jetable tant que Jobs/Workers d'acquisition ne sont pas finalisés ; aucune donnée de test existante ne justifie donc de figer une convention de nommage indésirable. La normalisation runtime/Config/Store correspondante est un handoff technique ultérieur, pas un changement de code `0.3.9`. `workspace.package.version` reste `0.3.9-pre.6`. +#### `pre.006-fix.003` — normalisation runtime/config de l'identité Mainnet + +**Statut : réalisé ; correctif configuration/runtime + tests.** + +La décision de `pre.006-fix.002` est matérialisée immédiatement pendant N1 RAW : les identités Mainnet engagées dans `std.store`, `std.transport`, leurs exemples/fixtures et les tests Store/Backfill passent de `mainnet-beta` à `mainnet`. Les endpoints publics Solana engagés utilisent la nomenclature courante `api.mainnet.solana.com` / `wss://api.mainnet.solana.com`. Les anciens RAW N1 restent jetables ; aucune migration de compatibilité n'est ajoutée. Les libellés historiques/provider `mainnet-beta` restent documentés lorsqu'ils décrivent réellement une source externe ou l'historique du projet. Ce correctif synchronise Cargo en `0.3.9-pre.6.fix.3` conformément à `VER-ID-007` et `VER-ID-010`. + ### `pre.007` — gate technique final **Statut : prévu.** diff --git a/docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md b/docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md index 0f45508..d400eab 100644 --- a/docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md +++ b/docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md @@ -1,5 +1,5 @@ - + # Validation v0.3.9 — Worker API + audit RAW Transaction @@ -234,6 +234,17 @@ Aucun item ci-dessous n’est déclaré exécuté en `pre.001`. - [X] Aucun changement runtime/Config/Store n'est effectué dans ce correctif documentaire ; la migration technique reste un handoff ultérieur. - [X] `workspace.package.version` reste `0.3.9-pre.6`. +#### `pre.006-fix.003` — normalisation technique `mainnet` + +- [X] `config/std.store.json` et son exemple utilisent `network = mainnet` pour le profil Mainnet. +- [X] `config/std.transport.json`, son exemple et les fixtures utilisent `cluster = mainnet` pour l'identité logique KSP. +- [X] Les endpoints publics engagés utilisent `https://api.mainnet.solana.com` et `wss://api.mainnet.solana.com`. +- [X] Les tests Config, Store API/PostgreSQL, Job Backfill et Backfill/Store Desk concernés utilisent la nouvelle identité canonique. +- [X] Les anciens libellés `mainnet-beta` ne subsistent que dans l'historique documentaire, les anciens deltas/plans ou comme description explicite de l'alias/provider externe. +- [X] Aucun mécanisme de migration des données N1 n'est ajouté ; drop/recréation de la base de test reste admis. +- [X] Gate opérateur complet fourni : audits propres, check/clippy PASS, workspace `--all-targets --all-features` PASS et cinq bundles Desk PASS ; smokes live restent opt-in/ignored. +- [X] Version Cargo corrigée pour la livraison en `0.3.9-pre.6.fix.3` (`VER-ID-010`). + ## 7. Couloirs de fermeture ### `pre.007` — gate technique final @@ -281,4 +292,4 @@ Après la synthèse multi-source `pre.006`, l'état courant est : workspace.package.version = 0.3.9-pre.6 ``` -`pre.002` reste la tranche non-fix `0.3.9-pre.2`. Les correctifs de conformité/compilation portent successivement `0.3.9-pre.2.fix.1` puis `0.3.9-pre.2.fix.2` conformément à `VER-ID-007` et `VER-ID-010`. `pre.003` reprend ensuite la séquence prerelease normale avec `0.3.9-pre.3`; son gate opérateur est PASS et freeze Worker API. `pre.004` poursuit avec `0.3.9-pre.4` sans changement runtime, uniquement l'audit standard Solana/KSP et la création de l'owner durable d'acquisition. `pre.005` passe à `0.3.9-pre.5` et enrichit cet owner avec l'audit Helius/Yellowstone/providers/kbot3 sans modifier le runtime. `pre.006` passe à `0.3.9-pre.6` et ferme la synthèse exhaustive possibilités/support/preuve ainsi que les handoffs `0.3.10`/`0.3.12`, toujours sans changement runtime. `pre.006-fix.001` réécrit ensuite l'owner d'architecture comme synthèse Store-centrique et corrige la séparation Worker live / Job historique sans modifier Cargo. L'état précédent `0.3.9-pre.1.fix.2` reste documenté dans `pre.001-fix.002`. +`pre.002` reste la tranche non-fix `0.3.9-pre.2`. Les correctifs de conformité/compilation portent successivement `0.3.9-pre.2.fix.1` puis `0.3.9-pre.2.fix.2` conformément à `VER-ID-007` et `VER-ID-010`. `pre.003` reprend ensuite la séquence prerelease normale avec `0.3.9-pre.3`; son gate opérateur est PASS et freeze Worker API. `pre.004` poursuit avec `0.3.9-pre.4` sans changement runtime, uniquement l'audit standard Solana/KSP et la création de l'owner durable d'acquisition. `pre.005` passe à `0.3.9-pre.5` et enrichit cet owner avec l'audit Helius/Yellowstone/providers/kbot3 sans modifier le runtime. `pre.006` passe à `0.3.9-pre.6` et ferme la synthèse exhaustive possibilités/support/preuve ainsi que les handoffs `0.3.10`/`0.3.12`. `pre.006-fix.001` réécrit ensuite l'owner d'architecture comme synthèse Store-centrique et corrige la séparation Worker live / Job historique sans modifier Cargo ; `pre.006-fix.002` fixe `mainnet` comme identité canonique sans runtime. `pre.006-fix.003` matérialise finalement cette normalisation dans Config/Store/Transport/tests et porte la version Cargo `0.3.9-pre.6.fix.3`. L'état précédent `0.3.9-pre.1.fix.2` reste documenté dans `pre.001-fix.002`.