v0.2.11-pre.006
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/plans/018-V0_2_11_OFFCHAIN_PRICE_TRANSPORT_PLAN.md -->
|
||||
<!-- version: 11 -->
|
||||
<!-- version: 12 -->
|
||||
|
||||
# Plan `0.2.11` — Off-chain price transport SOL/USD multi-provider
|
||||
|
||||
**Statut courant : `0.2.11-pre.005` ajoute les deux providers exchange V1 — Kraken Spot et Coinbase Exchange — en SOL/USD keyless via le socle `http_*` existant. Les deux observations conservent `ExchangeLastTrade` : Kraken utilise le dernier trade du ticker `SOLUSD` sans inventer de timestamp provider, tandis que Coinbase Exchange conserve le timestamp RFC3339 de `/products/SOL-USD/ticker`. Le gate opérateur complet de `pre.004-fix.001` est PASS.**
|
||||
**Statut courant : `0.2.11-pre.006` ajoute Jupiter Price V3 et DexScreener à la famille `market_price`. Jupiter supporte keyless ou Free key sur `api.jup.ag`, conserve `SolanaHeuristic` et le `blockId` comme provenance sans inventer de timestamp de prix. DexScreener utilise exclusivement l'endpoint direct d'une paire Solana explicitement configurée, vérifie `chainId`, pair address et identité WSOL avant d'accepter `priceUsd`. Le gate opérateur ciblé de `pre.005` est PASS ; `cargo test --workspace` n'a pas été rejoué sur l'état exact `pre.005`.**
|
||||
|
||||
## 1. Base et autorité
|
||||
|
||||
@@ -224,8 +224,10 @@ https://docs.cdp.coinbase.com/exchange/rest-api/rate-limits
|
||||
https://docs.cdp.coinbase.com/api-reference/exchange-api/rest-api/products/get-product-ticker
|
||||
https://docs.cdp.coinbase.com/api-reference/exchange-api/rest-api/products/get-single-product
|
||||
|
||||
https://developers.jup.ag/docs/portal/setup
|
||||
https://developers.jup.ag/docs/portal/plans
|
||||
https://developers.jup.ag/docs/portal/migration
|
||||
https://developers.jup.ag/pricing
|
||||
https://developers.jup.ag/docs/api-reference/price
|
||||
https://developers.jup.ag/docs/price
|
||||
|
||||
https://docs.birdeye.so/docs/pricing
|
||||
@@ -241,6 +243,8 @@ Les chiffres externes sont une photographie d'audit, pas une constante éternell
|
||||
|
||||
Réaudit `pre.004` : CoinMarketCap Simple Price est implémenté sur la surface **V2** actuelle. La surface Simple Price V1 est documentée comme deprecated et n'est pas utilisée par KSP. Les deux modes V1 retenus restent distincts : endpoint public keyless V2 sans credential, ou endpoint Pro V2 Basic avec `X-CMC_PRO_API_KEY`.
|
||||
|
||||
Réaudit `pre.006` : le Developer Platform Jupiter courant utilise `https://api.jup.ag` pour les accès keyless et API-key. Le keyless est documenté à 0,5 RPS et le plan Free à 1 RPS. Price V3 expose `usdPrice` comme prix USD unique et `blockId` comme information de récence ; `createdAt` décrit la création du token et ne doit pas être transformé en timestamp du prix. DexScreener documente l'endpoint direct `/latest/dex/pairs/{chainId}/{pairId}` à 300 requêtes par minute. KSP sélectionne uniquement `chainId = solana` et interdit dans V1 les endpoints de search ou de découverte de pools.
|
||||
|
||||
### 6.1 Gratuité technique et conditions d'usage
|
||||
|
||||
Le verdict `IN` signifie ici qu'un accès HTTP gratuit permet techniquement de développer et live-tester le provider dans `0.2.11`. Il ne constitue pas une affirmation de gratuité commerciale permanente.
|
||||
@@ -720,15 +724,15 @@ Correctif strict de `pre.004` : tri alphabétique complet des constantes d'erreu
|
||||
|
||||
### `pre.005` — Kraken et Coinbase Exchange
|
||||
|
||||
**Statut : réalisé, gate Cargo opérateur à exécuter.**
|
||||
**Statut : réalisé, gate opérateur ciblé PASS ; workspace complet non rejoué.**
|
||||
|
||||
Implémentation des deux adapters exchange keyless avec DTOs wire privés et endpoints HTTPS fixes. Kraken utilise le ticker public `SOLUSD`, retient le dernier trade `c[0]`, applique une cadence locale conservatrice de 1 requête par seconde et ne fabrique aucun timestamp provider absent du ticker. Coinbase Exchange utilise `/products/SOL-USD/ticker`, conserve `price` et `time`, et modélise le token bucket public documenté à 10 requêtes par seconde par IP avec burst 15. Les deux adapters exposent `MarketPriceSemantics::ExchangeLastTrade`; aucun registry global, Config, SDK provider ou smoke live n'est avancé.
|
||||
|
||||
### `pre.006` — Jupiter et DexScreener
|
||||
|
||||
**Statut : planifié.**
|
||||
**Statut : réalisé, gate Cargo opérateur à exécuter.**
|
||||
|
||||
Implémentation des adapters Jupiter et DexScreener. DexScreener reste limité en V1 à la paire SOL/USD explicite configurée et validée.
|
||||
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.
|
||||
|
||||
### `pre.007` — Birdeye, registry et availability
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/014-V0_2_11_OFFCHAIN_PRICE_TRANSPORT.md -->
|
||||
<!-- version: 10 -->
|
||||
<!-- version: 11 -->
|
||||
|
||||
# Validation `0.2.11` — Off-chain price transport SOL/USD
|
||||
|
||||
@@ -184,27 +184,52 @@ Le gate opérateur rejoué le `2026-08-25` est intégralement PASS : audit Rust
|
||||
|
||||
## 3.8 Gate `0.2.11-pre.005`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|--------------------------------------------------------|---------|----------------------------------------------------|
|
||||
| version workspace `0.2.11-pre.5` | PASS | `Cargo.toml` racine |
|
||||
| Kraken Spot SOL/USD adapter public | PASS | `market_price_kraken.rs` |
|
||||
| Kraken public keyless sans faux credential | PASS | settings + descriptor |
|
||||
| Kraken dernier trade conservé avec sémantique exchange | PASS | ticker `SOLUSD` -> `c[0]` -> `ExchangeLastTrade` |
|
||||
| Kraken ne fabrique aucun timestamp provider absent | PASS | `provider_timestamp = None` |
|
||||
| Kraken cadence locale conservatrice 1 req/s IP | PASS | descriptor + canari unitaire |
|
||||
| Coinbase Exchange SOL/USD adapter public | PASS | `market_price_coinbase_exchange.rs` |
|
||||
| Coinbase Exchange public keyless sans faux credential | PASS | settings + descriptor |
|
||||
| Coinbase dernier trade et timestamp provider conservés | PASS | `price` + `time` -> `ExchangeLastTrade` |
|
||||
| Coinbase token bucket public 10 req/s IP, burst 15 | PASS | descriptor + canari unitaire |
|
||||
| DTOs wire Kraken/Coinbase privés | PASS | structs privées dans les modules providers |
|
||||
| endpoints provider fixes et HTTPS | PASS | constantes privées + boundary canary |
|
||||
| prix exchange parsés exactement sans passage par `f64` | PASS | `RawValue` -> `MarketPriceDecimal::parse_json_raw` |
|
||||
| aucun SDK provider, Config ou registry global avancé | PASS | manifest + dependency boundary |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 119 tables / 110 fichiers |
|
||||
| gate Cargo complet | PLANNED | à exécuter par l'opérateur |
|
||||
| Critère | Statut | Preuve |
|
||||
|--------------------------------------------------------|--------|----------------------------------------------------|
|
||||
| version workspace `0.2.11-pre.5` | PASS | `Cargo.toml` racine |
|
||||
| Kraken Spot SOL/USD adapter public | PASS | `market_price_kraken.rs` |
|
||||
| Kraken public keyless sans faux credential | PASS | settings + descriptor |
|
||||
| Kraken dernier trade conservé avec sémantique exchange | PASS | ticker `SOLUSD` -> `c[0]` -> `ExchangeLastTrade` |
|
||||
| Kraken ne fabrique aucun timestamp provider absent | PASS | `provider_timestamp = None` |
|
||||
| Kraken cadence locale conservatrice 1 req/s IP | PASS | descriptor + canari unitaire |
|
||||
| Coinbase Exchange SOL/USD adapter public | PASS | `market_price_coinbase_exchange.rs` |
|
||||
| Coinbase Exchange public keyless sans faux credential | PASS | settings + descriptor |
|
||||
| Coinbase dernier trade et timestamp provider conservés | PASS | `price` + `time` -> `ExchangeLastTrade` |
|
||||
| Coinbase token bucket public 10 req/s IP, burst 15 | PASS | descriptor + canari unitaire |
|
||||
| DTOs wire Kraken/Coinbase privés | PASS | structs privées dans les modules providers |
|
||||
| endpoints provider fixes et HTTPS | PASS | constantes privées + boundary canary |
|
||||
| prix exchange parsés exactement sans passage par `f64` | PASS | `RawValue` -> `MarketPriceDecimal::parse_json_raw` |
|
||||
| aucun SDK provider, Config ou registry global avancé | PASS | manifest + dependency boundary |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PASS | clean, 119 tables / 110 fichiers |
|
||||
| `cargo check` / Clippy / tests Off-chain | PASS | résultats opérateur du 2026-08-25 |
|
||||
| `cargo test --workspace` sur état exact `pre.005` | N/R | non rejoué avant passage explicite à `pre.006` |
|
||||
|
||||
Les tests déterministes de `pre.005` couvrent les descriptors exchange, la précision décimale, le timestamp Coinbase, l'absence de timestamp Kraken, le rejet d'une erreur/identité Kraken incohérente et le rejet d'un timestamp Coinbase invalide. Aucun smoke réseau n'est revendiqué dans cette tranche.
|
||||
Les tests déterministes de `pre.005` couvrent les descriptors exchange, la précision décimale, le timestamp Coinbase, l'absence de timestamp Kraken, le rejet d'une erreur/identité Kraken incohérente et le rejet d'un timestamp Coinbase invalide. Le gate opérateur ciblé du `2026-08-25` est PASS : audit Rust clean, audit Markdown clean à 119 tables / 110 fichiers, `cargo check --workspace` PASS, `cargo clippy --workspace --all-targets` PASS et `cargo test -p ksp-offchain-transport-lib` PASS avec 37 unitaires + 3 boundary + 4 public API. `cargo test --workspace` n'a pas été rejoué sur cet état exact.
|
||||
|
||||
## 3.9 Gate `0.2.11-pre.006`
|
||||
|
||||
| Critère | Statut | Preuve |
|
||||
|-----------------------------------------------------------------|---------|---------------------------------------------------------|
|
||||
| version workspace `0.2.11-pre.6` | PASS | `Cargo.toml` racine |
|
||||
| Jupiter Price V3 adapter public | PASS | `market_price_jupiter.rs` |
|
||||
| Jupiter keyless et Free key distingués | PASS | settings + descriptor + header sensible |
|
||||
| Jupiter keyless 0,5 RPS et Free 1 RPS représentés | PASS | descriptors + canaries unitaires |
|
||||
| Jupiter utilise uniquement le mint WSOL | PASS | query `ids` fixe |
|
||||
| `usdPrice` Jupiter parsé exactement sans `f64` canonique | PASS | `RawValue` -> `MarketPriceDecimal` |
|
||||
| `blockId` Jupiter conservé en provenance sans faux timestamp | PASS | provenance bornée + `provider_timestamp = None` |
|
||||
| DexScreener adapter public avec pair address explicite | PASS | `MarketPriceDexScreenerSettings` |
|
||||
| DexScreener endpoint direct pair uniquement | PASS | `/latest/dex/pairs/solana/{pairId}` |
|
||||
| DexScreener vérifie `chainId`, pair address et identité WSOL | PASS | parser provider |
|
||||
| DexScreener utilise uniquement `priceUsd` | PASS | DTO wire privé + parsing exact |
|
||||
| DexScreener 300 req/min représenté | PASS | descriptor provider |
|
||||
| aucune découverte/selection/ranking automatique de pool | PASS | dependency boundary + absence search/token-pairs/tokens |
|
||||
| aucun SDK provider, Config, registry ou refresh multiple avancé | PASS | manifest + scope des modules |
|
||||
| audit Rust sandbox | PASS | clean, 0 candidate export |
|
||||
| audit Markdown sandbox | PLANNED | à exécuter après réconciliation documentaire |
|
||||
| gate Cargo | PLANNED | à exécuter par l'opérateur |
|
||||
|
||||
Les fixtures de `pre.006` couvrent Jupiter keyless/Free, redaction de la clé, prix exact, identité WSOL, `blockId`, absence volontaire de faux timestamp, ainsi que DexScreener avec pair Solana explicite, `priceUsd`, rejet de chain/pair/base invalides, réponse multiple et prix absent. Aucun smoke live n'est revendiqué dans cette tranche.
|
||||
|
||||
## 4. Matrice provider prévue
|
||||
|
||||
@@ -215,9 +240,9 @@ Les tests déterministes de `pre.005` couvrent les descriptors exchange, la pré
|
||||
| CoinPaprika | Oui | Oui | aucune | PASS | PLANNED | IMPLEMENTED |
|
||||
| Kraken | Oui | Oui | aucune | PASS | PLANNED | IMPLEMENTED |
|
||||
| Coinbase Exchange | Oui | Oui | aucune | PASS | PLANNED | IMPLEMENTED |
|
||||
| Jupiter Price V3 | Oui | Oui | keyless ou Free key | PLANNED | PLANNED | AUDITED |
|
||||
| Jupiter Price V3 | Oui | Oui | keyless ou Free key | PASS | PLANNED | IMPLEMENTED |
|
||||
| Birdeye | Oui | Oui | API key Standard | PLANNED | PLANNED | AUDITED |
|
||||
| DexScreener | Oui | Oui | aucune | PLANNED | PLANNED | AUDITED |
|
||||
| DexScreener | Oui | Oui | aucune | PASS | PLANNED | IMPLEMENTED |
|
||||
|
||||
`AUDITED` signifie uniquement que la documentation officielle actuelle satisfait le gate d'entrée. Ce statut ne vaut pas preuve d'un smoke réseau KSP.
|
||||
|
||||
@@ -294,15 +319,15 @@ Avant la stable, les conditions d'usage et la persistance des offres gratuites d
|
||||
|
||||
## 9. DexScreener V1
|
||||
|
||||
| Invariant | Statut |
|
||||
|----------------------------------------------|---------|
|
||||
| pair address SOL/USD explicite dans settings | PLANNED |
|
||||
| `chainId = solana` vérifié | PLANNED |
|
||||
| identité SOL de la paire vérifiée | PLANNED |
|
||||
| `priceUsd` utilisé comme prix commun | PLANNED |
|
||||
| aucune recherche automatique de pool | PLANNED |
|
||||
| aucun tri automatique par liquidité | PLANNED |
|
||||
| aucune moyenne/consensus entre pools | PLANNED |
|
||||
| Invariant | Statut |
|
||||
|----------------------------------------------|--------|
|
||||
| pair address SOL/USD explicite dans settings | PASS |
|
||||
| `chainId = solana` vérifié | PASS |
|
||||
| identité SOL de la paire vérifiée | PASS |
|
||||
| `priceUsd` utilisé comme prix commun | PASS |
|
||||
| aucune recherche automatique de pool | PASS |
|
||||
| aucun tri automatique par liquidité | PASS |
|
||||
| aucune moyenne/consensus entre pools | PASS |
|
||||
|
||||
## 10. Config -> Off-chain Transport
|
||||
|
||||
|
||||
Reference in New Issue
Block a user