v0.3.9-pre.006-fix.003
This commit is contained in:
10
.env.example
10
.env.example
@@ -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.
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 n’est 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 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.
|
- [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 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** — 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 `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 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.
|
- [ ] **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-*`.
|
- [ ] **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-*`.
|
||||||
|
|||||||
@@ -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}",
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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}",
|
||||||
|
|||||||
@@ -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": [
|
||||||
|
|||||||
@@ -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"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -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}",
|
||||||
|
|||||||
@@ -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}"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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": [],
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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(),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:?}"),
|
||||||
};
|
};
|
||||||
|
|||||||
52
deltas/0.3.9/pre.006-fix.003.md
Normal file
52
deltas/0.3.9/pre.006-fix.003.md
Normal 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`.
|
||||||
@@ -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 ;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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.**
|
||||||
|
|||||||
@@ -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 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] 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`.
|
||||||
|
|||||||
Reference in New Issue
Block a user