0.7.53
This commit is contained in:
@@ -1,4 +1,10 @@
|
||||
# DEX Decoder Matrix — `khadhroony-bobobot` `0.7.50-pre-r2`
|
||||
# DEX Decoder Matrix — `khadhroony-bobobot` `0.7.53 final`
|
||||
|
||||
## Note `0.7.53 final` — PumpSwap clôturé et sources IDL locales
|
||||
|
||||
Le répertoire `idls/` devient une source locale de savoir en plus des liens Git. Les IDL Solscan locales doivent être comparées au registre upstream et au corpus avant promotion métier. `pump_swap` est clôturé côté transaction/log decoder : instructions IDL, events Anchor audit-only, `buy_exact_quote_in` via `BuyEvent` exact, tests synthétiques et SQL global. Raydium AMM v4 / CLMM / CPMM ne nécessitent pas de correction dans cette clôture ; les gaps Meteora sont reportés.
|
||||
|
||||
`sol-parser-sdk/idls/raydium_pool_v4.json` a été vérifié comme source annexe distincte des fichiers `idls/raydium_*.json` présents localement : il expose notamment `swapBaseIn` et des comptes OpenBook/Serum, mais aucun fichier local ne porte ce nom ni ne correspond à son empreinte/format. Il reste donc un audit conditionnel, pas une source bloquante pour `0.7.53`.
|
||||
|
||||
Cette matrice complète `kb_lib/src/dex_support_matrix.rs`. Elle documente **ce qui est fait**, **ce qui reste à faire**, et **le niveau de preuve attendu** par DEX/version.
|
||||
|
||||
@@ -17,7 +23,7 @@ Cette matrice complète `kb_lib/src/dex_support_matrix.rs`. Elle documente **ce
|
||||
|
||||
- Carbon decoders : `https://github.com/sevenlabs-hq/carbon/tree/main/decoders`
|
||||
- Solana Streamer : `https://github.com/0xfnzero/solana-streamer`
|
||||
- Sol Parser SDK IDLs : `https://github.com/0xfnzero/sol-parser-sdk/tree/main/idl`
|
||||
- Sol Parser SDK IDLs : `https://github.com/0xfnzero/sol-parser-sdk/tree/main/idls`
|
||||
- Pinax Substreams Solana IDLs : `https://github.com/pinax-network/substreams-solana-idls/tree/main/src`
|
||||
- HODL Warden Solana Tx Parser : `https://github.com/hodlwarden/solana-tx-parser/tree/main/src`
|
||||
- OpenBook v2 : `https://github.com/openbook-dex/openbook-v2`
|
||||
@@ -33,8 +39,8 @@ Cette matrice complète `kb_lib/src/dex_support_matrix.rs`. Elle documente **ce
|
||||
| 3 | `raydium_launchpad` | `bootstrap / 0.7.50` | Surface canonique normalisée, 1 entrée programme + 26 discriminants Carbon/IDL listés, fallback audit/mapped decoder, SQL dédié. | Créer DB neuve, backfill par discriminant, replay forcé, promouvoir seulement après corpus local. |
|
||||
| 4 | `raydium_amm_v4` | `supported / 0.7.51 closed` | Decoder maximal AMM v4 `00..11`, swaps spécialisés, lifecycle/liquidity/fees/admin/orderbook validés. | Stable Swap clôturé ensuite en `0.7.52`; surveiller les surfaces restantes. |
|
||||
| 5 | `raydium_stable_swap` | `supported / 0.7.52 closed` | Decoder legacy 1 octet, surface `00..0d`, swaps matérialisés depuis deltas vault exacts. | Surveiller seulement de nouveaux discriminants ou `swap_event` observé. |
|
||||
| 6 | `raydium_pool_v4` | `to_verify / 0.7.53 conditional audit` | IDL annexe mentionnée par fnzero, non présente dans l'archive locale, pas de program id/rôle confirmé ici. | Ne pas promouvoir tant que program id distinct, rôle exact et corpus exploitable ne sont pas confirmés. |
|
||||
| 7 | `pump_swap` | `supported / 0.7.54 planned` | `buy`/`sell` décodés et matérialisés ; trade/candle OK. | Ajouter tous les events Carbon/Solana Streamer : cashback, fee, volume accumulator, admin/config ; conserver les non-trades hors candles. |
|
||||
| 6 | `raydium_pool_v4` | `to_verify / late-phase conditional audit` | IDL annexe mentionnée par fnzero, non présente dans l'archive locale, pas de program id/rôle confirmé ici. | Ne pas promouvoir tant que program id distinct, rôle exact et corpus exploitable ne sont pas confirmés. |
|
||||
| 7 | `pump_swap` | `supported / 0.7.53 closed` | `buy`, `sell` + `buy_exact_quote_in` matérialisable via `BuyEvent` exact ; instructions non-trade spécialisées : liquidity, fee/creator fee, admin/config, cashback/token incentives, volume accumulator ; events Anchor autonomes audit-only. | Trades/candles uniquement depuis montants exacts ; failed tx decoded-only ; `instruction_bounds_only` reste decoded-only ; tests synthétiques IDL et SQL global ajoutés. |
|
||||
| 8 | `pump_fun` | `partial / 0.7.55 launch_surface` | Création/token launch partiellement décodée ; intégrée au pipeline de listings. | Traiter tous les events Pump.fun disponibles : buy/sell/migrate/create/update ; séparer bonding/launch de DEX effectif ; valider migration vers PumpSwap. |
|
||||
| 9 | `meteora_dbc` | `partial / 0.7.56 planned` | Swaps/instruction audits observés ; Demo3 donne du corpus. | Couverture complète DBC : launch/bonding curve, swap, migration, config/admin, fees ; matérialiser seulement ce qui est prouvé. |
|
||||
| 10 | `meteora_dlmm` | `supported / 0.7.57 parity` | Couverture avancée validée en `0.7.45` : swaps, liquidity, positions, lifecycle, fees ; non-trade matérialisé. | Résoudre les audits résiduels non mappés ; comparer Carbon/IDL pour events rewards/admin restants ; revalidation base neuve. |
|
||||
@@ -273,3 +279,9 @@ La tranche a été validée sur base SQLite dédiée : tous les discriminants `0
|
||||
|---|---|---|---|---|
|
||||
| `raydium_stable_swap` | `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h` | supported / closed | legacy 1 octet | Surface locale `00..0d` couverte ; swaps `swap_base_in/out` matérialisés uniquement depuis deltas vault exacts ; instruction bounds et failed tx restent decoded-only. |
|
||||
|
||||
## 0.7.53 — PumpSwap
|
||||
|
||||
| Decoder | Program id | Statut | Source discriminants | Couverture locale | Règles métier |
|
||||
|---|---|---:|---|---|---|
|
||||
| `pump_swap` | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | supported / 0.7.53 closed | upstream registry + `idls/pump_swap.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.json` + corpus Demo3/replay | instructions : `buy`, `sell`, `buy_exact_quote_in`, `deposit`, `withdraw`, `create_pool`, `create_config`, `update_fee_config`, creator-fee, cashback, token incentives, volume accumulator, admin/config ; events Anchor autonomes audit-only | `buy_exact_quote_in` trade uniquement avec `pump_swap_anchor_buy_event`; aucun non-swap en trade/candle ; failed tx decoded-only ; `buy_event`/`sell_event` Program-data audit-only ; `transfer_creator_fees_to_pump_v2` et `update_buyback_config` confirmés par Solscan IDL ; `set_reserved_fee_recipient` conservé sur preuve log locale |
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.50-pre-r2`
|
||||
# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.53 final`
|
||||
|
||||
Cette matrice complète `docs/DEX_DECODER_MATRIX.md` avec une lecture par familles d'événements. Elle ne remplace pas la preuve locale : une entrée Git/IDL reste un indice tant qu'elle n'est pas observée dans le corpus local puis validée par replay et SQL.
|
||||
|
||||
@@ -214,3 +214,38 @@ Status: **closed on local corpus**.
|
||||
|
||||
Stable Swap swaps are not materialized from instruction min/max bounds. `swap_base_in/out` require `amountSource=stable_swap_vault_balance_delta`; `stable_swap_instruction_bounds_only` remains decoded-only and, in the final corpus, appears only on failed transactions.
|
||||
|
||||
## 0.7.53 — `pump_swap`
|
||||
|
||||
Program id unique : `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA`.
|
||||
|
||||
| Entry | Discriminator | Family | Expected DB target | Local event kind | Status |
|
||||
|---|---:|---|---|---|---|
|
||||
| `buy` | `66063d1201daebea` | `swap` | `k_sol_trade_events` | `pump_swap.buy` | local specialized decoder ; materialize only from exact transfer/vault deltas |
|
||||
| `sell` | `33e685a4017f83ad` | `swap` | `k_sol_trade_events` | `pump_swap.sell` | local specialized decoder ; materialize only from exact transfer/vault deltas |
|
||||
| `buy_exact_quote_in` | `c62e1552b4d9e870` | `swap` | `k_sol_trade_events` only when exact Anchor `BuyEvent` is present ; otherwise decoded-only | `pump_swap.buy_exact_quote_in` | local specialized decoder ; `amountSource=pump_swap_anchor_buy_event` materializes trades ; `instruction_bounds_only` rows keep explicit `skipTradeReason` |
|
||||
| `create_pool` | `e992d18ecf6840bc` | `pool_create` | `k_sol_pool_lifecycle_events` or decoded-only | `pump_swap.create_pool` | local specialized instruction ; non-trade |
|
||||
| `deposit` | `f223c68952e1f2b6` | `liquidity_add` | `k_sol_liquidity_events` or decoded-only | `pump_swap.deposit` | local specialized instruction ; non-trade |
|
||||
| `withdraw` | `b712469c946da122` | `liquidity_remove` | `k_sol_liquidity_events` or decoded-only | `pump_swap.withdraw` | local specialized instruction ; non-trade |
|
||||
| `collect_coin_creator_fee` | `a039592ab58b2b42` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.collect_coin_creator_fee` | local specialized instruction ; non-trade |
|
||||
| `transfer_creator_fees_to_pump` | `8b348655e4e56cf1` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.transfer_creator_fees_to_pump` | local specialized instruction ; non-trade |
|
||||
| `transfer_creator_fees_to_pump_v2` | `01214eb921432c5c` | `fee` | `k_sol_fee_events` or decoded-only | `pump_swap.transfer_creator_fees_to_pump_v2` | Solscan IDL proof + local log proof: `transfer_creator_fees_to_pump_v2` / `Instruction: TransferCreatorFeesToPumpV2` ; non-trade |
|
||||
| `claim_cashback` | `253a237ebe35e4c5` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.claim_cashback` | local specialized instruction ; non-trade |
|
||||
| `claim_token_incentives` | `1004471ccc01281b` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.claim_token_incentives` | local specialized instruction ; non-trade |
|
||||
| `init_user_volume_accumulator` | `5e06ca73ff60e8b7` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.init_user_volume_accumulator` | local specialized instruction ; non-trade |
|
||||
| `sync_user_volume_accumulator` | `561fc057a3574fee` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.sync_user_volume_accumulator` | local specialized instruction ; non-trade |
|
||||
| `close_user_volume_accumulator` | `f945a4da9667548a` | `reward` | `k_sol_reward_events` or decoded-only | `pump_swap.close_user_volume_accumulator` | local specialized instruction ; non-trade |
|
||||
| `update_buyback_config` | `fbe0ab92a01a71e9` | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.update_buyback_config` | Solscan IDL proof + local log proof: `update_buyback_config` / `Instruction: UpdateBuybackConfig` ; non-trade |
|
||||
| `set_reserved_fee_recipient` | `cfbdb247a77a44b4` | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.set_reserved_fee_recipient` | local log proof only: `Instruction: SetReservedFeeRecipient` ; absent from checked Solscan IDL raw ; non-trade |
|
||||
| admin/config group | see report | `admin_config` | `k_sol_pool_admin_events` or decoded-only | `pump_swap.*` | local specialized instruction ; non-trade ; includes `toggle_cashback_enabled` and `migrate_pool_coin_creator` as admin-only |
|
||||
| `buy_event` / `sell_event` | `67f4521f2cf57777` / `3e2f370aa503dc2a` | `swap_event_audit` | decoded-only | not local-instruction mapped | Program-data event discriminators listed; not used to duplicate local instruction trades |
|
||||
| auxiliary Program-data events | see report | fee/reward/admin/liquidity | decoded-only until payload-specific materializer exists | not local-instruction mapped | explicit upstream status required after replay |
|
||||
|
||||
|
||||
|
||||
### Fermeture `0.7.53`
|
||||
|
||||
- `pump_swap` ne présente plus de decoded event local sans coverage dans le corpus de clôture.
|
||||
- `buy_exact_quote_in` est matérialisé seulement quand le `BuyEvent` Anchor donne les montants exacts ; les bornes d’instruction seules restent non actionnables.
|
||||
- Les events Anchor `*_event` sont décodés en audit-only pour éviter les doublons, sauf exception matérialisable explicitement testée.
|
||||
- Les gaps globaux restants sont classés comme backlog upstream (`pump_fees`, `pump_fun`, `jupiter_swap`, agrégateurs), gaps Meteora reportés, ou observations non attribuées.
|
||||
- Les checks Raydium AMM v4 / CLMM / CPMM normalisés sont vides ; aucune correction Raydium n’est incluse dans cette clôture.
|
||||
|
||||
150
docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md
Normal file
150
docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md
Normal file
@@ -0,0 +1,150 @@
|
||||
<!-- file: docs/prompts/PROMPT_0_7_53_PUMP_SWAP.md -->
|
||||
|
||||
# Prompt de reprise — `0.7.53 pump_swap`
|
||||
|
||||
Nous reprenons le workspace Rust/Tauri `khadhroony-bobobot` après le commit final `0.7.52 raydium_stable_swap`.
|
||||
|
||||
## Objectif de tranche
|
||||
|
||||
Version cible : `0.7.53`
|
||||
|
||||
Surface cible unique : `pump_swap`
|
||||
|
||||
Program id cible unique :
|
||||
|
||||
```text
|
||||
pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA
|
||||
```
|
||||
|
||||
Règle de phasage validée : **une version = un `program_id`**.
|
||||
|
||||
`raydium_pool_v4.json` est explicitement repoussé vers la fin du phasage. Il ne doit pas bloquer `0.7.53`.
|
||||
|
||||
## Contexte validé avant reprise
|
||||
|
||||
Raydium est clos sur les surfaces suivantes :
|
||||
|
||||
- `raydium_cpmm` — `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` ;
|
||||
- `raydium_clmm` — `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` ;
|
||||
- `raydium_launchpad` — `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` ;
|
||||
- `raydium_amm_v4` — `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` ;
|
||||
- `raydium_stable_swap` — `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h`.
|
||||
|
||||
`0.7.52 raydium_stable_swap` est clos avec :
|
||||
|
||||
- `cargo test -p kb_lib` : `407 passed`, `0 failed` ;
|
||||
- `cargo clippy -p kb_lib --all-targets -- -D warnings` : OK ;
|
||||
- swaps matérialisés uniquement depuis `amountSource=stable_swap_vault_balance_delta` ;
|
||||
- failed transactions conservées decoded-only ;
|
||||
- aucun successful swap non expliqué.
|
||||
|
||||
## Sources à utiliser pour `pump_swap`
|
||||
|
||||
Sources obligatoires à vérifier avant de patcher :
|
||||
|
||||
- `kb_lib/src/constants.rs` et `SOLSCAN_ACCOUNT_SOURCES` ;
|
||||
- sources upstream Git déjà intégrées dans le registre : Carbon, fnzero, Pinax, HODL Warden si disponibles ;
|
||||
- IDL Solscan du programme `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` si disponible ;
|
||||
- corpus local Demo3 + backfill signature/pool ;
|
||||
- `k_sol_dex_event_coverage_entries` après replay.
|
||||
|
||||
Les sources Git/IDL/Solscan sont des indices. La preuve métier exige corpus local, replay et SQL.
|
||||
|
||||
## Tâches attendues
|
||||
|
||||
1. Inspecter le support local existant de `pump_swap`.
|
||||
2. Lister toutes les instructions/events/discriminators disponibles depuis les sources upstream/IDL.
|
||||
3. Comparer avec les events localement couverts.
|
||||
4. Compléter le decoder `pump_swap` pour couvrir au minimum :
|
||||
- `buy` ;
|
||||
- `sell` ;
|
||||
- fees / creator fees / protocol fees si présents ;
|
||||
- admin/config si présents ;
|
||||
- events auxiliaires tels que cashback, volume accumulator ou équivalents si présents dans les sources.
|
||||
5. Matérialiser en `k_sol_trade_events` et `k_sol_pair_candles` uniquement si les montants exacts et le sens économique sont prouvés.
|
||||
6. Conserver les failed transactions comme decoded-only avec `failed_transaction`.
|
||||
7. Matérialiser les non-trade uniquement vers les tables adaptées : liquidity, fee, admin, lifecycle, reward, orderbook ou decoded-only selon le cas.
|
||||
8. Nettoyer les fallbacks `upstream_git.instruction_match` uniquement quand un decoder local spécialisé couvre vraiment l’entrée.
|
||||
9. Mettre à jour la coverage DB et la matrice documentaire.
|
||||
10. Ajouter ou mettre à jour le SQL de validation dédié : `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql`.
|
||||
|
||||
## Invariants obligatoires
|
||||
|
||||
- Aucun non-swap ne doit créer de trade/candle.
|
||||
- Aucune transaction failed ne doit créer de trade/candle.
|
||||
- Aucun trade/candle ne doit être créé depuis des bornes d’instruction ou des montants incomplets.
|
||||
- Aucun router/aggregator ne doit créer un doublon si le DEX effectif matérialise déjà le trade.
|
||||
- Aucun `program_id` ne doit être inventé.
|
||||
- Aucun compte non-programme de `SOLSCAN_ACCOUNT_SOURCES` ne doit être promu en decoder autonome.
|
||||
- `kb_demo_app` ne doit pas contenir de logique métier DEX profonde.
|
||||
|
||||
## Contraintes de code
|
||||
|
||||
Respecter les contraintes du projet :
|
||||
|
||||
- Rust 2024 ;
|
||||
- aucun fichier `mod.rs` ;
|
||||
- pas de `pub mod` ; utiliser `mod` + `pub use` ;
|
||||
- pas de `anyhow`, pas de `thiserror` ;
|
||||
- pas de `?`, `unwrap`, `expect` dans le code applicatif `kb_lib` ;
|
||||
- gestion d’erreurs explicite via `match`, `if let Err`, `let Err = ... else` ;
|
||||
- rustdoc publique ;
|
||||
- `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]` ;
|
||||
- tracing obligatoire ;
|
||||
- tests offline ;
|
||||
- si une requête DB est ajoutée ou modifiée, mettre à jour les re-exports dans `kb_lib/src/db.rs`, puis dans `kb_lib/src/lib.rs`.
|
||||
|
||||
## Validation attendue
|
||||
|
||||
Commandes locales à exécuter après patch :
|
||||
|
||||
```bash
|
||||
cargo fmt
|
||||
cargo test -p kb_lib
|
||||
cargo clippy -p kb_lib --all-targets -- -D warnings
|
||||
```
|
||||
|
||||
Replay attendu sur une base dédiée `0.7.53 pump_swap` :
|
||||
|
||||
```text
|
||||
skipDexDecode=no
|
||||
forceDexDecode=yes
|
||||
deferInstructionObservations=yes
|
||||
```
|
||||
|
||||
SQL de clôture attendu :
|
||||
|
||||
- coverage par entrée `pump_swap` ;
|
||||
- instruction observations ;
|
||||
- absence d’audit résiduel local non expliqué ;
|
||||
- absence de fallback upstream pour les entrées couvertes localement ;
|
||||
- failed tx -> zéro trade ;
|
||||
- non-swap -> zéro trade ;
|
||||
- decoded without coverage -> vide ;
|
||||
- successful non-materialized inexpliqués -> vide ;
|
||||
- multi-target materialization -> vide ;
|
||||
- résumé matérialisation par event_kind.
|
||||
|
||||
## Livrables documentaires
|
||||
|
||||
Mettre à jour au minimum :
|
||||
|
||||
- `ROADMAP.md` ;
|
||||
- `CHANGELOG.md` ;
|
||||
- `docs/DEX_DECODER_MATRIX.md` ;
|
||||
- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ;
|
||||
- `docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md` ;
|
||||
- `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql`.
|
||||
|
||||
## Décision attendue en fin de tranche
|
||||
|
||||
`0.7.53 pump_swap` est clôturable uniquement si :
|
||||
|
||||
```text
|
||||
- tous les events/instructions disponibles ont un statut explicite ;
|
||||
- les swaps réussis exploitables produisent trades/candles ;
|
||||
- les failed transactions restent decoded-only ;
|
||||
- les non-trade sont matérialisés dans les bonnes tables ou restent decoded-only expliqués ;
|
||||
- la coverage DB ne contient pas de gap local inexpliqué ;
|
||||
- cargo test et clippy sont OK.
|
||||
```
|
||||
272
docs/prompts/PROMPT_0_7_54_PUMP_FUN.md
Normal file
272
docs/prompts/PROMPT_0_7_54_PUMP_FUN.md
Normal file
@@ -0,0 +1,272 @@
|
||||
<!-- file: docs/prompts/PROMPT_0_7_54_PUMP_FUN.md -->
|
||||
|
||||
# Prompt de reprise — khadhroony-bobobot 0.7.54 — pump_fun
|
||||
|
||||
Tu reprends le workspace Rust/Tauri `khadhroony-bobobot` après clôture documentaire et fonctionnelle de `0.7.53 pump_swap`.
|
||||
|
||||
## 1. Fichiers à utiliser comme base
|
||||
|
||||
Je fournis l’archive la plus récente du workspace, intégrant normalement les deltas de clôture `0.7.53`.
|
||||
|
||||
À considérer comme sources locales de savoir :
|
||||
|
||||
- le code Rust du workspace ;
|
||||
- les fichiers Markdown (`README.md`, `ROADMAP.md`, `CHANGELOG.md`, `docs/**`) ;
|
||||
- les SQL de validation dans `validation_sql/**` ;
|
||||
- le répertoire `idls/**`, ajouté au projet, contenant des IDL JSON téléchargés depuis Solscan ;
|
||||
- les liens Git/upstream déjà documentés dans les docs ;
|
||||
- les résultats SQL/logs que je colle dans la conversation.
|
||||
|
||||
Ne pas supposer que les docs sont parfaites : les vérifier contre le code et contre les IDL locales.
|
||||
|
||||
## 2. État validé avant cette version
|
||||
|
||||
La version `0.7.53` a fermé `pump_swap` côté transaction/log decoder :
|
||||
|
||||
- `cargo test -p kb_lib` : `421 passed`;
|
||||
- `cargo clippy -p kb_lib --all-targets -- -D warnings` : OK ;
|
||||
- `pump_swap.buy`, `pump_swap.sell`, `pump_swap.buy_exact_quote_in` matérialisent correctement les trades ;
|
||||
- `buy_exact_quote_in` utilise `pump_swap_anchor_buy_event` quand l’Anchor `BuyEvent` exact est disponible ;
|
||||
- les `*_event` Anchor PumpSwap sont décodés en audit-only sauf exception métier explicite ;
|
||||
- `claim_token_incentives_event` est prêt à matérialiser `k_sol_reward_events` si un event réussi apparaît ;
|
||||
- `pump_swap` ne présente plus de decoded event sans coverage, ni fallback upstream résiduel, ni trade candidate réussi non matérialisé ;
|
||||
- les surfaces Raydium déjà travaillées (`raydium_amm_v4`, `raydium_clmm`, `raydium_cpmm`) ne doivent pas être rouvertes sauf bug prouvé ;
|
||||
- les petits gaps Meteora sont volontairement différés.
|
||||
|
||||
Ne pas modifier PumpSwap ou Raydium sauf preuve SQL/code claire d’une régression.
|
||||
|
||||
## 3. Objectif de la version 0.7.54
|
||||
|
||||
Objectif principal : ouvrir et avancer une tranche `pump_fun`.
|
||||
|
||||
Cette tranche doit traiter la surface launch/mint Pump.fun, qui est logiquement prioritaire avant `pump_fees`.
|
||||
|
||||
Le backlog global montre des entrées `pump_fun` encore en fallback upstream, notamment :
|
||||
|
||||
- `pump_fun.collect_creator_fee` / discriminator `1416567bc61cdb84` ;
|
||||
- `pump_fun.migrate_bonding_curve_creator` / `577c34bf3426d6e8` ;
|
||||
- `pump_fun.distribute_creator_fees` / `a572670079cef751` ;
|
||||
- `pump_fun.admin_set_creator` / `4519ab8e39ef0d04` ;
|
||||
- `pump_fun.extend_account` / `ea66c2cb96483ee5` ;
|
||||
- `pump_fun.set_creator` / `fe94ff70cf8eaaa5` ;
|
||||
- `pump_fun.migrate` / `9beae792ec9ea21e` ;
|
||||
- `pump_fun.claim_cashback` / `253a237ebe35e4c5` ;
|
||||
- `pump_fun.sell` / `33e685a4017f83ad` ;
|
||||
- autres discriminators `pump_fun` observés dans `k_sol_instruction_observations`.
|
||||
|
||||
L’objectif n’est pas seulement de faire disparaître un fallback : il faut couvrir proprement la surface `pump_fun` :
|
||||
|
||||
- registry/coverage ;
|
||||
- decoder local ou statut local explicitement decoded-only/audit-only ;
|
||||
- matérialisation métier si les données sont fiables ;
|
||||
- tests unitaires ;
|
||||
- SQL de validation ;
|
||||
- documentation.
|
||||
|
||||
## 4. Périmètre
|
||||
|
||||
### Inclus
|
||||
|
||||
- `pump_fun` launch/mint/bonding-curve surface ;
|
||||
- instructions/events liés à création/migration/configuration/creator fees/cashback si présents dans IDL ou corpus ;
|
||||
- intégration coverage ;
|
||||
- matérialisation vers tables métier seulement si fiable.
|
||||
|
||||
### Hors périmètre sauf nécessité démontrée
|
||||
|
||||
- `pump_swap`, déjà fermé en `0.7.53` ;
|
||||
- `raydium_*`, sauf régression prouvée ;
|
||||
- `meteora_*`, volontairement différé ;
|
||||
- `jupiter_swap`, `dflow_aggregator_v4`, `onchain_labs_dex_v2`, `orca_whirlpools`, backlog futur ;
|
||||
- `pump_fees`, qui doit venir après `pump_fun`, probablement en `0.7.55`.
|
||||
|
||||
## 5. Méthode obligatoire
|
||||
|
||||
### 5.1 Nouvelle base SQLite
|
||||
|
||||
Créer une nouvelle DB dédiée à `0.7.54`, ne pas travailler sur l’ancienne DB de validation PumpSwap.
|
||||
|
||||
Démarrage attendu :
|
||||
|
||||
- catalog initial propre ou connu ;
|
||||
- backfills ciblés ;
|
||||
- replay forcé ;
|
||||
- validation SQL.
|
||||
|
||||
### 5.2 Backfill de corpus
|
||||
|
||||
Construire un corpus local à partir de :
|
||||
|
||||
1. filtres Solscan.io quand disponibles ;
|
||||
2. Demo3 discovery quand nécessaire ;
|
||||
3. batch backfill de groupes de signatures ;
|
||||
4. program/signature backfill si pertinent ;
|
||||
5. signatures issues des requêtes SQL `sample_signature`.
|
||||
|
||||
Utiliser d’abord les signatures fortes observées dans le backlog :
|
||||
|
||||
- `pump_fun.collect_creator_fee`;
|
||||
- `pump_fun.migrate_bonding_curve_creator`;
|
||||
- `pump_fun.distribute_creator_fees`;
|
||||
- `pump_fun.admin_set_creator`;
|
||||
- `pump_fun.extend_account`;
|
||||
- `pump_fun.set_creator`;
|
||||
- `pump_fun.migrate`;
|
||||
- `pump_fun.claim_cashback`;
|
||||
- puis autres discriminators observés.
|
||||
|
||||
Après chaque groupe de backfill :
|
||||
|
||||
- replay local avec `skipDexDecode=no`;
|
||||
- utiliser `forceDexDecode=yes` quand le decoder/coverage change ;
|
||||
- `deferInstructionObservations=yes` ;
|
||||
- rafraîchir catalog ;
|
||||
- relancer les SQL de surveillance.
|
||||
|
||||
### 5.3 Sources
|
||||
|
||||
Utiliser en priorité :
|
||||
|
||||
- `idls/**` local ;
|
||||
- code existant ;
|
||||
- docs existantes ;
|
||||
- `upstream_registry_generated.rs` ;
|
||||
- sources Git déjà référencées dans les docs ;
|
||||
- Solscan signatures/logs ;
|
||||
- payloads locaux DB.
|
||||
|
||||
Si une IDL locale contredit une source Git, signaler la divergence et ne pas inventer.
|
||||
|
||||
## 6. Contraintes de code Rust
|
||||
|
||||
Respecter strictement les conventions du projet :
|
||||
|
||||
- Rust 2024 ;
|
||||
- pas de `?` ;
|
||||
- pas de `unwrap()` / `expect()` en code applicatif ;
|
||||
- pas de `anyhow` / `thiserror` ;
|
||||
- `match` / `if let Err` explicites ;
|
||||
- async-first ;
|
||||
- `tracing` obligatoire ;
|
||||
- pas de `mod.rs` ;
|
||||
- pas de `pub mod` ; utiliser `mod` + `pub use` ;
|
||||
- imports limités, types appelés de façon qualifiée quand c’est la convention locale ;
|
||||
- tests offline ;
|
||||
- ne pas casser `#![deny(unreachable_pub)]` et `#![warn(missing_docs)]`.
|
||||
|
||||
Si des requêtes DB sont ajoutées ou déplacées, penser aux re-exports :
|
||||
|
||||
- `kb_lib/src/db.rs` ;
|
||||
- `kb_lib/src/lib.rs`.
|
||||
|
||||
## 7. Matérialisation attendue
|
||||
|
||||
Pour `pump_fun`, ne pas forcer une matérialisation si les montants/acteurs/comptes ne sont pas prouvés.
|
||||
|
||||
Classer explicitement chaque entrée :
|
||||
|
||||
- `k_sol_launch_events` pour les événements de launch/mint/migration ;
|
||||
- `k_sol_fee_events` si l’instruction représente réellement des frais exploitables ;
|
||||
- `k_sol_pool_admin_events` si c’est de la configuration/admin/creator ;
|
||||
- `k_sol_reward_events` uniquement si c’est réellement une récompense/incitation/cashback fiable ;
|
||||
- `k_sol_dex_decoded_events_only` si audit-only ou données insuffisantes ;
|
||||
- `k_sol_trade_events` seulement si c’est un swap/trade fiable ;
|
||||
- `skip*Reason` explicite quand non matérialisable.
|
||||
|
||||
Ne jamais matérialiser une transaction failed comme business event.
|
||||
|
||||
## 8. SQL de validation à utiliser
|
||||
|
||||
Utiliser et adapter :
|
||||
|
||||
- `validation_sql/SQL_VALIDATION_DEX_COVERAGE_GLOBAL_0_7_53.sql`;
|
||||
- les SQL de validation PumpSwap comme modèle ;
|
||||
- une nouvelle validation dédiée à `pump_fun`, par exemple :
|
||||
- `validation_sql/SQL_VALIDATION_PUMP_FUN_0_7_54.sql`.
|
||||
|
||||
Requêtes minimales attendues :
|
||||
|
||||
1. coverage `pump_fun` ;
|
||||
2. instruction observations `pump_fun` ;
|
||||
3. decoded events `pump_fun` sans coverage ;
|
||||
4. fallback upstream `pump_fun` résiduel ;
|
||||
5. successful non-materialized events sans skip reason ;
|
||||
6. failed tx materialization safety ;
|
||||
7. multi-target materialization safety ;
|
||||
8. materialization summary ;
|
||||
9. comparaison entre `k_sol_instruction_observations` et `k_sol_dex_event_coverage_entries` ;
|
||||
10. global watchlist après replay.
|
||||
|
||||
## 9. Invariants de validation
|
||||
|
||||
Après correction, viser :
|
||||
|
||||
- pas de `pump_fun` decoded event local sans coverage ;
|
||||
- pas de fallback `upstream_git` résiduel pour les entrées `pump_fun` couvertes localement ;
|
||||
- pas de materialized business event sur failed transaction ;
|
||||
- pas de multi-target incohérent ;
|
||||
- tous les events/instructions observés ont :
|
||||
- un decoder local,
|
||||
- ou un statut audit-only,
|
||||
- ou un skip reason explicite,
|
||||
- ou une justification documentée s’ils restent upstream-only.
|
||||
|
||||
## 10. Documentation à mettre à jour
|
||||
|
||||
À la fin de la tranche, mettre à jour :
|
||||
|
||||
- `CHANGELOG.md` : une ligne ;
|
||||
- `README.md` : état courant, nouvelle version, validation ;
|
||||
- `ROADMAP.md` : phasage et clôture/état de `pump_fun`, puis annonce de `pump_fees` en version suivante ;
|
||||
- `docs/DEX_DECODER_MATRIX.md` ;
|
||||
- `docs/DEX_EVENT_COVERAGE_MATRIX.md` ;
|
||||
- éventuellement un rapport :
|
||||
- `docs/reports/PUMP_FUN_EVENT_COVERAGE_REPORT.md`.
|
||||
|
||||
Ne pas gonfler les docs inutilement : noter les faits validés, les limites, et les prochaines tranches.
|
||||
|
||||
## 11. Format de livraison attendu
|
||||
|
||||
Ne pas fournir une archive complète du workspace sauf demande explicite.
|
||||
|
||||
Fournir un delta zip contenant uniquement les fichiers modifiés/ajoutés.
|
||||
|
||||
Nom recommandé :
|
||||
|
||||
`khadhroony-bobobot-v0.7.54-pump_fun-delta-N-files.zip`
|
||||
|
||||
Chaque réponse de livraison doit inclure :
|
||||
|
||||
- résumé des changements ;
|
||||
- liste exacte des fichiers modifiés ;
|
||||
- commandes à lancer :
|
||||
- `cargo fmt`
|
||||
- `cargo test -p kb_lib`
|
||||
- `cargo clippy -p kb_lib --all-targets -- -D warnings`
|
||||
- replay recommandé ;
|
||||
- SQL à exécuter ;
|
||||
- ce qui est attendu dans les résultats.
|
||||
|
||||
## 12. Priorités si plusieurs gaps apparaissent
|
||||
|
||||
Ordre de priorité :
|
||||
|
||||
1. `pump_fun` ;
|
||||
2. `pump_fees` seulement si strictement nécessaire pour comprendre un flux `pump_fun` ;
|
||||
3. ne pas traiter Meteora dans cette version ;
|
||||
4. ne pas rouvrir Raydium sauf régression démontrée ;
|
||||
5. ne pas ouvrir Jupiter/dFlow/onchain_labs dans cette tranche sauf pour les classer en backlog.
|
||||
|
||||
## 13. Première tâche demandée
|
||||
|
||||
Commencer par analyser l’archive fournie :
|
||||
|
||||
1. identifier les fichiers existants liés à `pump_fun`, `pump_fees`, upstream registry, coverage, materialization ;
|
||||
2. chercher dans `idls/**` s’il existe une IDL Solscan liée à `pump_fun` ;
|
||||
3. produire un état des lieux court :
|
||||
- entrées upstream disponibles ;
|
||||
- entrées observées dans SQL/logs fournis ;
|
||||
- fichiers à modifier ;
|
||||
- hypothèse de classification par entry ;
|
||||
- SQL initial de backfill/validation ;
|
||||
4. proposer puis produire le premier delta minimal.
|
||||
128
docs/reports/DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md
Normal file
128
docs/reports/DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# DEX coverage global watchlist — `0.7.53`
|
||||
|
||||
## Objet
|
||||
|
||||
Ce rapport accompagne la clôture `0.7.53 pump_swap`. Il sépare les anomalies bloquantes des files de travail futures.
|
||||
|
||||
`pump_swap` est clos côté transaction/log decoder et matérialisation métier. Les lignes restantes de surveillance globale ne sont pas des erreurs PumpSwap.
|
||||
|
||||
## Résultat de clôture PumpSwap
|
||||
|
||||
Validation rapportée :
|
||||
|
||||
```text
|
||||
cargo test -p kb_lib -> 421 passed / 0 failed
|
||||
cargo clippy -p kb_lib --all-targets -- -D warnings -> OK
|
||||
```
|
||||
|
||||
Replay élargi rapporté :
|
||||
|
||||
```text
|
||||
1189 replayed
|
||||
0 decode skipped
|
||||
1189 ledger upserts
|
||||
967 unsafe ledger rows
|
||||
928 trades
|
||||
13 liquidity
|
||||
8 lifecycle
|
||||
0 tokenAccount
|
||||
3700 candle upserts
|
||||
instructionObservations = 25724
|
||||
resetDeleted = 5622
|
||||
catalog = 76 tokens / 80 pools / 80 pairs
|
||||
```
|
||||
|
||||
Checks PumpSwap attendus vides :
|
||||
|
||||
- decoded events sans coverage ;
|
||||
- fallback `upstream_git` couvert localement ;
|
||||
- successful trade candidates sans trade et sans raison explicite ;
|
||||
- failed transaction matérialisée en business trade ;
|
||||
- non-swap matérialisé en trade ;
|
||||
- multi-target materialization.
|
||||
|
||||
`buy_exact_quote_in` :
|
||||
|
||||
```text
|
||||
pump_swap_anchor_buy_event -> 168 decoded / 167 trades / 1 failed tx
|
||||
instruction_bounds_only -> decoded-only, sans trade
|
||||
```
|
||||
|
||||
## Non-régression Raydium
|
||||
|
||||
Les checks ciblés Raydium AMM v4 / CLMM / CPMM normalisés sont vides. Il n'y a pas de correction Raydium à inclure dans `0.7.53`.
|
||||
|
||||
Lecture correcte :
|
||||
|
||||
- `raydium_amm_v4.swap_base_in_v2` : observé et matérialisé dans le corpus courant ;
|
||||
- `raydium_clmm.swap_v2` : observé et matérialisé dans le corpus courant ;
|
||||
- `raydium_cpmm.swap_base_input` : observé et matérialisé dans le corpus courant ;
|
||||
- les entrées `upstream_git_mapped_unverified` avec `observed_count=0` sont des entrées registry non observées, pas des régressions.
|
||||
|
||||
## Gaps locaux reportés
|
||||
|
||||
La requête globale `local decoded events without coverage` retourne des gaps Meteora connus et reportés :
|
||||
|
||||
```text
|
||||
meteora_dlmm.swap
|
||||
meteora_damm_v2.instruction_audit
|
||||
meteora_damm_v2.swap
|
||||
```
|
||||
|
||||
Décision : ne pas les corriger dans `0.7.53`. Ils seront repris dans les tranches Meteora futures.
|
||||
|
||||
## Backlog upstream observé
|
||||
|
||||
La file `upstream_git.instruction_match` indique les prochaines surfaces à prioriser. Au moment de la clôture :
|
||||
|
||||
| Priorité | Surface | Indice principal | Décision |
|
||||
|---:|---|---|---|
|
||||
| 1 | `pump_fees` | `get_fees` très fréquent | Prochaine tranche recommandée ; aucun trade/candle direct attendu. |
|
||||
| 2 | `pump_fun` | creator fees, migrate, set/admin creator | Tranche launch/bonding séparée. |
|
||||
| 3 | `jupiter_swap` | `route_v2`, `create_token_account`, `route` | Agrégateur/router ; éviter double-count DEX effectifs. |
|
||||
| 4 | `dflow_aggregator_v4`, `onchain_labs_dex_v2` | swaps/route helpers | Surfaces secondaires après Pump/Meteora. |
|
||||
| 5 | `orca_whirlpools` | faibles occurrences | À reprendre plus tard avec corpus dédié. |
|
||||
|
||||
## Observations non attribuées
|
||||
|
||||
Les observations avec `decoder_code` vide ne doivent pas être traitées comme des discriminants Anchor confirmés. Elles exigent d'abord :
|
||||
|
||||
1. inspection de `sample_signature` ;
|
||||
2. extraction du `program_id` effectif ;
|
||||
3. comparaison aux IDL locales `idls/` et aux sources Git ;
|
||||
4. ajout d'un decoder ou d'un statut explicite seulement si le programme est identifié.
|
||||
|
||||
## Source IDL locale
|
||||
|
||||
Le répertoire `idls/` est désormais une source locale de savoir. Les IDL téléchargées depuis Solscan doivent être utilisées en plus des liens Git, avec la règle suivante : une IDL donne une surface possible, mais la matérialisation métier exige corpus, replay et SQL.
|
||||
|
||||
## Vérification `raydium_pool_v4.json`
|
||||
|
||||
Fichier Git vérifié : `0xfnzero/sol-parser-sdk/idls/raydium_pool_v4.json`.
|
||||
|
||||
Constats :
|
||||
|
||||
- la page GitHub annonce `3400` lignes / environ `101 KB` ;
|
||||
- le fichier expose notamment `swapBaseIn`, `addLiquidity` et des comptes OpenBook/Serum (`OpenBookMarket`, `OpenBookBids`, `OpenBookAsks`, etc.) ;
|
||||
- la chaîne du program id AMM v4 `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` n'apparaît pas dans la page GitHub consultée ;
|
||||
- aucun fichier local `idls/raydium_*.json` ne porte le nom `raydium_pool_v4` ;
|
||||
- les fichiers Raydium locaux présents sont `raydium_clmm`, `raydium_cpmm`, `raydium_launchlab` et `raydium_lock`.
|
||||
|
||||
Table locale :
|
||||
|
||||
| Fichier local | Name IDL | Address IDL | Taille | SHA-256 |
|
||||
|---|---|---|---:|---|
|
||||
| `idls/raydium_clmm.CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK.json` | `raydium_clmm` | `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` | 86240 | `d3f265adc9e4d7b1a28641444800a60bcdeb921ef136855fe8dea4532afa18bd` |
|
||||
| `idls/raydium_cpmm.CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C.json` | `raydium_cp_swap` | `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` | 32066 | `5b709dfe7b0df67c9e29655307ae877244d3bb8022056ee01c754f0e36264d9c` |
|
||||
| `idls/raydium_launchlab.LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj.json` | `raydium_launchpad` | `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` | 68052 | `c1465a10f38912413f55f04a68536c989992add1b3d48cba86dca97212a482da` |
|
||||
| `idls/raydium_lock.LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE.json` | `raydium_liquidity_locking` | absent | 10621 | `da45fd5eaf726e5e2ead7280c04588ebd4224d203304cdc8217b012b8130e1f1` |
|
||||
|
||||
Décision : `raydium_pool_v4.json` ne correspond à aucun fichier JSON local actuel. Il reste une source annexe d'audit AMM v4/strategy/wrapper à traiter plus tard, sans bloquer `0.7.53`.
|
||||
|
||||
## SQL associé
|
||||
|
||||
Voir :
|
||||
|
||||
```text
|
||||
validation_sql/SQL_VALIDATION_DEX_COVERAGE_GLOBAL_0_7_53.sql
|
||||
```
|
||||
166
docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md
Normal file
166
docs/reports/PUMP_SWAP_EVENT_COVERAGE_REPORT.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# PumpSwap event coverage report — `0.7.53`
|
||||
|
||||
## Scope
|
||||
|
||||
- Version cible : `0.7.53`.
|
||||
- Surface unique : `pump_swap`.
|
||||
- Program id unique : `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA`.
|
||||
- Phasage : une version = un `program_id`.
|
||||
- `raydium_pool_v4.json` reste repoussé vers la fin du phasage et ne bloque pas cette tranche.
|
||||
|
||||
## Sources vérifiées / à vérifier pendant la fermeture
|
||||
|
||||
- `kb_lib/src/constants.rs`, notamment `PUMP_SWAP_PROGRAM_ID` et `SOLSCAN_ACCOUNT_SOURCES`.
|
||||
- Registre upstream local généré : `kb_lib/src/upstream_registry_generated.rs`.
|
||||
- Sources Git/IDL externes disponibles : Pump public docs / IDL, Carbon, fnzero, Pinax, HODL Warden si présents dans le registre.
|
||||
- IDL locale : `idls/pump_swap.pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA.json`, téléchargée depuis Solscan et versionnée dans le workspace.
|
||||
- Solscan IDL du program id PumpSwap si disponible.
|
||||
- Corpus local Demo3 + backfills signature/pool.
|
||||
- `k_sol_dex_event_coverage_entries` après replay forcé.
|
||||
|
||||
Les sources Git/IDL/Solscan sont des indices. La fermeture métier exige corpus local, replay et SQL.
|
||||
|
||||
## Couverture locale ajoutée
|
||||
|
||||
Le decoder local `kb_lib/src/dex/pump_swap.rs` ne se limite plus à `buy`/`sell`. Il reconnaît maintenant les discriminants d’instruction suivants et produit un event spécialisé `pump_swap.<entry_name>`.
|
||||
|
||||
| Entry | Kind | Discriminator | Target attendu | Matérialisation |
|
||||
|---|---|---:|---|---|
|
||||
| `admin_set_coin_creator` | instruction | `f228759149606968` | admin/config | decoded specialized non-trade |
|
||||
| `admin_update_token_incentives` | instruction | `d10b7357d5177ccc` | reward/admin | decoded specialized non-trade |
|
||||
| `buy` | instruction | `66063d1201daebea` | trade | trade/candle seulement depuis montants exacts |
|
||||
| `buy_exact_quote_in` | instruction | `c62e1552b4d9e870` | trade conditionnel | matérialisé seulement si un `BuyEvent` Anchor exact est présent (`amountSource=pump_swap_anchor_buy_event`) ; sinon decoded-only `instruction_bounds_only` avec `skipTradeReason` |
|
||||
| `claim_cashback` | instruction | `253a237ebe35e4c5` | reward | decoded specialized non-trade |
|
||||
| `claim_token_incentives` | instruction | `1004471ccc01281b` | reward | decoded specialized non-trade |
|
||||
| `close_user_volume_accumulator` | instruction | `f945a4da9667548a` | reward | decoded specialized non-trade |
|
||||
| `collect_coin_creator_fee` | instruction | `a039592ab58b2b42` | fee | decoded specialized non-trade |
|
||||
| `create_config` | instruction | `c9cff3724b6f2fbd` | admin/config | decoded specialized non-trade |
|
||||
| `create_pool` | instruction | `e992d18ecf6840bc` | pool lifecycle | decoded specialized non-trade |
|
||||
| `deposit` | instruction | `f223c68952e1f2b6` | liquidity add | decoded specialized non-trade |
|
||||
| `disable` | instruction | `b9adbb5ad80feee9` | admin/config | decoded specialized non-trade |
|
||||
| `extend_account` | instruction | `ea66c2cb96483ee5` | admin/config | decoded specialized non-trade |
|
||||
| `init_user_volume_accumulator` | instruction | `5e06ca73ff60e8b7` | reward | decoded specialized non-trade |
|
||||
| `migrate_pool_coin_creator` | instruction | `d0089f044aaf103a` | admin/migration | decoded specialized non-trade |
|
||||
| `sell` | instruction | `33e685a4017f83ad` | trade | trade/candle seulement depuis montants exacts |
|
||||
| `set_coin_creator` | instruction | `d295802dbc3a4eaf` | admin/config | decoded specialized non-trade |
|
||||
| `set_reserved_fee_recipients` | instruction | `6faca2e87259d58e` | admin/config | decoded specialized non-trade |
|
||||
| `set_reserved_fee_recipient` | instruction | `cfbdb247a77a44b4` | admin/config | local log proof only: `Instruction: SetReservedFeeRecipient` ; absent from checked Solscan IDL raw ; decoded specialized non-trade |
|
||||
| `sync_user_volume_accumulator` | instruction | `561fc057a3574fee` | reward | decoded specialized non-trade |
|
||||
| `toggle_cashback_enabled` | instruction | `7367e0ffbd5956c3` | admin/config | decoded specialized non-trade |
|
||||
| `toggle_mayhem_mode` | instruction | `01096fd0641fffa3` | admin/config | decoded specialized non-trade |
|
||||
| `transfer_creator_fees_to_pump` | instruction | `8b348655e4e56cf1` | fee | decoded specialized non-trade |
|
||||
| `transfer_creator_fees_to_pump_v2` | instruction | `01214eb921432c5c` | fee | Solscan IDL proof + local log proof: `transfer_creator_fees_to_pump_v2` / `Instruction: TransferCreatorFeesToPumpV2` ; decoded specialized non-trade |
|
||||
| `update_admin` | instruction | `a1b028d53cb8b3e4` | admin/config | decoded specialized non-trade |
|
||||
| `update_buyback_config` | instruction | `fbe0ab92a01a71e9` | admin/config | Solscan IDL proof + local log proof: `update_buyback_config` / `Instruction: UpdateBuybackConfig` ; decoded specialized non-trade |
|
||||
| `update_fee_config` | instruction | `68b867f258976b14` | admin/config | decoded specialized non-trade |
|
||||
| `withdraw` | instruction | `b712469c946da122` | liquidity remove | decoded specialized non-trade |
|
||||
|
||||
## Upstream Program-data events à statut explicite
|
||||
|
||||
Ces events sont listés dans le registre upstream. Ils doivent apparaître avec un statut explicite dans la coverage DB après sync/replay. Ils ne doivent pas créer de doublons trade/candle tant que l’instruction locale spécialisée couvre déjà le DEX effectif.
|
||||
|
||||
| Event | Discriminator | Statut `0.7.53` |
|
||||
|---|---:|---|
|
||||
| `admin_set_coin_creator_event` | `2ddc5d181961ac68` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `admin_update_token_incentives_event` | `93fa6c78f71d43de` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `buy_event` | `67f4521f2cf57777` | upstream listed ; audit/decoded-only to avoid duplicate trade |
|
||||
| `claim_cashback_event` | `e2d6f62107f293e5` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `claim_token_incentives_event` | `4facf631cd5bcee8` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `close_user_volume_accumulator_event` | `929fbdac925838f4` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `collect_coin_creator_fee_event` | `e8f5c2eeeada3a59` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `create_config_event` | `6b34598137e25116` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `create_pool_event` | `b1310cd2a076a774` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `deposit_event` | `78f83d531f8e6b90` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `disable_event` | `6bfdc14ce4ca1b68` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `extend_account_event` | `6161d7905d92167c` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `init_user_volume_accumulator_event` | `86240d48e86582d8` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `migrate_pool_coin_creator_event` | `aadd52c793a5f72e` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `reserved_fee_recipients_event` | `2bbcfa12dd4bbb5f` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `sell_event` | `3e2f370aa503dc2a` | upstream listed ; audit/decoded-only to avoid duplicate trade |
|
||||
| `set_bonding_curve_coin_creator_event` | `f2e7eb664163bdd3` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `set_metaplex_coin_creator_event` | `966bc77b7ccf66e4` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `sync_user_volume_accumulator_event` | `c57aa77c74515bff` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `update_admin_event` | `e198ab57f63f42ea` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `update_fee_config_event` | `5a1741233ef4bcd0` | upstream listed ; decoded-only/status explicite après replay |
|
||||
| `withdraw_event` | `1609851aa02c47c0` | upstream listed ; decoded-only/status explicite après replay |
|
||||
|
||||
## Matérialisation
|
||||
|
||||
- `pump_swap.buy`, `pump_swap.sell` et `pump_swap.buy_exact_quote_in` peuvent alimenter `k_sol_trade_events`, mais seulement depuis des montants exacts.
|
||||
- `pump_swap.buy_exact_quote_in` est matérialisé quand le log Anchor `BuyEvent` fournit `baseAmountOutRaw` et `userQuoteAmountInRaw` pour `ixName=buy_exact_quote_in`. Les rows `instruction_bounds_only` restent decoded-only avec `skipTradeReason` explicite.
|
||||
- Les bornes d’instruction (`maxQuoteAmountIn`, `spendableQuoteAmountIn`, `minQuoteAmountOut`, `minBaseAmountOut`) ne sont pas considérées comme des montants exacts suffisants pour créer un trade/candle.
|
||||
- La matérialisation doit passer par les résolutions exactes existantes : token transfer deltas, vault/account balance deltas ou autre source d’amount explicitement prouvée.
|
||||
- Les transactions failed restent decoded-only via l’actionability `failed_transaction`.
|
||||
- Les non-trades restent hors `k_sol_trade_events` et hors `k_sol_pair_candles`.
|
||||
|
||||
## SQL de fermeture
|
||||
|
||||
Le fichier dédié est :
|
||||
|
||||
```text
|
||||
validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql
|
||||
```
|
||||
|
||||
Les requêtes d’anomalies attendues vides couvrent :
|
||||
|
||||
- fallback upstream résiduel sur instruction couverte localement ;
|
||||
- failed tx avec trade ;
|
||||
- non-swap avec trade ;
|
||||
- decoded without coverage ;
|
||||
- successful non-materialized inexpliqué ;
|
||||
- multi-target materialization ;
|
||||
- successful swap exploitable sans trade et sans raison explicite.
|
||||
|
||||
## Delta post-replay `0.7.53-pump_swap-delta-1`
|
||||
|
||||
Le replay local a révélé trois écarts corrigés par ce delta :
|
||||
|
||||
- `pump_swap.toggle_cashback_enabled` était classé à la fois `reward` et `admin`; il devient admin-only pour respecter l’invariant single-target.
|
||||
- `pump_swap.buy_exact_quote_in` réussi non matérialisé reçoit maintenant un `skipTradeReason` explicite et reste decoded-only tant que les montants exacts ne sont pas prouvés.
|
||||
- `k_sol_instruction_observations.instruction_name` reçoit un mapping PumpSwap par discriminant pour que la requête de coverage locale ne sorte plus des noms vides. Le discriminant `e445a52e51cb9a1d` reste marqué comme transport technique Anchor self-CPI. Les trois discriminants initialement inconnus ne doivent plus sortir en `observed_unknown_*` : deux sont confirmés par le raw Solscan IDL et un reste conservé comme local-log-only.
|
||||
|
||||
`pump_swap.migrate_pool_coin_creator` est également forcé en admin/config, pas lifecycle, car il modifie l’attribution coin creator et ne représente pas une migration de pool échangeable.
|
||||
|
||||
## Delta post-replay `0.7.53-pump_swap-delta-2`
|
||||
|
||||
- Les trois discriminants initialement inconnus (`01214eb921432c5c`, `fbe0ab92a01a71e9`, `cfbdb247a77a44b4`) ont été provisoirement couverts decoded-only pour supprimer les gaps locaux sans inventer de métier.
|
||||
- `toggle_cashback_enabled` est corrigé aussi dans la famille coverage (`admin_config`) afin de refléter la matérialisation admin-only.
|
||||
|
||||
## Delta post-replay `0.7.53-pump_swap-delta-4`
|
||||
|
||||
- Le corpus local donne maintenant le nom métier via logs Anchor : `TransferCreatorFeesToPumpV2`, `UpdateBuybackConfig`, `SetReservedFeeRecipient`.
|
||||
- Ces trois discriminants deviennent des instructions locales spécialisées : `pump_swap.transfer_creator_fees_to_pump_v2`, `pump_swap.update_buyback_config`, `pump_swap.set_reserved_fee_recipient`.
|
||||
- Recomparaison raw Solscan IDL : `transfer_creator_fees_to_pump_v2` et `update_buyback_config` sont présents dans l’IDL. `set_reserved_fee_recipient` n’est pas listé dans ce raw ; il est gardé sur preuve log locale, possiblement instruction historique/supprimée ou non exposée par cette version IDL.
|
||||
- `transfer_creator_fees_to_pump_v2` est fee/non-trade ; `update_buyback_config` et `set_reserved_fee_recipient` sont admin/config non-trade.
|
||||
|
||||
|
||||
|
||||
## Clôture finale `0.7.53`
|
||||
|
||||
La tranche est clôturée après les deltas de consolidation :
|
||||
|
||||
- `buy_exact_quote_in` route désormais vers la matérialisation pool/pair/trade quand `amountSource=pump_swap_anchor_buy_event`;
|
||||
- les montants du `BuyEvent` sont normalisés par rapport à l’ordre local de la paire pour éviter les inversions base/quote ;
|
||||
- les events Anchor PumpSwap sont décodés comme events autonomes audit-only ;
|
||||
- `claim_token_incentives_event` possède un test synthétique de matérialisabilité reward si un corpus réussi apparaît ;
|
||||
- `sync_user_volume_accumulator_event` reste implémenté mais non observé malgré un backfill élargi sur l’instruction ;
|
||||
- les tests synthétiques couvrent les instructions/events IDL non observés localement ;
|
||||
- `cargo test -p kb_lib` a été validé à `421 passed / 0 failed` et clippy est OK côté utilisateur.
|
||||
|
||||
Résultats de validation rapportés après corpus élargi :
|
||||
|
||||
```text
|
||||
pump_swap decoded without coverage = vide
|
||||
pump_swap upstream fallback couvert localement = vide
|
||||
successful trade candidates sans trade = vide
|
||||
failed tx avec business trade = vide
|
||||
non-swap matérialisé en trade = vide
|
||||
multi-target materialization = vide
|
||||
buy_exact_quote_in / pump_swap_anchor_buy_event = 168 decoded / 167 trades / 1 failed tx
|
||||
```
|
||||
|
||||
Les fichiers de surveillance à conserver sont :
|
||||
|
||||
- `validation_sql/SQL_VALIDATION_PUMP_SWAP_0_7_53.sql` ;
|
||||
- `validation_sql/SQL_VALIDATION_DEX_COVERAGE_GLOBAL_0_7_53.sql` ;
|
||||
- `docs/reports/DEX_COVERAGE_GLOBAL_WATCHLIST_0_7_53.md`.
|
||||
Reference in New Issue
Block a user