v0.3.9-pre.006-fix.003

This commit is contained in:
2026-09-05 13:53:36 +02:00
parent c3c9a80310
commit 9a998e7b52
36 changed files with 186 additions and 131 deletions

View File

@@ -1,5 +1,5 @@
# file: .env.example # file: .env.example
# version: 13 # version: 14
# KSP Logging root directory. Used by config/std.logging.json for relative log output paths. # 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. # 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 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. # 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. # 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-beta.solana.com KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL=https://api.mainnet.solana.com
# Optional public Solana Devnet WebSocket endpoint override used by config/std.transport.json. # 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. # 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 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. # 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. # 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-beta.solana.com 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. # 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. # Keep provider credentials in a KSP_SECRET_* variable; do not copy a real credential-bearing URL into committed JSON.

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 483 # version: 484
[workspace] [workspace]
resolver = "3" 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"] 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] [workspace.package]
version = "0.3.9-pre.6" version = "0.3.9-pre.6.fix.3"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

View File

@@ -1,5 +1,5 @@
<!-- file: ROADMAP.md --> <!-- file: ROADMAP.md -->
<!-- version: 103 --> <!-- version: 104 -->
# Roadmap KSP # 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 nest exposé. - [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 nest 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. - [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.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.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. - [ ] `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 dadmission 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** — maintenir la matrice dadmission 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 `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 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. - [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 dexécution `slot + signature + outcome`; réauditer séparément `signatureSubscribe` et `getSignatureStatuses` lorsquun consumer de commitment/snapshot réel apparaît, sans fusionner snapshot, transition et execution update dans un modèle Option-soup. - [ ] **TODO** — statut/commitment transactionnel restant : `0.3.5` couvre uniquement le fait passif dexécution `slot + signature + outcome`; réauditer séparément `signatureSubscribe` et `getSignatureStatuses` lorsquun 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 dun 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-*`. - [ ] **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 dun 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-*`.

View File

