This commit is contained in:
2026-05-30 01:14:30 +02:00
parent ffa4acbccb
commit 7bd6593015
20 changed files with 4359 additions and 456 deletions

View File

@@ -1067,13 +1067,13 @@ Fait :
- constitution dun corpus dédié `meteora_dlmm` via `Demo3`, backfill manuel des signatures anciennes du pool `HTvjzsfX3yU6BUodCjZ5vZkUrAxMDTrBs3CJaq43ashR`, puis backfill par pool address ;
- confirmation locale du programme DLMM observé `LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo` dans les transactions du corpus ;
- traitement du wrapper Anchor `anchor_self_cpi_log` `e445a52e51cb9a1d` ;
- mapping prouvé localement et par IDL/Carbon des Anchor CPI swap events : `516ce3becdd00ac4` -> `Swap`, `2e7452d7941b544d` -> `Swap2Evt` ;
- mapping prouvé localement et par IDL/upstream Git des Anchor CPI swap events : `516ce3becdd00ac4` -> `Swap`, `2e7452d7941b544d` -> `Swap2Evt` ;
- enrichissement du payload `meteora_dlmm.swap` avec `anchorSwapEvent`, montants et fees CPI décodés ;
- cleanup conservatoire des audits Anchor CPI swap déjà couverts par un swap DLMM matérialisé ;
- ajout des events Anchor CPI non-swap DLMM observés : `lb_pair_create_event`, `add_liquidity_event`, `remove_liquidity_event`, `claim_fee_event`, `claim_reward_event` / `fund_reward_event` côté decoder, `position_create_event`, `position_close_event` ;
- promotion du discriminant direct `claim_fee2` vers `meteora_dlmm.claim_fee2` ;
- promotion de `close_position_if_empty` comme event de lifecycle/position close prouvé localement ;
- promotion de `remove_liquidity_by_range2`, `add_liquidity_by_strategy2` et `add_liquidity_by_weight` selon les layouts Carbon et le corpus local ;
- promotion de `remove_liquidity_by_range2`, `add_liquidity_by_strategy2` et `add_liquidity_by_weight` selon les layouts upstream Git et le corpus local ;
- matérialisation validée des families non-trade dans les tables dédiées, notamment `k_sol_liquidity_events`, `k_sol_pool_lifecycle_events` et `k_sol_fee_events` ;
- maintien du ledger replay avec `effective_event_count`, afin que les `.instruction_audit` informatifs ne rendent pas inutilement les transactions `unsafe` ;
- version logique finale du replay pour la tranche : `dex_decode.v0.7.45.dlmm_add_liquidity_strategies1` ;
@@ -1111,31 +1111,95 @@ Events DLMM observés après replay :
Limite conservée :
- `e445a52e51cb9a1d + e8abf2613a4d232d` reste en `meteora_dlmm.instruction_audit` avec `proofStatus = observed_local_corpus_anchor_self_cpi_log`, faute de mapping Carbon/IDL confirmé. Ces deux audits ne sont pas promus et ne bloquent pas la clôture de `0.7.45`.
- `e445a52e51cb9a1d + e8abf2613a4d232d` reste en `meteora_dlmm.instruction_audit` avec `proofStatus = observed_local_corpus_anchor_self_cpi_log`, faute de mapping upstream Git/IDL confirmé. Ces deux audits ne sont pas promus et ne bloquent pas la clôture de `0.7.45`.
Décision : `0.7.45` est clos pour `meteora_dlmm`. La suite immédiate est `0.7.46` sur `meteora_damm_v1` uniquement.
Décision : `0.7.45` est clos pour `meteora_dlmm`. La suite immédiate est `0.7.46 — Demo3 multi-target discovery enabled` sur `meteora_damm_v1` uniquement.
### 6.078. Version `0.7.46` — `meteora_damm_v1` séparé
Objectif : reprendre `meteora_damm_v1` sans le mélanger à DAMM v2, DBC ou DLMM.
À faire :
Tranche `0.7.46` engagée sur les audits `meteora_damm_v1` observés dans le corpus local et mappés contre upstream Git decoder source `meteora-pools-decoder`.
- valider les swaps exploitables et les cas sans amounts ;
- rechercher create/init pool, liquidity, fee/admin/config et autres events utiles ;
- maintenir la règle : pas de trade/candle si base/quote amount ou prix ne sont pas fiables ;
- produire un corpus SQL minimal pour chaque event promu.
Events DAMM v1 ajoutés côté decoder :
### 6.079. Version `0.7.47` — `meteora_damm_v2` séparé
Objectif : reprendre `meteora_damm_v2` comme DEX effectif séparé, avec traitement spécifique des nombreux `instruction_audit`.
- `meteora_damm_v1.create_pool` pour les créations constant-product avec config upstream Git `InitializePermissionlessConstantProductPoolWithConfig` et `InitializePermissionlessConstantProductPoolWithConfig2`, en plus des chemins legacy déjà présents ;
- `meteora_damm_v1.add_liquidity` pour `AddBalanceLiquidity`, `AddImbalanceLiquidity` et `BootstrapLiquidity` ;
- `meteora_damm_v1.remove_liquidity` pour `RemoveBalanceLiquidity` et `RemoveLiquiditySingleSide` ;
- `meteora_damm_v1.claim_fee` pour `ClaimFee` ;
- `meteora_damm_v1.create_lock_escrow` et `meteora_damm_v1.lock_liquidity` pour les instructions de verrouillage LP.
Discriminants DAMM v1 traités dans cette tranche :
| Discriminant | Mapping upstream Git | Event local | Statut |
|---|---|---|---|
| `07a68aabceabecf4` | `InitializePermissionlessConstantProductPoolWithConfig` | `meteora_damm_v1.create_pool` | observé dans corpus local |
| `3095dc823d0b09b2` | `InitializePermissionlessConstantProductPoolWithConfig2` | `meteora_damm_v1.create_pool` | observé dans corpus local |
| `856d2cb338ee7221` | `RemoveBalanceLiquidity` | `meteora_damm_v1.remove_liquidity` | observé dans corpus local |
| `a9204f8988e84689` | `ClaimFee` | `meteora_damm_v1.claim_fee` | observé dans corpus local |
| `3657a51345e3dae0` | `CreateLockEscrow` | `meteora_damm_v1.create_lock_escrow` | observé dans corpus local |
| `1513d02bed3eff57` | `Lock` | `meteora_damm_v1.lock_liquidity` | observé dans corpus local |
Discriminants DAMM v1 ajoutés au decoder pour complétude upstream Git, même sils devront rester soumis au corpus avant mention `verified_by_corpus` :
- `9118acc2db7d03be``InitializeCustomizablePermissionlessConstantProductPool` ;
- `a8e3323ebdab54b0``AddBalanceLiquidity` ;
- `4f237a54ad0f5dbf``AddImbalanceLiquidity` ;
- `04e4d747e1fd77ce``BootstrapLiquidity` ;
- `5454b142feb90afb``RemoveLiquiditySingleSide`.
Le replay passe à la version logique `dex_decode.v0.7.46.damm_v1_events1` afin de redécoder les transactions certifiées sous la version `0.7.45` quand la tranche DAMM v1 est rejouée.
Validation locale obtenue après replay :
- `meteora_damm_v1.instruction_audit` vide sur le corpus local DAMM v1 rejoué ;
- `meteora_damm_v1.claim_fee`, `create_pool`, `create_lock_escrow`, `lock_liquidity` et `remove_liquidity` matérialisés dans les tables non-trade attendues ;
- invariant maintenu : aucun event non-trade DAMM v1 ne produit de trade/candle ;
- `cargo test -p kb_lib` et `cargo clippy -p kb_lib --all-targets -- -D warnings` validés localement après correction du warning Clippy.
Correction Demo3 adossée à `0.7.46` :
- ajout dun décodage léger instruction-scoped pour `meteora_damm_v1` dans `onchain_dex_pair_discovery`, sans écriture DB et sans promotion de nouveau `program_id` ;
- les discriminants DAMM v1 connus par upstream Git/corpus sont classés directement en `swap`, `create_pool`, `add_liquidity`, `remove_liquidity`, `claim_fee`, `create_lock_escrow` ou `lock_liquidity` ;
- le filtre `target_event` devient strict pour les surfaces explicites afin quun swap ne ressorte pas comme liquidity, et inversement, quand les logs de transaction sont mixtes ;
- `excludeSwaps` ne supprime plus toute une transaction mixte lorsquun `target_event` explicite est sélectionné, afin de permettre la découverte dinstructions non-swap dans des routes agrégées ;
- les cibles UI `create_lock_escrow` et `lock_liquidity` sont ajoutées pour faciliter les backfills via Demo Pipeline 2.
Aucun `program_id` Meteora Vault nest promu comme vérifié sans corpus direct séparé.
### 6.079. Version `0.7.47` — Upstream Git Registry / DEX discovery preparation
Objectif : accélérer la découverte multi-DEX en indexant les `program_id`, discriminants dinstructions, discriminants devents et noms dinstructions issus de dépôts Git externes de decoders Solana, sans les considérer vérifiés par défaut.
À faire :
- créer un registre `upstream_registry` dans `kb_lib`, sans dépendre dun nom de dépôt particulier ;
- stocker pour chaque entrée : `source_repo`, `decoder_code`, `program_id`, famille, type de surface, instruction/event name, discriminator hex, longueur de discriminator, statut de preuve et notes ;
- utiliser les statuts génériques : `upstream_git_unverified`, `upstream_git_mapped_unverified`, `upstream_git_local_corpus_observed`, `upstream_git_local_corpus_materialized` ;
- exposer les entrées à Demo3 pour filtrer par decoder, famille, `program_id`, discriminant, instruction/event name ou statut ;
- permettre à Demo3 de rechercher `any_upstream_unverified` pour trouver des signatures candidates à backfiller ;
- ne produire aucun trade/candle/liquidity/fee/reward/admin automatique depuis le registre ;
- nutiliser les entrées upstream Git que comme indices de découverte et daudit tant quelles ne sont pas validées par Demo3 + backfill + replay + SQL ;
- garder `kb_demo_app` comme façade UI : toute logique de registry/mapping doit rester dans `kb_lib`.
Familles prioritaires à indexer en premier :
- DEX / AMM / CLMM / orderbook : `meteora-damm-v2`, `meteora-dbc`, `meteora-dlmm`, `meteora-vault`, `raydium-amm-v4`, `raydium-clmm`, `raydium-cpmm`, `raydium-launchpad`, `raydium-liquidity-locking`, `raydium-stable-swap`, `orca-whirlpool`, `fluxbeam`, `lifinity-amm-v2`, `phoenix-v1`, `openbook-v2`, `stabble-stable-swap`, `stabble-weighted-swap`, `bonkswap`, `boop`, `moonshot`, `heaven`, `okx-dex`, `pancake-swap`, `vertigo`, `virtuals`, `wavebreak`, `onchain-labs-dex-v1`, `onchain-labs-dex-v2` ;
- agrégateurs / ordres / perps / lending utiles au routage ou à lanalyse : `jupiter-swap`, `jupiter-dca`, `jupiter-limit-order`, `jupiter-limit-order-2`, `jupiter-perpetuals`, `jupiter-lend`, `kamino-lending`, `kamino-vault`, `kamino-farms`, `kamino-limit-order`, `drift-v2`, `marginfi-v2`, `dflow-aggregator-v4`, `zeta` ;
- contexte transactionnel non DEX : `system-program`, `token-program`, `token-2022`, `associated-token-account`, `address-lookup-table`, `memo-program`, `stake-program`, `mpl-token-metadata`, `mpl-core`, `bubblegum`, `name-service`, `marinade-finance`, `solayer-restaking-program`, `swig`, `sharky`, `circle-message-transmitter-v2`, `circle-token-messenger-v2`.
Aucun de ces programmes ne doit être marqué `verified_by_corpus` uniquement parce quil existe dans un dépôt Git externe.
### 6.080. Version `0.7.48` — `meteora_damm_v2` séparé
Objectif : reprendre `meteora_damm_v2` comme DEX effectif séparé après disponibilité du registre upstream Git.
À faire :
- utiliser le registre `0.7.47` comme source dindices, pas comme preuve ;
- vérifier `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` dans le corpus local avant de le marquer `verified_by_corpus` ;
- consolider `create_pool`, swaps exploitables, configs dynamiques, fees/admin et events lifecycle ;
- conserver les swaps sans payload montant/prix fiables comme `non_actionable_trade` ;
- ne promouvoir aucun event depuis `instruction_audit` sans signature de validation.
### 6.080. Version `0.7.48` — `meteora_dbc` séparé
### 6.081. Version `0.7.49` — `meteora_dbc` séparé
Objectif : séparer proprement bonding/launch, swap effectif, migration et attribution dorigine dans `meteora_dbc`.
À faire :
@@ -1145,7 +1209,7 @@ Objectif : séparer proprement bonding/launch, swap effectif, migration et attri
- éviter toute candle artificielle sur events de bonding/launch non pricés ;
- documenter les signatures/corpus avant toute promotion.
### 6.081. Version `0.7.49` — `orca_whirlpools` séparé
### 6.082. Version `0.7.50` — `orca_whirlpools` séparé
Objectif : revalider Orca Whirlpools par corpus dédié avant toute promotion au même niveau que Raydium/Meteora.
À faire :
@@ -1155,109 +1219,60 @@ Objectif : revalider Orca Whirlpools par corpus dédié avant toute promotion au
- matérialiser uniquement les events prouvés ;
- ajouter des diagnostics par event kind.
### 6.082. Version `0.7.50` — `fluxbeam` séparé
### 6.083. Version `0.7.51` — `fluxbeam` séparé
Objectif : vérifier FluxBeam comme DEX effectif distinct.
À faire :
À faire : constituer un corpus local, vérifier `program_id`, comptes, préfixes `data_json`, swaps, pools, liquidity et events non-trade prouvés.
- constituer un corpus local ;
- vérifier `program_id`, comptes, préfixes `data_json` et familles dinstructions utiles ;
- valider swaps, pools, liquidity et events non-trade prouvés ;
- marquer explicitement les parties heuristiques ou non-actionnables.
### 6.084. Version `0.7.52` — `dexlab` / OpenBook relation
Objectif : vérifier DexLab comme DEX effectif distinct sans le confondre avec OpenBook ou une couche de marché associée.
### 6.083. Version `0.7.51` — `dexlab` séparé
Objectif : vérifier DexLab comme DEX effectif distinct, sans le confondre avec OpenBook ou une autre couche de marché.
À faire : constituer un corpus local, vérifier `program_id`, comptes, préfixes `data_json`, swaps, pools et éventuels liens de market/pool.
À faire :
### 6.085. Version `0.7.53` — Lifinity / Phoenix / OpenBook / Stabble
Objectif : traiter les DEX/orderbooks supplémentaires identifiés par le registre upstream Git.
- constituer un corpus local ;
- vérifier `program_id`, comptes, préfixes `data_json` et familles dinstructions utiles ;
- valider swaps, pools et éventuels liens de market/pool ;
- conserver les cas partiels en audit.
À faire : valider séparément `lifinity_amm_v2`, `phoenix_v1`, `openbook_v2`, `stabble_stable_swap` et `stabble_weighted_swap`, sans matérialiser de trade avant preuve de montants exploitables.
### 6.084. Version `0.7.52` — `metaDAO` candidat DEX
Objectif : rechercher et vérifier metaDAO sans inventer de `program_id`.
### 6.086. Version `0.7.54` — BonkSwap / Boop / Moonshot / Heaven / Wavebreak / Vertigo / Virtuals / Pancake / OKX DEX
Objectif : vérifier les surfaces de swap/launch hybrides ou candidates découvertes via registre et corpus.
À faire :
À faire : séparer DEX effectif, launch surface, routeur/agrégateur et simple candidat ; ne promouvoir aucun `program_id` sans corpus local.
- rechercher les signatures/corpus via Demo3, DEX Screener ou sources externes de découverte ;
- ne considérer une source externe que comme indice ;
- promouvoir uniquement après preuve on-chain locale ;
- documenter chaque programme, event et limite.
### 6.087. Version `0.7.55` — Raydium surfaces complémentaires
Objectif : traiter `raydium_launchpad`, `raydium_liquidity_locking`, `raydium_stable_swap` et éventuelles surfaces Raydium non couvertes par CPMM/CLMM/AMM v4.
### 6.085. Version `0.7.53` — `printr` candidat DEX
Objectif : rechercher et vérifier Printr sans inventer de `program_id`.
À faire : distinguer launch, lock, stable AMM et AMM legacy ; garder les events non prouvés en audit.
À faire :
### 6.088. Version `0.7.56` — Aggregators, limit orders, perps et lending
Objectif : intégrer les programmes utiles au routage, aux ordres, aux perps ou au lending sans les confondre avec les DEX effectifs.
- rechercher les signatures/corpus via Demo3, DEX Screener ou sources externes de découverte ;
- ne considérer une source externe que comme indice ;
- promouvoir uniquement après preuve on-chain locale ;
- documenter chaque programme, event et limite.
À faire : classifier `jupiter_*`, `kamino_*`, `drift_v2`, `marginfi_v2`, `dflow_aggregator_v4`, `zeta` comme contexte/routing/ordres tant quils ne produisent pas directement une surface DEX matérialisable.
### 6.086. Version `0.7.54` — Couverture événementielle DEX consolidée
### 6.089. Version `0.7.57` — Couverture événementielle DEX consolidée
Objectif : sassurer que chaque DEX effectif supporté expose les événements utiles au scoring et au risque sans polluer les trades/candles.
À faire :
À faire : vérifier par DEX `swap`, liquidité, lifecycle, fees, rewards, admin/config, burns/mints utiles, et matérialiser uniquement les événements prouvés.
- vérifier par DEX la couverture `swap` / `tradeCandidate` / `candleCandidate` ;
- vérifier par DEX la couverture liquidité : add/remove/increase/decrease/open/close position ;
- vérifier par DEX les événements lifecycle : create/init/migrate/pause/resume/close ;
- vérifier par DEX les fees, rewards, creator fees, protocol fees et admin/config ;
- vérifier les burns/mints utiles au suivi token/pool sans les transformer en price-action ;
- matérialiser uniquement les événements prouvés dans les tables dédiées ;
- ajouter des compteurs et samples diagnostics par DEX et par type dévénement ;
- conserver linvariant : aucun fee/reward/admin/liquidity/lifecycle/burn non price-action ne produit de trade, metric ou candle.
### 6.087. Version `0.7.55` — `kb_demo_app` Demo4 : DEX Screener et sources externes de découverte
### 6.090. Version `0.7.58` — `kb_demo_app` Demo4 : DEX Screener et sources externes de découverte
Objectif : utiliser des sources externes comme aides à la découverte de corpus sans les traiter comme vérité métier.
À faire :
À faire : rechercher des paires par token mint, chain, DEX name, pool address ou program id lorsque disponible, comparer avec la base locale, copier les signatures/adresses candidates pour backfill, sans promotion automatique.
- ajouter une `Demo4` pour interroger DEX Screener ou une source équivalente ;
- rechercher des paires par token mint, chain, DEX name, pool address ou program id lorsque disponible ;
- comparer les résultats externes avec les objets locaux : tokens, pools, pairs, listings, decoded events et protocol candidates ;
- afficher les écarts : paire externe absente localement, pool local sans source externe, DEX label ambigu, program id manquant ;
- permettre de copier les signatures/adresses candidates pour backfill ;
- ne jamais promouvoir automatiquement un DEX, un `program_id` ou une paire sur la seule base dune réponse externe.
### 6.091. Version `0.7.59` — Démos spécialisées launch surfaces après DEX effectifs
Objectif : préparer des vues spécialisées pour les launch surfaces après stabilisation des DEX effectifs.
### 6.088. Version `0.7.56` — Démos spécialisées launch surfaces après DEX effectifs
Objectif : préparer des vues spécialisées pour les launch surfaces, mais seulement après stabilisation des DEX effectifs.
À faire : couvrir `pump_fun`, `raydium_launchpad`, `believe`, `bags`, `moonshot` / `moonit`, `boop_fun`, `letsbonk` / `bonk_fun`, `heaven`, avec séparation stricte entre launch origin, pool origin, DEX effectif et migration.
À faire plus tard :
- ajouter des démos dédiées à `pump_fun`, `raydium_launchpad` / `raydium_launchlab`, `believe`, `bags`, `moonshot` / `moonit`, `boop_fun`, `letsbonk` / `bonk_fun`, `heaven` ;
- distinguer `launch_origin`, `pool_origin`, `dex_effective` et `migration_target` ;
- rattacher les launch origins aux pools et paires uniquement lorsque les comptes permettent un matching fiable ;
- exposer les origins dans les diagnostics et lUI dinspection ;
- maintenir linterdiction de faux program ids, faux trades et fausses candles.
### 6.089. Version `0.7.57` — `kb_demo_app` Demo10 : watcher WebSocket live DEX
### 6.092. Version `0.7.60` — `kb_demo_app` Demo10 : watcher WebSocket live DEX
Objectif : valider le passage du replay/backfill vers lobservation temps réel contrôlée.
À faire :
À faire : sélectionner endpoints WS/HTTP et DEX/program ids à souscrire, utiliser le pipeline existant, afficher compteurs live, erreurs, subscriptions actives et derniers objets persistés.
- ajouter une démo temps réel type `Demo10` avec bouton `start` / `stop` ;
- permettre de sélectionner les endpoints WS/HTTP et les DEX/program ids à souscrire ;
- lancer le client WebSocket existant sans refactorer inutilement `ws_client.rs` / `ws_manager.rs` ;
- effectuer les `logsSubscribe`, `programSubscribe` ou `accountSubscribe` nécessaires selon le DEX ;
- détecter en temps réel mints, swaps, liquidités et autres événements utiles ;
- écrire en base via le pipeline existant : observations, transactions résolues, decoded events, pools/pairs/listings, trade events, candles et non-trade events ;
- afficher les compteurs live, erreurs, subscriptions actives et derniers objets persistés ;
- prévoir un arrêt propre avec unsubscribe avant close.
### 6.090. Version `0.7.58` — Validation DEX v1 consolidée
### 6.093. Version `0.7.61` — Validation DEX v1 consolidée
Objectif : rejouer tous les DEX effectifs supportés et valider les invariants du pipeline complet avant de revenir aux launch surfaces ou à lanalyse `0.8.x`.
À faire :
- rejouer des bases neuves couvrant tous les connecteurs DEX supportés ;
- vérifier les compteurs globaux et par DEX : decoded events, trade events, liquidity events, lifecycle events, fee events, reward events, admin events, burns/mints utiles, candles et analytic signals ;
- contrôler que chaque famille dévénements alimente uniquement les tables métier prévues ;
- vérifier les diagnostics bloquants et les samples danomalie ;
- documenter les corpus utilisés pour chaque DEX/surface ;
- conserver une matrice de support par DEX, variante, instruction et type dévénement ;
- verrouiller les invariants avant douvrir lanalyse `0.8.x`.
À faire : bases neuves, compteurs globaux et par DEX, diagnostics bloquants, samples danomalie, corpus documentés et matrice de support par DEX/variante/instruction/event.
### 6.091. Version `0.8.x` — Analyse et filtrage
Objectif : transformer les événements bruts en signaux exploitables.
@@ -1469,3 +1484,20 @@ Garde-fous constants :
- pas de metadata manquante bloquante ;
- pas de refactor réseau inutile tant que les clients HTTP/WS existants suffisent ;
- pas de skip replay sur transaction/instruction ambiguë, multi-token ou multi-event sans preuve ledger.
### Demo3 discovery note
Demo3 supports multiple selected target surfaces in one scan. The UI serializes selected checkboxes into the existing `targetEvent` filter as comma-separated values, so the backend remains backward compatible with single-target requests.
### Demo3 paged / multi-source note
Demo3 discovery now supports multiple source addresses, `before` / `until` pagination cursors, per-address max pages and `newest_first` / `oldest_first` processing order. This is intended for targeted corpus construction from known pool/pair addresses, especially when the first signatures can be identified externally with an explorer and then replayed/backfilled through Demo Pipeline 2. External explorers remain discovery aids only; verification still requires local decoder corpus and DB replay.
### 0.7.46 — clôture DAMM v1 upstream Git coverage
La tranche DAMM v1 doit couvrir les instructions/events listés par upstream Git decoder source `meteora-pools-decoder`. Les surfaces non observées localement sont volontairement persistées avec `proofStatus=upstream_git_mapped_unverified`; elles restent à valider par signatures réelles, replay et requêtes SQL.
Après backfills ciblés, les surfaces `swap` et `add_balance_liquidity` sont confirmées par corpus local et ne doivent plus rester en `upstream_git_mapped_unverified`. Les deux `remove_liquidity` non matérialisés en table liquidity sont expliqués par labsence de `pool_id/pair_id` local pour leurs pools, pas par un échec de décodage.