v0.2.11-pre.009
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
|
||||
<!-- version: 15 -->
|
||||
<!-- version: 16 -->
|
||||
|
||||
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider
|
||||
|
||||
**Statut courant : `0.2.11-pre.008-fix.001` corrige le gate de `pre.008` sans modifier son contrat fonctionnel. `MarketPriceService` possède toujours le dispatch provider, le registry runtime et les transitions d'availability ; les consumers utilisent uniquement les provider ids opaques, `registry()`, `refresh`, `refresh_many` et `refresh_all`. Le fix supprime un warning Clippy `collapsible_if` et remplace un canari lexical trop large sur le mot `consensus` par des vérifications de surfaces exécutables réellement interdites. `MarketPriceProviderSetup` reste la frontière provider-specific destinée à la composition/Config de `pre.009`.**
|
||||
**Statut courant : `0.2.11-pre.009` matérialise la frontière Config -> Off-chain Transport. `cfg.std.offchain_transport` et `schema.std.offchain_transport` possèdent désormais un domaine `market_price` avec les huit providers V1, des profils `public_keyless` et `all_free`, les credentials résolus exclusivement depuis une provenance Config classée Secret, et une adresse de paire DexScreener publique lorsqu'elle provient de l'environnement. `ResolvedOffchainTransportConfig` construit `MarketPriceService` sans créer de dépendance inverse depuis Off-chain Transport. Les limites provider restent possédées par la crate runtime et ne deviennent pas des cadences libres de Config.**
|
||||
|
||||
## 1. Base et autorité
|
||||
|
||||
@@ -520,28 +520,43 @@ Le limiter `pre.003` est non bloquant. Une cadence fixe est matérialisée par u
|
||||
|
||||
## 15. Config provider-capability-aware
|
||||
|
||||
Config reste l'unique propriétaire des documents/env/secrets.
|
||||
|
||||
Off-chain Transport expose ses settings publics ; Config adapte un futur document standard dédié, pressenti :
|
||||
Config reste l'unique propriétaire des documents, de l'environnement et des secrets. `pre.009` matérialise les identifiants durables :
|
||||
|
||||
```text
|
||||
file_id = std.offchain_transport
|
||||
file_id document = cfg.std.offchain_transport
|
||||
file_id schema = schema.std.offchain_transport
|
||||
fichier = std.offchain_transport.json
|
||||
schema = std.offchain_transport.schema.json
|
||||
format_version = 1
|
||||
```
|
||||
|
||||
Les branches de configuration correspondent aux capacités réelles de chaque provider.
|
||||
Le document reste générique Off-chain Transport et place la capacité actuelle sous `market_price`. Cette structure évite de transformer le document durable en Config dédiée uniquement au prix lorsque d'autres familles telles que `swap_quote` apparaîtront.
|
||||
|
||||
| Provider | Champs spécifiques V1 attendus |
|
||||
|-------------------|------------------------------------------------------------|
|
||||
| CoinGecko | enabled, access_mode keyless ou demo, api_key optionnelle |
|
||||
| CoinMarketCap | enabled, access_mode keyless ou basic, api_key optionnelle |
|
||||
| CoinPaprika | enabled |
|
||||
| Kraken | enabled |
|
||||
| Coinbase Exchange | enabled |
|
||||
| Jupiter | enabled, access_mode keyless ou free, api_key optionnelle |
|
||||
| Birdeye | enabled, api_key requise si activé |
|
||||
| DexScreener | enabled, sol_usd_pair_address requise si activé |
|
||||
Deux profils versionnés servent de canaries :
|
||||
|
||||
Le schema final doit conditionner la présence des credentials au mode choisi. Aucun secret n'est versionné. Toute variable d'environnement ajoutée respecte `KSP_SECRET_*` et est inventoriée dans `.env.example`.
|
||||
```text
|
||||
public_keyless = providers réellement utilisables sans secret ; Birdeye et DexScreener désactivés
|
||||
all_free = modes gratuits à clé activés + paire DexScreener explicite
|
||||
```
|
||||
|
||||
Les branches correspondent aux capacités réelles de chaque provider.
|
||||
|
||||
| Provider | Champs spécifiques V1 |
|
||||
|-------------------|---------------------------------------------------------------|
|
||||
| CoinGecko | enabled, access_mode keyless ou demo, api_key conditionnelle |
|
||||
| CoinMarketCap | enabled, access_mode keyless ou basic, api_key conditionnelle |
|
||||
| CoinPaprika | enabled |
|
||||
| Kraken | enabled |
|
||||
| Coinbase Exchange | enabled |
|
||||
| Jupiter | enabled, access_mode keyless ou free, api_key conditionnelle |
|
||||
| Birdeye | enabled, api_key requise si activé |
|
||||
| DexScreener | enabled, sol_usd_pair_address requise si activé |
|
||||
|
||||
Le schema conditionne les credentials au mode choisi et interdit un faux champ `api_key` sur les modes keyless. L'adapter effectif applique en plus la provenance : une API key provider doit provenir d'une variable classée Secret (`KSP_SECRET_*` ou namespace KSPB secret admis par Config), même si un littéral non vide est syntaxiquement valide JSON. Les erreurs et `Debug` ne recopient jamais le credential.
|
||||
|
||||
La paire DexScreener n'est pas un secret. Un littéral validé comme Pubkey Solana est admis ; si la valeur vient de l'environnement, sa provenance doit rester Public, avec le canari versionné `KSP_PUBLIC_DEXSCREENER_SOL_USD_PAIR_ADDRESS`. Pour respecter « requise seulement si activé », `MarketPriceDexScreenerSettings` accepte désormais l'absence de paire lorsque le provider est désactivé et la refuse toujours lorsqu'il est activé.
|
||||
|
||||
`.env.example` inventorie les variables nécessaires sans valeur réelle. Les applications desktop empaquetent aussi le nouveau document et son schema parce que `prepare_packaged_runtime` synchronise l'intégralité du registry Config.
|
||||
|
||||
Les limites provider ne deviennent pas des valeurs libres permettant à Config/UI d'augmenter la cadence. Une future policy pourra permettre un throttle **plus strict** si un besoin réel apparaît.
|
||||
|
||||
@@ -736,7 +751,7 @@ Implémentation des deux adapters exchange keyless avec DTOs wire privés et end
|
||||
|
||||
**Statut : réalisé, gate opérateur ciblé PASS ; workspace complet non rejoué.**
|
||||
|
||||
Implémentation des adapters Jupiter Price V3 et DexScreener avec DTOs wire privés et endpoints HTTPS officiels fixes. Jupiter distingue keyless à 0,5 requête par seconde et Free key à 1 requête par seconde sur le même `api.jup.ag`, utilise uniquement le mint WSOL et conserve `blockId` comme provenance de récence sans le convertir en timestamp. DexScreener exige un pair address Solana explicite dans ses settings, appelle uniquement `/latest/dex/pairs/solana/{pairId}`, vérifie `chainId = solana`, le pair address retourné et le mint WSOL comme base avant de lire `priceUsd`. Aucune découverte de pool, aucun tri de liquidité, aucun consensus et aucun registry global ne sont avancés.
|
||||
Implémentation des adapters Jupiter Price V3 et DexScreener avec DTOs wire privés et endpoints HTTPS officiels fixes. Jupiter distingue keyless à 0,5 requête par seconde et Free key à 1 requête par seconde sur le même `api.jup.ag`, utilise uniquement le mint WSOL et conserve `blockId` comme provenance de récence sans le convertir en timestamp. DexScreener exige un pair address Solana explicite lorsqu'il est activé, appelle uniquement `/latest/dex/pairs/solana/{pairId}`, vérifie `chainId = solana`, le pair address retourné et le mint WSOL comme base avant de lire `priceUsd`. Aucune découverte de pool, aucun tri de liquidité, aucun consensus et aucun registry global ne sont avancés.
|
||||
|
||||
### `pre.007` — Birdeye, registry et availability
|
||||
|
||||
@@ -754,9 +769,9 @@ Implémentation de Birdeye Standard avec `X-API-KEY`, endpoint Price Single Sola
|
||||
|
||||
### `pre.009` — Config Off-chain Transport
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : réalisé ; gate Cargo opérateur à rejouer.**
|
||||
|
||||
Document standard `std.offchain_transport`, schema, exemples, secrets d'environnement nécessaires et adapter Config -> Off-chain Transport conforme aux capacités de chaque provider.
|
||||
Ajout de `cfg.std.offchain_transport` / `schema.std.offchain_transport`, du document standard V1, de son schema strict, d'un exemple et de la fixture Config. Le domaine `market_price` configure les huit providers sans rendre leurs cadences modifiables. `public_keyless` fonctionne sans secret ; `all_free` référence quatre credentials `KSP_SECRET_*` et une paire DexScreener `KSP_PUBLIC_*`. `ResolvedOffchainTransportConfig` résout l'environnement, contrôle la provenance des credentials/public fields et construit `MarketPriceService` via `MarketPriceProviderSetup`, sans dépendance inverse. Les deux applications desktop embarquent les nouvelles ressources Config. La tranche réconcilie aussi DexScreener pour qu'une paire soit requise uniquement quand le provider est activé.
|
||||
|
||||
### `pre.010` — Hardening et complétude technique
|
||||
|
||||
|
||||
Reference in New Issue
Block a user