# Raydium AMM v4 Event Coverage Report — `0.7.51-final` ## Scope Tranche : `0.7.51 raydium_amm_v4`. Program id canonique local : ```text 675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 ``` Code local canonique : ```text raydium_amm_v4 ``` Cette tranche reprend AMM v4 legacy après `0.7.50 raydium_launchpad` et les rechecks CPMM/CLMM. Les sources Git/IDL/Solscan restent des indices ; les statuts observé/matérialisé proviennent du corpus local et du replay forcé. ## Sources inventoriées Sources utilisées comme indices de coverage : - Carbon : `decoders/raydium-amm-v4-decoder` ; - Pinax : `src/raydium/amm` ; - fnzero `sol-parser-sdk` : `idl/raydium_amm_v4.json` et `idls/raydium_amm_v4.json` ; - fnzero `sol-parser-sdk` : `idl/raydium_pool_v4.json` et `idls/raydium_pool_v4.json`, audit comparatif uniquement ; - Solscan Program IDL et recherche `instruction=` pour `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8`. ## Validation Rust et replay final Validation locale rapportée : ```text cargo test -p kb_lib -> 405 passed / 0 failed cargo clippy -p kb_lib --all-targets -- -D warnings -> OK ``` Replay local final : ```text 195 replayed 0 decode skipped 195 ledger upserts 70 unsafe ledger rows 168 trades 7 liquidity 15 lifecycle 0 tokenAccount 668 candle upserts instructionObservations = 2599 resetDeleted = 1578 catalog = 61 tokens / 65 pools / 65 pairs ``` ## Coverage finale par discriminant | Discriminant | Entrée | Famille | Local event kind | Cible DB | Observed | Materialized | Trade | |---|---|---|---|---|---:|---:|---:| | `00` | `initialize` | `pool_create` | `raydium_amm_v4.initialize` | `k_sol_pool_lifecycle_events` | 4 | 4 | 0 | | `01` | `initialize2` | `pool_create` | `raydium_amm_v4.initialize2_pool` | `k_sol_pool_lifecycle_events` | 8 | 8 | 0 | | `02` | `monitor_step` | `order_place` | `raydium_amm_v4.monitor_step` | `k_sol_orderbook_events` | 20 | 20 | 0 | | `03` | `deposit` | `liquidity_add` | `raydium_amm_v4.deposit` | `k_sol_liquidity_events` | 10 | 5 | 0 | | `04` | `withdraw` | `liquidity_remove` | `raydium_amm_v4.withdraw` | `k_sol_liquidity_events` | 3 | 2 | 0 | | `05` | `migrate_to_open_book` | `order_place` | `raydium_amm_v4.migrate_to_open_book` | `k_sol_orderbook_events` | 6 | 6 | 0 | | `06` | `set_params` | `admin_config` | `raydium_amm_v4.set_params` | `k_sol_pool_admin_events` | 1 | 1 | 0 | | `07` | `withdraw_pnl` | `fee` | `raydium_amm_v4.withdraw_pnl` | `k_sol_fee_events` | 1 | 1 | 0 | | `08` | `withdraw_srm` | `fee` | `raydium_amm_v4.withdraw_srm` | `k_sol_fee_events` | 2 | 1 | 0 | | `09` | `swap_base_in` | `swap` | `raydium_amm_v4.swap_base_in` | `k_sol_trade_events` | 76 | 66 | 66 | | `0a` | `pre_initialize` | `pool_create` | `raydium_amm_v4.pre_initialize` | `k_sol_pool_lifecycle_events` | 8 | 7 | 0 | | `0b` | `swap_base_out` | `swap` | `raydium_amm_v4.swap_base_out` | `k_sol_trade_events` | 3 | 1 | 1 | | `0c` | `simulate_info` | `cpi_transport` | `raydium_amm_v4.simulate_info` | `k_sol_dex_decoded_events_only` | 6 | 0 | 0 | | `0d` | `admin_cancel_orders` | `order_cancel` | `raydium_amm_v4.admin_cancel_orders` | `k_sol_orderbook_events` | 22 | 22 | 0 | | `0e` | `create_config_account` | `admin_config` | `raydium_amm_v4.create_config_account` | `k_sol_pool_admin_events` | 50 | 50 | 0 | | `0f` | `update_config_account` | `admin_config` | `raydium_amm_v4.update_config_account` | `k_sol_pool_admin_events` | 6 | 6 | 0 | | `10` | `swap_base_in_v2` | `swap` | `raydium_amm_v4.swap_base_in_v2` | `k_sol_trade_events` | 35 | 35 | 35 | | `11` | `swap_base_out_v2` | `swap` | `raydium_amm_v4.swap_base_out_v2` | `k_sol_trade_events` | 7 | 7 | 7 | Toutes les entrées ont `proof_status=upstream_git_local_corpus_materialized`, sauf `simulate_info`, qui reste volontairement `upstream_git_local_corpus_observed` / decoded-only. ## Matérialisation métier finale | Event kind | Decoded | Trade | Liquidity | Lifecycle | Fee | Admin | Orderbook | |---|---:|---:|---:|---:|---:|---:|---:| | `raydium_amm_v4.admin_cancel_orders` | 22 | 0 | 0 | 0 | 0 | 0 | 22 | | `raydium_amm_v4.create_config_account` | 50 | 0 | 0 | 0 | 0 | 50 | 0 | | `raydium_amm_v4.deposit` | 10 | 0 | 5 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.initialize2_pool` | 8 | 0 | 0 | 8 | 0 | 0 | 0 | | `raydium_amm_v4.migrate_to_open_book` | 6 | 0 | 0 | 0 | 0 | 0 | 6 | | `raydium_amm_v4.monitor_step` | 20 | 0 | 0 | 0 | 0 | 0 | 20 | | `raydium_amm_v4.pre_initialize` | 8 | 0 | 0 | 7 | 0 | 0 | 0 | | `raydium_amm_v4.set_params` | 1 | 0 | 0 | 0 | 0 | 1 | 0 | | `raydium_amm_v4.simulate_info` | 6 | 0 | 0 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.swap_base_in` | 76 | 66 | 0 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.swap_base_in_v2` | 35 | 35 | 0 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.swap_base_out` | 3 | 1 | 0 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.swap_base_out_v2` | 7 | 7 | 0 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.update_config_account` | 6 | 0 | 0 | 0 | 0 | 6 | 0 | | `raydium_amm_v4.withdraw` | 3 | 0 | 2 | 0 | 0 | 0 | 0 | | `raydium_amm_v4.withdraw_pnl` | 1 | 0 | 0 | 0 | 1 | 0 | 0 | | `raydium_amm_v4.withdraw_srm` | 2 | 0 | 0 | 0 | 1 | 0 | 0 | ## Invariants validés Les requêtes finales donnent `vide` pour : - `raydium_amm_v4.swap` legacy ; - decoded AMM v4 sans coverage entry ; - observations AMM v4 dont `length(discriminator_hex) > 2` ; - non-swap AMM v4 avec trade ; - transaction failed AMM v4 avec trade ; - event successful non matérialisé sans raison explicite ; - event AMM v4 matérialisé vers plus d'une table métier principale. ## Gaps expliqués Les écarts `observed_count > materialized_count` sont acceptés uniquement s'ils sont expliqués : - `swap_base_in` / `swap_base_out` : decoded-only lorsque les deltas vault ou montants exploitables sont absents ; - `deposit` / `withdraw` : non matérialisés lorsque le pool/pair catalogue ou les deltas nécessaires sont absents ; - `withdraw_srm` : non matérialisé si le contexte fee exploitable est absent ; - `pre_initialize` : 1 transaction failed ; les 7 transactions successful sont matérialisées en lifecycle audit minimal ; - `simulate_info` : decoded-only assumé. Pour `deposit`, le corpus final montre 5 événements matérialisés sur le pool catalogué `2dRNngAm729NzLbb1pzgHtfHvPqR4XHFmFyYK78EfEeX` / pair `FIDA/RAY`, et 5 événements decoded-only sur des pools absents du catalogue local. ## Décisions spécifiques - `raydium_amm_v4.swap` est définitivement interdit : les swaps doivent rester spécialisés. - `pre_initialize` est conservé pour les scans historiques, matérialisé comme lifecycle audit deprecated/partial, sans pair exploitable. - `migrate_to_open_book`, `monitor_step` et `admin_cancel_orders` sont des side effects orderbook AMM v4, pas des trades OpenBook autonomes. - `simulate_info` reste `k_sol_dex_decoded_events_only`. - Les side effects SPL Token / Token-2022 restent transversaux. - `raydium_pool_v4` n'est pas promu en decoder autonome dans `0.7.51`. ## Clôture `0.7.51 raydium_amm_v4` est clôturable côté `kb_lib` sous réserve de conserver les rechecks CPMM/CLMM/Launchpad dans la validation globale de workspace lorsque la base utilisée les contient.