@@ -29,7 +29,7 @@
}, },
{ {
"profile_id": "mainnet", "profile_id": "mainnet",
"network": "mainnet-beta", "network": "mainnet",
"backend": "postgres", "backend": "postgres",
"postgres": { "postgres": {
"connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}",

View File

@@ -31,8 +31,8 @@
"name": "mainnet_public", "name": "mainnet_public",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 15000, "request_timeout_ms": 15000,
"max_idle_connections_per_host": 8, "max_idle_connections_per_host": 8,
@@ -57,7 +57,7 @@
"name": "mainnet_private", "name": "mainnet_private",
"enabled": true, "enabled": true,
"provider": "private-provider", "provider": "private-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "${KSP_SECRET_SOLANA_HTTP_URL:-https://example.invalid}", "url": "${KSP_SECRET_SOLANA_HTTP_URL:-https://example.invalid}",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 10000, "request_timeout_ms": 10000,
@@ -85,15 +85,15 @@
"name": "mainnet_public_ws", "name": "mainnet_public_ws",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "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", "name": "mainnet_helius_ws",
"enabled": true, "enabled": true,
"provider": "helius", "provider": "helius",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "helius_laserstream", "kind": "helius_laserstream",
"url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-replace-me}", "url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-replace-me}",
"session": { "session": {

View File

@@ -29,7 +29,7 @@
}, },
{ {
"profile_id": "mainnet", "profile_id": "mainnet",
"network": "mainnet-beta", "network": "mainnet",
"backend": "postgres", "backend": "postgres",
"postgres": { "postgres": {
"connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}",

View File

@@ -144,8 +144,8 @@
"name": "solana_mainnet_public", "name": "solana_mainnet_public",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 15000, "request_timeout_ms": 15000,
"max_idle_connections_per_host": 8, "max_idle_connections_per_host": 8,
@@ -172,9 +172,9 @@
"name": "solana_mainnet_public_ws", "name": "solana_mainnet_public_ws",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "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", "name": "solana_mainnet_public",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 15000, "request_timeout_ms": 15000,
"max_idle_connections_per_host": 8, "max_idle_connections_per_host": 8,
@@ -225,7 +225,7 @@
"name": "publicnode_solana_mainnet_http", "name": "publicnode_solana_mainnet_http",
"enabled": true, "enabled": true,
"provider": "publicnode", "provider": "publicnode",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "https://solana-rpc.publicnode.com", "url": "https://solana-rpc.publicnode.com",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 15000, "request_timeout_ms": 15000,
@@ -267,9 +267,9 @@
"name": "solana_mainnet_public_ws", "name": "solana_mainnet_public_ws",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "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", "name": "solana_mainnet_public",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet-beta.solana.com}", "url": "${KSP_PUBLIC_SOLANA_MAINNET_HTTP_URL:-https://api.mainnet.solana.com}",
"connect_timeout_ms": 5000, "connect_timeout_ms": 5000,
"request_timeout_ms": 15000, "request_timeout_ms": 15000,
"max_idle_connections_per_host": 8, "max_idle_connections_per_host": 8,
@@ -308,9 +308,9 @@
"name": "solana_mainnet_public_ws", "name": "solana_mainnet_public_ws",
"enabled": true, "enabled": true,
"provider": "solana-public", "provider": "solana-public",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "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": [ "grpc_endpoints": [
@@ -318,7 +318,7 @@
"name": "publicnode_solana_mainnet_yellowstone", "name": "publicnode_solana_mainnet_yellowstone",
"enabled": true, "enabled": true,
"provider": "publicnode", "provider": "publicnode",
"cluster": "mainnet-beta", "cluster": "mainnet",
"protocol": "solana_yellowstone", "protocol": "solana_yellowstone",
"url": "https://solana-yellowstone-grpc.publicnode.com:443", "url": "https://solana-yellowstone-grpc.publicnode.com:443",
"secret_metadata": [ "secret_metadata": [

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs // file: crates/ksp-app-backfill-desk/unit_tests/backfill_request.rs
// version: 3 // version: 4
fn ready_options() -> crate::BackfillDeskOptionsDto { fn ready_options() -> crate::BackfillDeskOptionsDto {
let limits = crate::backfill_request_limits(); let limits = crate::backfill_request_limits();
@@ -22,7 +22,7 @@ fn ready_options() -> crate::BackfillDeskOptionsDto {
return crate::BackfillDeskOptionsDto { return crate::BackfillDeskOptionsDto {
commitments: crate::backfill_commitment_codes(), commitments: crate::backfill_commitment_codes(),
composition_ready: true, composition_ready: true,
configured_networks: vec!["mainnet-beta".to_owned()], configured_networks: vec!["mainnet".to_owned()],
http_routes: vec![ http_routes: vec![
crate::BackfillHttpRouteOptionDto { crate::BackfillHttpRouteOptionDto {
pooled: true, pooled: true,
@@ -36,7 +36,7 @@ fn ready_options() -> crate::BackfillDeskOptionsDto {
program_id_options: crate::program_id_autocomplete_options(), program_id_options: crate::program_id_autocomplete_options(),
scope_kinds: crate::backfill_scope_kind_codes(), scope_kinds: crate::backfill_scope_kind_codes(),
store_diagnostic: std::option::Option::None, 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, store_ready: true,
transport_diagnostic: std::option::Option::None, transport_diagnostic: std::option::Option::None,
transport_ready: true, 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::Ok(value) => value,
std::result::Result::Err(_) => return, 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.role().as_str(), "backfill_pool");
assert_eq!(mapped.commitment(), ksp_job_backfill_lib::BackfillCommitment::Finalized); assert_eq!(mapped.commitment(), ksp_job_backfill_lib::BackfillCommitment::Finalized);
assert_eq!(mapped.scope().kind(), ksp_job_backfill_lib::BackfillScopeKind::LatestAddress); 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 { if let std::result::Result::Ok(serialized) = serialized {
assert!(!serialized.contains("11111111111111111111111111111111")); assert!(!serialized.contains("11111111111111111111111111111111"));
assert!(!serialized.contains(&"1".repeat(64))); assert!(!serialized.contains(&"1".repeat(64)));
assert!(serialized.contains("mainnet-beta")); assert!(serialized.contains("mainnet"));
assert!(serialized.contains("backfill_pool")); assert!(serialized.contains("backfill_pool"));
} }
} }

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs // file: crates/ksp-app-backfill-desk/unit_tests/backfill_run.rs
// version: 3 // version: 4
#[test] #[test]
fn generated_run_ids_are_backend_owned_bounded_and_unique_in_session() { 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::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None, 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::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None, std::result::Result::Err(_) => return std::option::Option::None,
}; };

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs // file: crates/ksp-app-backfill-desk/unit_tests/backfill_status.rs
// version: 1 // version: 2
fn initial_notification() -> std::option::Option<ksp_job_api::JobNotification<ksp_job_backfill_lib::BackfillJobSnapshot>> { fn initial_notification() -> std::option::Option<ksp_job_api::JobNotification<ksp_job_backfill_lib::BackfillJobSnapshot>> {
let signature = match ksp_job_backfill_lib::BackfillSignature::new("1".repeat(ksp_job_backfill_lib::MIN_BACKFILL_SIGNATURE_TEXT_BYTES)) { 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<ksp_job_api::JobNotification<ks
std::result::Result::Ok(value) => value, std::result::Result::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None, 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::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None, std::result::Result::Err(_) => return std::option::Option::None,
}; };

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs // file: crates/ksp-app-backfill-desk/unit_tests/store_runtime.rs
// version: 1 // version: 2
#[test] #[test]
fn store_health_mapping_is_explicit_and_conservative() { fn store_health_mapping_is_explicit_and_conservative() {
@@ -10,7 +10,7 @@ fn store_health_mapping_is_explicit_and_conservative() {
#[test] #[test]
fn store_transport_network_coherence_requires_exact_logical_identity() { fn store_transport_network_coherence_requires_exact_logical_identity() {
assert!(super::validate_network_coherence("devnet", "devnet").is_ok()); 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()); assert!(mismatch.is_err());
if let std::result::Result::Err(error) = mismatch { if let std::result::Result::Err(error) = mismatch {
assert_eq!(error.code(), crate::ERROR_CODE_STORE_NETWORK_MISMATCH); assert_eq!(error.code(), crate::ERROR_CODE_STORE_NETWORK_MISMATCH);

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-store-desk/unit_tests/dto_common.rs // file: crates/ksp-app-store-desk/unit_tests/dto_common.rs
// version: 2 // version: 3
#[test] #[test]
fn command_error_projection_keeps_only_stable_public_fields() { 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, diagnostic: std::option::Option::None,
health_state: "ready".to_owned(), health_state: "ready".to_owned(),
migration_version_decimal: std::option::Option::Some("2".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, pending_migration_count: 0,
pool_available: 1, pool_available: 1,
pool_capacity: 8, pool_capacity: 8,

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-config-lib/USAGE.md --> <!-- file: crates/ksp-config-lib/USAGE.md -->
<!-- version: 14 --> <!-- version: 15 -->
# Utilisation de ksp-config-lib # Utilisation de ksp-config-lib
@@ -250,7 +250,7 @@ Targets committed :
```text ```text
devnet -> network devnet -> KSP_SECRET_STORE_DEVNET_POSTGRES_URI 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 testnet -> network testnet -> KSP_SECRET_STORE_TESTNET_POSTGRES_URI
``` ```

View File

@@ -29,7 +29,7 @@
}, },
{ {
"profile_id": "mainnet", "profile_id": "mainnet",
"network": "mainnet-beta", "network": "mainnet",
"backend": "postgres", "backend": "postgres",
"postgres": { "postgres": {
"connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}", "connection_uri": "${KSP_SECRET_STORE_MAINNET_POSTGRES_URI:-postgresql://localhost/ksp_mainnet}",

View File

@@ -76,7 +76,7 @@
"name": "fixture_helius_ws", "name": "fixture_helius_ws",
"enabled": true, "enabled": true,
"provider": "helius", "provider": "helius",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "helius_laserstream", "kind": "helius_laserstream",
"url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-fixture-helius-key}" "url": "wss://mainnet.helius-rpc.com/?api-key=${KSP_SECRET_HELIUS_API_KEY:-fixture-helius-key}"
} }

View File

@@ -45,7 +45,7 @@
"name": "fixture_http", "name": "fixture_http",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "https://fallback.invalid", "url": "https://fallback.invalid",
"connect_timeout_ms": 1000, "connect_timeout_ms": 1000,
"request_timeout_ms": 3000, "request_timeout_ms": 3000,
@@ -73,7 +73,7 @@
"name": "fixture_ws", "name": "fixture_ws",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "kind": "solana_standard",
"url": "wss://fallback.invalid" "url": "wss://fallback.invalid"
} }
@@ -83,7 +83,7 @@
"name": "fixture_grpc", "name": "fixture_grpc",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"protocol": "solana_yellowstone", "protocol": "solana_yellowstone",
"url": "https://grpc.invalid", "url": "https://grpc.invalid",
"metadata": [ "metadata": [
@@ -115,7 +115,7 @@
"name": "fixture_http", "name": "fixture_http",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "https://fallback.invalid", "url": "https://fallback.invalid",
"connect_timeout_ms": 1000, "connect_timeout_ms": 1000,
"request_timeout_ms": 3000, "request_timeout_ms": 3000,
@@ -143,7 +143,7 @@
"name": "fixture_ws", "name": "fixture_ws",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "kind": "solana_standard",
"url": "wss://fallback.invalid" "url": "wss://fallback.invalid"
} }
@@ -153,7 +153,7 @@
"name": "fixture_grpc", "name": "fixture_grpc",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"protocol": "solana_yellowstone", "protocol": "solana_yellowstone",
"url": "https://grpc.invalid", "url": "https://grpc.invalid",
"metadata": [ "metadata": [
@@ -180,7 +180,7 @@
"name": "fixture_http", "name": "fixture_http",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"url": "https://fallback.invalid", "url": "https://fallback.invalid",
"connect_timeout_ms": 1000, "connect_timeout_ms": 1000,
"request_timeout_ms": 3000, "request_timeout_ms": 3000,
@@ -208,7 +208,7 @@
"name": "fixture_ws", "name": "fixture_ws",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"kind": "solana_standard", "kind": "solana_standard",
"url": "wss://fallback.invalid" "url": "wss://fallback.invalid"
} }
@@ -218,7 +218,7 @@
"name": "fixture_grpc", "name": "fixture_grpc",
"enabled": true, "enabled": true,
"provider": "fixture-provider", "provider": "fixture-provider",
"cluster": "mainnet-beta", "cluster": "mainnet",
"protocol": "solana_yellowstone", "protocol": "solana_yellowstone",
"url": "https://grpc.invalid", "url": "https://grpc.invalid",
"metadata": [], "metadata": [],

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-config-lib/unit_tests/store.rs // file: crates/ksp-config-lib/unit_tests/store.rs
// version: 4 // version: 5
#[test] #[test]
fn committed_store_profile_maps_exact_runtime_settings_and_secret_fallback() { 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()); let environment = crate::ConfigEnvironment::from_maps(process, std::collections::BTreeMap::new());
for (target_id, network, expected_uri) in [ for (target_id, network, expected_uri) in [
("devnet", "devnet", "postgresql://devnet.invalid/ksp_devnet"), ("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"), ("testnet", "testnet", "postgresql://testnet.invalid/ksp_testnet"),
] { ] {
let resolved = engine.load_resolved_store_config(std::option::Option::Some(target_id), &environment); let resolved = engine.load_resolved_store_config(std::option::Option::Some(target_id), &environment);

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-config-lib/unit_tests/transport.rs // file: crates/ksp-config-lib/unit_tests/transport.rs
// version: 12 // version: 13
#[test] #[test]
fn fixture_transport_profile_maps_complete_runtime_contract() { 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]; let helius = &ws.endpoints()[1];
assert_eq!(helius.name(), "fixture_helius_ws"); assert_eq!(helius.name(), "fixture_helius_ws");
assert_eq!(helius.provider().as_str(), "helius"); 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.protocol(), ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream);
assert_eq!(helius.url().as_str(), "wss://mainnet.helius-rpc.com/?api-key=fixture-helius-key"); 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()); 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 { if let std::result::Result::Ok(mainnet) = mainnet {
assert_eq!(mainnet.profile_id(), "mainnet_public"); assert_eq!(mainnet.profile_id(), "mainnet_public");
assert_eq!(mainnet.selection_source(), crate::ConfigProfileSelectionSource::Explicit); 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].cluster().as_str(), "mainnet");
assert_eq!(mainnet.settings().endpoints()[0].url().as_str(), "https://api.mainnet-beta.solana.com"); 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"); assert!(mainnet.grpc_settings().is_none(), "generic Mainnet profile must stay distinct from the PublicNode gRPC profile");
let ws = mainnet.ws_settings(); let ws = mainnet.ws_settings();
assert!(ws.is_some(), "committed V3 Mainnet profile should expose WebSocket settings"); assert!(ws.is_some(), "committed V3 Mainnet profile should expose WebSocket settings");
if let std::option::Option::Some(ws) = ws { 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_mainnet",
"publicnode_solana_mainnet_yellowstone", "publicnode_solana_mainnet_yellowstone",
"mainnet-beta", "mainnet",
"https://solana-yellowstone-grpc.publicnode.com:443", "https://solana-yellowstone-grpc.publicnode.com:443",
"KSP_SECRET_PUBLICNODE_MAINNET_GRPC_X_TOKEN", "KSP_SECRET_PUBLICNODE_MAINNET_GRPC_X_TOKEN",
"PUBLICNODE-MAINNET-GRPC-X-TOKEN-CANARY", "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); assert_eq!(ws.endpoints().len(), 2);
let endpoint = &ws.endpoints()[1]; let endpoint = &ws.endpoints()[1];
assert_eq!(endpoint.provider().as_str(), "helius"); 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.protocol(), ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream);
assert_eq!(endpoint.url().as_str(), "wss://mainnet.helius-rpc.com/?api-key=helius-api-key-canary"); assert_eq!(endpoint.url().as_str(), "wss://mainnet.helius-rpc.com/?api-key=helius-api-key-canary");
} }

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-job-backfill-lib/unit_tests/request.rs // file: crates/ksp-job-backfill-lib/unit_tests/request.rs
// version: 2 // version: 3
fn signature(character: char) -> std::option::Option<crate::BackfillSignature> { fn signature(character: char) -> std::option::Option<crate::BackfillSignature> {
return match crate::BackfillSignature::new(character.to_string().repeat(crate::MIN_BACKFILL_SIGNATURE_TEXT_BYTES)) { 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] #[test]
fn pre_011_resume_reissues_checkpoint_for_new_job_without_changing_scope_semantics() { 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::Some(value) => value,
std::option::Option::None => return, std::option::Option::None => return,
}; };

View File

@@ -1,5 +1,5 @@
<!-- file: crates/ksp-onchain-transport-lib/USAGE.md --> <!-- file: crates/ksp-onchain-transport-lib/USAGE.md -->
<!-- version: 23 --> <!-- version: 24 -->
# Utilisation de `ksp-onchain-transport-lib` # Utilisation de `ksp-onchain-transport-lib`
@@ -281,7 +281,7 @@ let grpc_endpoint = match ksp_onchain_transport_lib::YellowstoneGrpcEndpointSett
"publicnode_mainnet_yellowstone", "publicnode_mainnet_yellowstone",
true, true,
ksp_onchain_transport_lib::YellowstoneGrpcProviderName::new("publicnode"), ksp_onchain_transport_lib::YellowstoneGrpcProviderName::new("publicnode"),
ksp_onchain_transport_lib::YellowstoneGrpcClusterName::new("mainnet-beta"), ksp_onchain_transport_lib::YellowstoneGrpcClusterName::new("mainnet"),
grpc_url, grpc_url,
ksp_onchain_transport_lib::YellowstoneGrpcSessionSettings::default(), ksp_onchain_transport_lib::YellowstoneGrpcSessionSettings::default(),
) )

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-onchain-transport-lib/tests/yellowstone_publicnode_smoke.rs // 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. //! Opt-in live PublicNode Mainnet/Testnet smokes for authenticated provider-neutral Yellowstone gRPC Subscribe.
@@ -146,12 +146,7 @@ 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"] #[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() { async fn publicnode_mainnet_yellowstone_streams_slots_with_network_scoped_secret_x_token() {
let tokens = publicnode_x_tokens(); let tokens = publicnode_x_tokens();
assert_publicnode_slot_stream( assert_publicnode_slot_stream("publicnode_mainnet_yellowstone", "mainnet", "https://solana-yellowstone-grpc.publicnode.com:443", tokens.mainnet.as_str())
"publicnode_mainnet_yellowstone",
"mainnet-beta",
"https://solana-yellowstone-grpc.publicnode.com:443",
tokens.mainnet.as_str(),
)
.await; .await;
} }

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-api/tests/public_api.rs // file: crates/ksp-store-api/tests/public_api.rs
// version: 8 // version: 9
//! Integration canaries for the public `ksp-store-api` surface. //! 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] #[test]
fn public_pre_003_raw_transaction_and_observation_are_constructible_from_crate_root() { 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::Ok(value) => value,
std::result::Result::Err(_) => return, 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); 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.slot(), 123);
assert_eq!(transaction.payload().bytes(), &[1_u8, 2_u8, 3_u8]); 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!(observation.provenance().acquisition_method().as_str(), "getTransaction");
assert_eq!(ksp_store_api::ERROR_CODE_RAW_PAYLOAD_INVALID.domain(), "store_api"); assert_eq!(ksp_store_api::ERROR_CODE_RAW_PAYLOAD_INVALID.domain(), "store_api");
return; return;
@@ -83,7 +83,7 @@ fn public_pre_003_surface_keeps_backend_and_structural_types_out() {
#[test] #[test]
fn public_pre_004_raw_account_state_and_observation_are_constructible_from_crate_root() { 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::Ok(value) => value,
std::result::Result::Err(_) => return, 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::Ok(value) => value,
std::result::Result::Err(_) => return, 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::Ok(value) => value,
std::result::Result::Err(_) => return, std::result::Result::Err(_) => return,
}; };

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-api/tests/security_hardening.rs // file: crates/ksp-store-api/tests/security_hardening.rs
// version: 2 // version: 3
//! Adversarial and retention-race canaries for the Store API RAW foundation. //! 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!(!std::format!("{payload:?}").contains(HOSTILE_MARKER));
assert_eq!(std::format!("{:?}", payload.content_hash()), "RawContentHash(..)"); 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::Ok(value) => value,
std::result::Result::Err(_) => return, std::result::Result::Err(_) => return,
}; };
@@ -125,7 +125,7 @@ fn pre_007_retention_outcome_distinguishes_lost_compare_and_transition_race() {
#[test] #[test]
fn v0_3_8_pre_003_inspection_summaries_and_counts_reject_payload_shaped_or_inconsistent_state() { 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::Ok(value) => value,
std::result::Result::Err(_) => return, std::result::Result::Err(_) => return,
}; };

View File

@@ -1,8 +1,8 @@
// file: crates/ksp-store-api/unit_tests/model/raw_account.rs // file: crates/ksp-store-api/unit_tests/model/raw_account.rs
// version: 1 // version: 2
fn network() -> std::option::Option<crate::RawNetworkId> { fn network() -> std::option::Option<crate::RawNetworkId> {
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::Ok(value) => std::option::Option::Some(value),
std::result::Result::Err(_) => std::option::Option::None, std::result::Result::Err(_) => std::option::Option::None,
}; };

View File

@@ -1,10 +1,10 @@
// file: crates/ksp-store-api/unit_tests/model/raw_inspection.rs // file: crates/ksp-store-api/unit_tests/model/raw_inspection.rs
// version: 2 // version: 3
//! Unit tests for backend-neutral RAW inspection contracts. //! Unit tests for backend-neutral RAW inspection contracts.
fn network() -> std::option::Option<crate::RawNetworkId> { fn network() -> std::option::Option<crate::RawNetworkId> {
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::Ok(value) => std::option::Option::Some(value),
std::result::Result::Err(_) => std::option::Option::None, 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 = let transaction =
crate::RawTransactionInspectionQuery::new(network.clone(), slots, crate::RawSortDirection::Descending, crate::RawInspectionPageRequest::new(50, limit)); 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.page().offset(), 50);
assert_eq!(transaction.slots().end_inclusive(), std::option::Option::Some(20)); assert_eq!(transaction.slots().end_inclusive(), std::option::Option::Some(20));
assert_eq!(transaction.direction(), crate::RawSortDirection::Descending); assert_eq!(transaction.direction(), crate::RawSortDirection::Descending);

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-api/unit_tests/model/raw_pagination.rs // file: crates/ksp-store-api/unit_tests/model/raw_pagination.rs
// version: 1 // version: 2
#[test] #[test]
fn page_limit_rejects_only_zero_and_keeps_no_ksp_policy_maximum() { 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] #[test]
fn transaction_query_preserves_caller_limit_range_direction_and_network() { 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::Ok(value) => value,
std::result::Result::Err(_) => return, std::result::Result::Err(_) => return,
}; };
@@ -45,7 +45,7 @@ fn transaction_query_preserves_caller_limit_range_direction_and_network() {
std::result::Result::Err(_) => return, std::result::Result::Err(_) => return,
}; };
let query = crate::RawTransactionQuery::new(network, slots, crate::RawSortDirection::Ascending, crate::RawPageRequest::first(limit)); 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.slots().start_inclusive(), std::option::Option::Some(10));
assert_eq!(query.page().limit().get(), 5_000_000); assert_eq!(query.page().limit().get(), 5_000_000);
assert_eq!(query.direction(), crate::RawSortDirection::Ascending); assert_eq!(query.direction(), crate::RawSortDirection::Ascending);

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-api/unit_tests/model/raw_primitives.rs // file: crates/ksp-store-api/unit_tests/model/raw_primitives.rs
// version: 1 // version: 2
fn code(value: &str) -> std::option::Option<crate::RawProvenanceCode> { fn code(value: &str) -> std::option::Option<crate::RawProvenanceCode> {
return match crate::RawProvenanceCode::new(value.to_owned()) { return match crate::RawProvenanceCode::new(value.to_owned()) {
@@ -17,7 +17,7 @@ fn timestamp(unix_millis: u64) -> std::option::Option<crate::RawTimestamp> {
#[test] #[test]
fn raw_codes_are_bounded_nonempty_and_reject_url_like_or_control_values() { 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()); assert!(network.is_ok());
let format = crate::RawFormatId::new("ksp.solana.raw_transaction".to_owned()); let format = crate::RawFormatId::new("ksp.solana.raw_transaction".to_owned());
assert!(format.is_ok()); assert!(format.is_ok());

View File

@@ -1,8 +1,8 @@
// file: crates/ksp-store-api/unit_tests/model/raw_retention.rs // file: crates/ksp-store-api/unit_tests/model/raw_retention.rs
// version: 2 // version: 3
fn reference() -> std::option::Option<crate::RawTransactionReference> { fn reference() -> std::option::Option<crate::RawTransactionReference> {
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::Ok(value) => value,
std::result::Result::Err(_) => return std::option::Option::None, std::result::Result::Err(_) => return std::option::Option::None,
}; };

View File

@@ -1,8 +1,8 @@
// file: crates/ksp-store-api/unit_tests/model/raw_transaction.rs // file: crates/ksp-store-api/unit_tests/model/raw_transaction.rs
// version: 1 // version: 2
fn network() -> std::option::Option<crate::RawNetworkId> { fn network() -> std::option::Option<crate::RawNetworkId> {
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::Ok(value) => std::option::Option::Some(value),
std::result::Result::Err(_) => std::option::Option::None, 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 signature = crate::RawTransactionSignature::new([9_u8; 64]);
let reference = crate::RawTransactionReference::new(network, signature); let reference = crate::RawTransactionReference::new(network, signature);
let transaction = crate::RawTransaction::new(reference, 42, std::option::Option::None, payload); 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.reference().signature(), signature);
assert_eq!(transaction.slot(), 42); assert_eq!(transaction.slot(), 42);
assert!(transaction.block_time().is_none()); assert!(transaction.block_time().is_none());

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/unit_tests/raw_account.rs // file: crates/ksp-store-postgres-lib/unit_tests/raw_account.rs
// version: 7 // version: 8
fn network() -> ksp_store_api::RawNetworkId { fn network() -> ksp_store_api::RawNetworkId {
return match ksp_store_api::RawNetworkId::new("devnet") { return match ksp_store_api::RawNetworkId::new("devnet") {
@@ -311,7 +311,7 @@ fn pre_004_account_observation_rejects_hostile_rows_without_echoing_values() {
#[test] #[test]
fn pre_004_account_wrong_network_guard_is_pre_io_and_static() { fn pre_004_account_wrong_network_guard_is_pre_io_and_static() {
let backend = network(); 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), 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:?}"), std::result::Result::Err(error) => panic!("valid account observation rejected: {error:?}"),
}; };
assert!(super::ensure_acquisition_inputs(&backend, &valid_state, &valid_observation).is_ok()); 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), 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] #[test]
fn pre_006_additional_observation_input_guard_rejects_wrong_network_before_io() { fn pre_006_additional_observation_input_guard_rejects_wrong_network_before_io() {
let backend = network(); 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid foreign network rejected: {error:?}"), 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid account cursor encoding rejected: {error:?}"), 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 = 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); 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); let other_direction = page_query("devnet", Some(pubkey), Some(10), Some(20), ksp_store_api::RawSortDirection::Descending);

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs // file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
// version: 5 // version: 6
fn network() -> ksp_store_api::RawNetworkId { fn network() -> ksp_store_api::RawNetworkId {
return match ksp_store_api::RawNetworkId::new("devnet") { 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] #[test]
fn pre_004_wrong_network_is_rejected_by_the_private_pre_io_guard() { fn pre_004_wrong_network_is_rejected_by_the_private_pre_io_guard() {
let backend_network = 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), 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 mismatched = observation(other_reference, 4, "publicnode");
let mismatch = super::ensure_acquisition_inputs(&backend_network, &raw_transaction, &mismatched); 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)); 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid cursor encoding rejected: {error:?}"), 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_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); 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] { 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] #[test]
fn pre_007_retention_transition_pre_io_guard_rejects_wrong_network() { fn pre_007_retention_transition_pre_io_guard_rejects_wrong_network() {
let backend_network = 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::Ok(value) => value,
std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"), std::result::Result::Err(error) => panic!("valid alternate network rejected: {error:?}"),
}; };

View File

@@ -0,0 +1,52 @@
<!-- file: deltas/0.3.9/pre.006-fix.003.md -->
<!-- version: 1 -->
# 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`.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md --> <!-- file: docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md -->
<!-- version: 12 --> <!-- version: 13 -->
# Acquisition, workers, jobs et pipelines spécialisés # 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` #### `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 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.
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.
#### Idempotence et multi-source #### 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 ; - 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` ; - 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 ; - modèle de claim/lease PostgreSQL pour les futurs processors continus ;
- taille de batch et stratégie backpressure des workers de processing ; - taille de batch et stratégie backpressure des workers de processing ;
- découpage des workers DECODE/SPECIALIZED par groupe lorsque les premiers groupes existent ; - découpage des workers DECODE/SPECIALIZED par groupe lorsque les premiers groupes existent ;

View File

@@ -1,5 +1,5 @@
<!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md --> <!-- file: docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md -->
<!-- version: 5 --> <!-- version: 6 -->
# Acquisition et alimentation `RawTransaction` # Acquisition et alimentation `RawTransaction`
@@ -609,7 +609,7 @@ priorités/composition
Les prix/tiers d'audit ne doivent pas devenir une politique runtime. 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 ## 13. Normalisation RAW commune sans couplage Job/Worker

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md --> <!-- file: docs/plans/030-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT_PLAN.md -->
<!-- version: 12 --> <!-- version: 13 -->
# Plan v0.3.9 — Worker API générique + audit RAW Transaction # 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`. 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 ### `pre.007` — gate technique final
**Statut : prévu.** **Statut : prévu.**

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md --> <!-- file: docs/validation/026-V0_3_9_WORKER_API_RAW_TRANSACTION_AUDIT.md -->
<!-- version: 11 --> <!-- version: 12 -->
# Validation v0.3.9 — Worker API + audit RAW Transaction # Validation v0.3.9 — Worker API + audit RAW Transaction
@@ -234,6 +234,17 @@ Aucun item ci-dessous nest 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] 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`. - [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 ## 7. Couloirs de fermeture
### `pre.007` — gate technique final ### `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 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`.