0.7.48
This commit is contained in:
@@ -1,232 +1,71 @@
|
||||
# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.47-1FE5`
|
||||
# DEX Event Coverage Matrix — `khadhroony-bobobot` `0.7.48`
|
||||
|
||||
Cette matrice complète `DEX_DECODER_MATRIX.md`.
|
||||
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.
|
||||
|
||||
La matrice précédente répondait à la question : **quel DEX/version est couvert ?**
|
||||
## Règles de statut
|
||||
|
||||
Cette matrice répond à la question : **quels events/instructions doivent être décodés, audit-only ou matérialisés ?**
|
||||
|
||||
## Principe
|
||||
|
||||
L’objectif n’est plus seulement de décoder les swaps. L’objectif est de décoder le maximum d’événements disponibles dans les sources Git/IDL et dans le corpus local, parce que certains événements non-trade peuvent influencer une décision de trading :
|
||||
|
||||
- perte ou ajout de liquidité ;
|
||||
- burn de tokens ou de LP ;
|
||||
- mint anormal ;
|
||||
- lock/unlock de liquidité ;
|
||||
- close account / fermeture de position ;
|
||||
- admin/config changes ;
|
||||
- fees/rewards ;
|
||||
- migration launch → DEX ;
|
||||
- market/orderbook activity ;
|
||||
- vault deposit/withdraw ;
|
||||
- changement de market cap ou de supply dérivée.
|
||||
|
||||
Un event peut donc être important même s’il ne produit jamais de `trade_event` ou de candle.
|
||||
|
||||
## Règle de couverture
|
||||
|
||||
Pour chaque DEX/version, on doit viser trois niveaux :
|
||||
|
||||
| Niveau | Description |
|
||||
| Statut | Sens |
|
||||
|---|---|
|
||||
| `listed` | L’event/instruction existe dans une source Git/IDL/Carbon/Vybe/autre. |
|
||||
| `decoded_audit` | Le code local reconnaît l’event et le persiste dans `k_sol_dex_decoded_events` avec payload structuré ou audit-only. |
|
||||
| `materialized` | L’event alimente une table métier spécialisée : trade, liquidity, lifecycle, fee, reward, admin, mint, burn, orderbook, vault, launch/migration, etc. |
|
||||
| `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. |
|
||||
|
||||
Ne pas sauter directement de `listed` à `materialized`.
|
||||
## `0.7.48` — `raydium_cpmm`
|
||||
|
||||
## Univers minimal d’events à suivre
|
||||
Sources inventoriées : Carbon `carbon-raydium-cpmm-decoder`, fnzero `solana-streamer` / `sol-parser-sdk` IDL `raydium_cpmm.json`.
|
||||
|
||||
Cette liste doit devenir la grille commune pour toutes les tranches `0.7.48+`.
|
||||
| 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. |
|
||||
|
||||
| Famille | Exemples | Impact possible | Table actuelle / cible |
|
||||
|---|---|---|---|
|
||||
| `swap/trade` | swap, buy, sell, route swap, exact in/out | Prix, volume, candles | `k_sol_trade_events`, `k_sol_pair_metrics`, `k_sol_pair_candles` |
|
||||
| `pool_create` | initialize, create_pool, initialize_market | Découverte pool/pair | `k_sol_pool_lifecycle_events`, `k_sol_pools`, `k_sol_pairs` |
|
||||
| `liquidity_add` | add_liquidity, deposit liquidity, bootstrap | Profondeur, risque, market cap indirect | `k_sol_liquidity_events` |
|
||||
| `liquidity_remove` | remove_liquidity, withdraw liquidity | Rug/liquidity drain | `k_sol_liquidity_events` |
|
||||
| `position_open` | open_position, init_position | CLMM/DLMM state | `k_sol_pool_lifecycle_events` ou future `k_sol_position_events` |
|
||||
| `position_close` | close_position, close_position_if_empty | Sortie de LP, risque | `k_sol_pool_lifecycle_events` ou future `k_sol_position_events` |
|
||||
| `fee` | claim_fee, collect_protocol_fee, collect_creator_fee | Rentabilité, activité pool | `k_sol_fee_events` |
|
||||
| `reward` | claim_reward, fund_reward, update_reward | Incitations, farming | `k_sol_reward_events` |
|
||||
| `admin/config` | set_config, update_fee, pause, whitelist, authority change | Risque protocole/pool | `k_sol_pool_admin_events` |
|
||||
| `mint` | token mint, LP mint, position NFT mint | Supply, launch, LP | `k_sol_token_mint_events` + future token activity |
|
||||
| `burn` | token burn, LP burn, position NFT burn | Supply, LP burn, risque/réassurance | `k_sol_token_burn_events` + future token activity |
|
||||
| `transfer` | SPL transfer, Token-2022 transfer, routed transfer | Flux wallet/vault, whale movement | future `k_sol_token_transfer_events` |
|
||||
| `account_create` | ATA create, token account init | Préparation trade/wallet/vault | future `k_sol_token_account_events` |
|
||||
| `account_close` | close token account, close open orders | Sortie position/wallet cleanup | future `k_sol_token_account_events` ou `k_sol_orderbook_events` |
|
||||
| `wrap/unwrap` | wrap SOL, unwrap SOL, close WSOL ATA | Routing, PnL, trade prep | future token account/activity |
|
||||
| `order_place` | place_order, post_only, IOC | Orderbook pressure | future `k_sol_orderbook_events` |
|
||||
| `order_cancel` | cancel_order, cancel_all, reduce order | Changement intention | future `k_sol_orderbook_events` |
|
||||
| `order_fill` | FillLog, fill event, trade event | Trade réel orderbook | future `k_sol_orderbook_events`; trade seulement après validation économique |
|
||||
| `settle_funds` | settle_funds, withdraw funds | Finalisation CLOB | future `k_sol_orderbook_events` |
|
||||
| `consume_events` | crank/event queue processing | Orderbook fill/out | future `k_sol_orderbook_events` |
|
||||
| `vault_deposit` | deposit into vault | TVL/risque | future `k_sol_vault_events` |
|
||||
| `vault_withdraw` | withdraw from vault | TVL drain | future `k_sol_vault_events` |
|
||||
| `lock` | lock_liquidity, create_lock_escrow | LP lock/risk | `k_sol_pool_lifecycle_events` ou future lock table |
|
||||
| `unlock` | unlock, release escrow | Risque de retrait LP | future lock/lifecycle |
|
||||
| `launch` | create bonding curve, launch pool | Origine token | future `k_sol_launch_events` |
|
||||
| `migration` | migrate to DEX, migrate liquidity | Passage launch → tradable | future `k_sol_launch_events`, pool origins |
|
||||
| `stake/unstake` | stake LP/token, unstake | Incentives/withdraw risk | future staking/reward events |
|
||||
| `oracle/price` | oracle update, price account update | Pricing/risk | future oracle/context events |
|
||||
| `unknown` | unmapped discriminator | Dette de décodage | `k_sol_dex_decoded_events` audit-only |
|
||||
## Validation attendue
|
||||
|
||||
## Matrice de couverture par DEX/version
|
||||
- `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.
|
||||
|
||||
Légende :
|
||||
|
||||
- `M` = matérialisé déjà ou historiquement validé ;
|
||||
- `A` = audit-only local ;
|
||||
- `P` = partiel / doit être complété ;
|
||||
- `L` = listé upstream, non validé localement ;
|
||||
- `-` = non applicable connu ;
|
||||
- `?` = à vérifier.
|
||||
## Note `0.7.48-part2-fix2` — CPMM official instruction parity
|
||||
|
||||
| DEX/version | swap | pool create | liq add/remove | position | fee/reward | admin/config | mint/burn | transfer/account | orderbook | vault | launch/migration | état immédiat |
|
||||
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---|
|
||||
| `raydium_cpmm` | M | P | P | - | P | P | ? | ? | - | - | ? | Reprendre en `0.7.48`, comparer tous events Carbon/IDL/fnzero. |
|
||||
| `raydium_clmm` | M | P | M/P | M/P | P | P | P | ? | - | - | ? | Reprendre en `0.7.49`, compléter positions/rewards/fees/admin. |
|
||||
| `pump_swap` | M | P | P | - | P | P | ? | P | - | - | P | Reprendre en `0.7.50`, couvrir buy/sell/cashback/fee/volume/admin. |
|
||||
| `pump_fun` | P | P | - | - | ? | P | P | P | - | - | M/P | Reprendre en `0.7.51`, launch/bonding/migration/buy/sell/create/update. |
|
||||
| `meteora_dbc` | P | P | P | - | P | P | P | ? | - | P | M/P | Reprendre en `0.7.52`, séparer bonding, swap, migration, config, fees. |
|
||||
| `meteora_dlmm` | M | M | M | M | M/P | P | ? | ? | - | ? | ? | Reprendre en `0.7.53` pour exhaustive upstream + audits résiduels. |
|
||||
| `meteora_damm_v1` | M/P | M | M/P | - | M/P | P | ? | ? | - | P | ? | Reprendre en `0.7.54`, vérifier toutes surfaces upstream non observées. |
|
||||
| `meteora_damm_v2` | P | P | L/P | - | L/P | L/P | ? | ? | - | P | ? | Reprendre en `0.7.55`, decoder tous events Carbon/source. |
|
||||
| `phoenix_v1` | A | A/P | - | - | A/P | A/P | - | A/P | A | - | - | Continuer audit des events Git, pas de trade/candle. |
|
||||
| `openbook_v2` | A | A/P | - | - | A/P | A/P | - | A/P | A | - | - | Audit-only avancé, matérialisation orderbook future. |
|
||||
| `orca_whirlpools` | P | P | L/P | L/P | L/P | L/P | P | ? | - | - | ? | Reprendre en `0.7.58`, IDL complet + corpus dédié. |
|
||||
| `raydium_launchlab` | - | P | ? | - | ? | P | P | P | - | - | P | Launch/migration après DEX effectifs. |
|
||||
| `bonkswap` | L | L | L | - | L | L | ? | ? | - | - | L | Vérifier source/corpus. |
|
||||
| `moonshot` | L/P | P | ? | - | ? | P | P | P | - | - | P | Séparer launch, buy/sell, migration. |
|
||||
| `heaven` | L/P | L/P | L/P | - | L/P | L/P | P | P | - | ? | P | Vérifier AMM vs launch. |
|
||||
| `goosefx_v1` | L/P | L/P | L/P | ? | ? | ? | ? | ? | ? | ? | ? | Vybe/Demo3 candidates ; source nécessaire. |
|
||||
| `obric_v2` | L/P | L/P | ? | ? | ? | ? | ? | ? | ? | ? | ? | Bon candidat après sources. |
|
||||
| `solfi_v2` | L/P | L/P | ? | ? | ? | ? | ? | ? | ? | ? | ? | Bon candidat après sources. |
|
||||
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`.
|
||||
|
||||
## Points critiques manquants dans l’ancienne matrice
|
||||
`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.
|
||||
|
||||
### `burn`
|
||||
|
||||
`burn` doit être une famille de première classe, pas seulement une sous-note. Il peut signaler :
|
||||
## Note `0.7.48 final` — Raydium CPMM clôturable
|
||||
|
||||
- burn de LP tokens ;
|
||||
- burn de supply token ;
|
||||
- fermeture ou destruction indirecte de position ;
|
||||
- réduction du risque de dump si le burn est réel et vérifié ;
|
||||
- au contraire, faux signal si le burn ne concerne pas la bonne mint ou si le compte propriétaire est ambigu.
|
||||
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`.
|
||||
|
||||
Action : ajouter `burn` à toutes les checklists DEX et aux diagnostics de couverture.
|
||||
|
||||
### `transfer`
|
||||
|
||||
Les transfers ne sont pas des trades par défaut, mais ils sont nécessaires pour :
|
||||
|
||||
- repérer vault movements ;
|
||||
- détecter migration / liquidity routing ;
|
||||
- comprendre des orderbook settle/fill ;
|
||||
- analyser whale movement ou sortie de pool.
|
||||
|
||||
Action : prévoir une table dédiée plutôt que tout stocker uniquement dans `payload_json`.
|
||||
|
||||
### `account close/create`
|
||||
|
||||
Les close/create ATA sont utiles pour détecter :
|
||||
|
||||
- fin de route WSOL ;
|
||||
- sortie de position ;
|
||||
- cleanup après swap ;
|
||||
- close open-orders account ;
|
||||
- activité de bots.
|
||||
|
||||
Action : famille dédiée `token_account` / `account_lifecycle`.
|
||||
|
||||
## Checklist exhaustive par DEX
|
||||
|
||||
Pour chaque DEX/version, la tranche doit remplir un tableau événementiel :
|
||||
|
||||
| Colonne | Description |
|
||||
|---|---|
|
||||
| `source_repo` | Git/IDL/source utilisée. |
|
||||
| `source_path` | Chemin exact du fichier source. |
|
||||
| `decoder_code` | Code interne/upstream. |
|
||||
| `program_id` | Program id ou `to_verify`. |
|
||||
| `entry_kind` | `instruction`, `event`, `account`, `log`, `program_data`. |
|
||||
| `entry_name` | Nom source exact. |
|
||||
| `discriminator_hex` | Discriminator ou tag. |
|
||||
| `discriminator_len` | Longueur en octets. |
|
||||
| `event_family` | Famille commune : swap, burn, admin, order_fill, etc. |
|
||||
| `local_event_kind` | Event local produit. |
|
||||
| `local_status` | `not_implemented`, `audit_only`, `decoded`, `materialized`. |
|
||||
| `db_target` | Table cible ou `k_sol_dex_decoded_events_only`. |
|
||||
| `proof_status` | Statut upstream/local. |
|
||||
| `observed_count` | Count local après replay. |
|
||||
| `materialized_count` | Count table métier. |
|
||||
| `trade_count` | Count trades générés, doit être 0 sauf swap validé. |
|
||||
| `notes` | Ambiguïtés, layout, corpus, reste à faire. |
|
||||
|
||||
## Requêtes SQL génériques de couverture
|
||||
|
||||
### Couverture decoded events par programme
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
protocol_name,
|
||||
event_kind,
|
||||
program_id,
|
||||
json_extract(payload_json, '$.upstreamEntryName') AS upstream_entry_name,
|
||||
json_extract(payload_json, '$.upstreamDiscriminatorHex') AS upstream_discriminator_hex,
|
||||
COUNT(*) AS n
|
||||
FROM k_sol_dex_decoded_events
|
||||
GROUP BY
|
||||
protocol_name,
|
||||
event_kind,
|
||||
program_id,
|
||||
upstream_entry_name,
|
||||
upstream_discriminator_hex
|
||||
ORDER BY protocol_name, n DESC;
|
||||
```
|
||||
|
||||
### Sécurité trades pour audit-only
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
de.protocol_name,
|
||||
de.event_kind,
|
||||
COUNT(te.id) AS trade_count
|
||||
FROM k_sol_dex_decoded_events de
|
||||
LEFT JOIN k_sol_trade_events te
|
||||
ON te.decoded_event_id = de.id
|
||||
WHERE de.event_kind LIKE '%_audit'
|
||||
OR de.protocol_name IN ('upstream_git', 'phoenix_v1', 'openbook_v2')
|
||||
GROUP BY de.protocol_name, de.event_kind
|
||||
ORDER BY trade_count DESC;
|
||||
```
|
||||
|
||||
### Vérifier burn/mint présents dans decoded payloads
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
protocol_name,
|
||||
event_kind,
|
||||
json_extract(payload_json, '$.eventLifecycleKind') AS lifecycle,
|
||||
json_extract(payload_json, '$.eventActionability') AS actionability,
|
||||
COUNT(*) AS n
|
||||
FROM k_sol_dex_decoded_events
|
||||
WHERE event_kind LIKE '%burn%'
|
||||
OR event_kind LIKE '%mint%'
|
||||
OR lifecycle IN ('burn', 'mint')
|
||||
GROUP BY protocol_name, event_kind, lifecycle, actionability
|
||||
ORDER BY n DESC;
|
||||
```
|
||||
|
||||
## Décision
|
||||
|
||||
À partir de maintenant, une tranche DEX n’est pas complète si elle ne liste que les swaps. Elle doit explicitement indiquer :
|
||||
|
||||
- events source listés ;
|
||||
- events décodés audit-only ;
|
||||
- events matérialisés ;
|
||||
- events volontairement non implémentés ;
|
||||
- events non observés localement ;
|
||||
- trous de DB éventuels.
|
||||
`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é.
|
||||
|
||||
Reference in New Issue
Block a user