# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.48` Cette matrice complète `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. ## Règles de statut | Statut | Sens | |---|---| | `decoded` | Un decoder local produit un event spécialisé ou un event audit-only classé. | | `materialized` | L'event alimente une table métier existante validée par corpus. | | `audit-only` | L'event reste dans `k_sol_dex_decoded_events` et ne produit jamais trade/candle. | | `upstream_git_mapped_unverified` | L'entrée est connue depuis Carbon/fnzero/IDL, mais non observée localement. | | `not_applicable` | La famille n'existe pas pour ce DEX/version ou appartient à un autre programme. | ## `0.7.48` — `raydium_cpmm` Sources inventoriées : Carbon `carbon-raydium-cpmm-decoder`, fnzero `solana-streamer` / `sol-parser-sdk` IDL `raydium_cpmm.json`. | Famille | Entrées Raydium CPMM | Statut `0.7.48` | Cible DB | Justification / règle | |---|---|---|---|---| | `swap` | `swap_base_input`, `swap_base_output`, `swap_event` | `materialized` pour `swap_base_*`; `swap_event` audit-only | `k_sol_trade_events` seulement pour `swap_base_*`; `k_sol_dex_decoded_events_only` pour `swap_event` | `swap_event` est décodé mais ne produit jamais trade/candle afin d'éviter les doublons. | | `pool_create` | `initialize`, `initialize_with_permission` | `materialized` | `k_sol_pool_lifecycle_events` | `initialize_with_permission` est lifecycle-only et ne crée plus d'admin row. | | `add_liquidity` | `deposit`, `lp_change_event(changeType=0)` | `materialized` | `k_sol_liquidity_events` | `deposit` et `lp_change_event(changeType=0)` matérialisent liquidity, sans trade/candle. | | `remove_liquidity` | `withdraw`, `lp_change_event(changeType=1)` | `materialized` | `k_sol_liquidity_events` | `withdraw` et `lp_change_event(changeType=1)` matérialisent liquidity, sans trade/candle. | | `position_open` | `-` | `not_applicable` | `-` | CPMM n'a pas de position CLMM. | | `position_close` | `-` | `not_applicable` | `-` | CPMM n'a pas de position CLMM. | | `fee` | `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee` | `materialized` | `k_sol_fee_events` | Les trois familles de fee CPMM observées sont matérialisées avec `trade_count=0`. | | `reward` | `-` | `not_applicable` | `-` | Aucune entrée reward CPMM dans Carbon/fnzero IDL inventoriée pour cette tranche. | | `admin/config` | `create_amm_config`, `update_amm_config`, `create_permission_pda`, `update_pool_status`, `close_permission_pda` | `materialized` pour les entrées observées ; `upstream_git_mapped_unverified` pour `update_pool_status` / `close_permission_pda` | `k_sol_pool_admin_events` ou decoded-only selon corpus | `create_amm_config`, `create_permission_pda` et `update_amm_config` sont matérialisés ; les deux autres restent non observés localement. | | `mint` | `-` direct | `not_applicable` | `-` | Mint LP implicite possible dans les instructions, mais pas d'instruction CPMM `mint` dédiée. | | `burn` | `-` direct | `not_applicable` | `-` | Burn LP implicite possible dans `withdraw`, mais pas d'instruction CPMM `burn` dédiée. | | `transfer` | SPL Token inner transfers | `audit-only` indirect | `k_sol_dex_decoded_events` pour cette tranche | Pas de table `k_sol_token_transfer_events` ajoutée en `0.7.48`. | | `account_create` | comptes système/ATA indirects | `audit-only` indirect | decoded-only | Hors programme CPMM direct. | | `account_close` | comptes système/ATA indirects | `audit-only` indirect | decoded-only | Hors programme CPMM direct. | | `wrap_sol` | user/router side | `not_applicable` | `-` | Préparation WSOL hors CPMM. | | `unwrap_sol` | user/router side | `not_applicable` | `-` | Cleanup WSOL hors CPMM. | | `order_place` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | | `order_cancel` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | | `order_fill` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | | `consume_events` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | | `settle_funds` | `-` | `not_applicable` | `-` | CPMM est AMM, pas orderbook. | | `vault_deposit` | `-` | `not_applicable` | `-` | Les vaults CPMM sont des comptes de pool, pas une surface vault séparée. | | `vault_withdraw` | `-` | `not_applicable` | `-` | Les vaults CPMM sont des comptes de pool, pas une surface vault séparée. | | `lock` | `-` | `not_applicable` | `-` | Raydium liquidity locking est une surface séparée. | | `unlock` | `-` | `not_applicable` | `-` | Raydium liquidity locking est une surface séparée. | | `launch` | `-` | `not_applicable` | `-` | Raydium LaunchLab/Launchpad est séparé de CPMM. | | `migration` | `-` | `not_applicable` | `-` | Les migrations launch → pool relèvent des launch surfaces. | | `stake` | `-` | `not_applicable` | `-` | Hors CPMM. | | `unstake` | `-` | `not_applicable` | `-` | Hors CPMM. | | `unknown/unmapped audit` | `raydium_cpmm.instruction_audit` | `audit-only` | `k_sol_dex_decoded_events_only` | Toute instruction observée mais non mappée reste audit-only et ne produit jamais trade/candle. | ## Validation attendue - `k_sol_dex_event_coverage_entries.decoder_code = 'raydium_cpmm'` contient toutes les entrées Carbon/fnzero synchronisées. - `upstream_git.instruction_match` ne doit plus apparaître pour une instruction CPMM remplacée par un decoder local spécialisé. - Les familles non-trade CPMM doivent rester `trade_count = 0`. - Les transactions failed CPMM doivent rester décodées/auditables mais non matérialisées en trade/candle. ## Note `0.7.48-part2-fix2` — CPMM official instruction parity La couverture `raydium_cpmm` est alignée avec les instructions exposées par le programme officiel Raydium CP-Swap et par Carbon : `create_amm_config`, `update_amm_config`, `update_pool_status`, `collect_protocol_fee`, `collect_fund_fee`, `collect_creator_fee`, `create_permission_pda`, `close_permission_pda`, `initialize`, `initialize_with_permission`, `deposit`, `withdraw`, `swap_base_input`, `swap_base_output`, `lp_change_event` et `swap_event`. `lp_change_event` est maintenant classé `event_family=liquidity` dans la table coverage, parce que l'event couvre à la fois dépôt et retrait. La matérialisation reste déterminée par `changeType` dans le payload décodé : `0` = add/deposit, `1` = remove/withdraw. ## Note `0.7.48 final` — Raydium CPMM clôturable Validation finale locale : `deposit` = `11/11` liquidity, `withdraw` = `14/14` liquidity, `lp_change_event` = `25/25` liquidity, fees = `26/26` fee, admin/config observés = `23/23` admin, lifecycle = `9/9`, `swap_event` = audit-only avec `0` trade, et trades matérialisés uniquement depuis `swap_base_input` / `swap_base_output`. `close_permission_pda` et `update_pool_status` restent `upstream_git_mapped_unverified` faute de corpus local. Les filtres Solscan `instruction=9c5420764587467b` et `instruction=82576c062ee0757b` n'ont pas fourni de signatures exploitables dans l'horizon testé.