diff --git a/CHANGELOG.md b/CHANGELOG.md index 9db3a8a..540b0e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,14 +80,14 @@ 0.7.46-demo3 - Correction ciblée de Demo3 pour la découverte/backfill : ajout d’un décodage léger des instructions `meteora_damm_v1` connues par discriminant upstream Git dans `onchain_dex_pair_discovery`, classification instruction-scoped prioritaire pour éviter qu’un `Swap` soit classé `add_liquidity` à cause de logs mixtes de transaction, filtrage `target_event` strict sur les surfaces explicites, conservation des transactions mixtes quand un target explicite est demandé malgré `excludeSwaps`, et ajout des cibles UI `create_lock_escrow` / `lock_liquidity`. 0.7.46-demo3-paged - Amélioration Demo3 discovery : pagination `getSignaturesForAddress` via `before_signature` / `until_signature`, scan de plusieurs adresses source dans une seule requête, déduplication des signatures multi-pool, compteur de pages, curseurs `next_before` par adresse et ordre de traitement `newest_first` / `oldest_first` pour constituer un corpus depuis les premières signatures d’un pool sans promouvoir de nouveau `program_id`. 0.7.46-final - Renommage documentaire et payload des anciens statuts/fonctions liés au dépôt source vers une terminologie générique `upstream_git_*` : `proofStatus` utilise désormais `upstream_git_local_corpus_observed`, `upstream_git_mapped_unverified` et `upstream_git_layout_unverified`; les payloads DAMM v1 utilisent `upstreamInstructionName`; la documentation prépare `0.7.47` comme Upstream Git Registry / DEX discovery preparation au lieu d’une tranche DAMM v2 immédiate. - -0.7.47 - Upstream Git Registry / DEX discovery preparation : ajout d’un registre générique `upstream_git` pour indexer `program_id`, discriminants d’instructions/events, noms d’entrées et familles de programmes depuis Carbon et sources Git/IDL externes ; extension Demo3 aux targets multi-surfaces, orderbook, burn/mint/transfer/wrap/unwrap/stake ; ajout de groupes de signatures réussies/échouées pour alimenter Demo2 ; maintien strict de l’invariant : aucune entrée upstream Git ne produit trade/candle sans decoder spécialisé et corpus local. -0.7.47-openbook-v2-audit - Ajout d’un decoder local `openbook_v2` audit-only : instructions `place_order`, `cancel_order_by_client_order_id`, `consume_events`, `settle_funds`, `close_open_orders_account`; cleanup du fallback `upstream_git.instruction_match`; extraction audit des `Program return` et `Program data`; mapping des logs `FillLog`, `OpenOrdersPositionLog`, `TotalOrderFillEvent`, `SettleFundsLog`; aucune matérialisation trade/candle. -0.7.47-phoenix-v1-audit - Ajout d’un decoder local `phoenix_v1` audit-only : `order_place`, `order_cancel`, `funds_withdraw`, `log`; parsing strict des instructions log `0x0f`; décodage audit du header Phoenix log et des events `Reduce`, `Place`, `TimeInForce`; correction du mapping `PlaceMultiplePostOnlyOrders` tag `0x10`; aucune matérialisation trade/candle. -0.7.47-doc-matrix - Révision documentaire : ajout d’une matrice DEX dédiée, ajout explicite des sources Git/IDL à consulter, et redécoupage du plan `0.7.48+` en un DEX/version par tranche afin d’éviter les lots “tous events/tous decoders” trop larges. - -0.7.47-doc-event-coverage - Ajout d'une matrice événementielle complémentaire `DEX_EVENT_COVERAGE_MATRIX.md` pour suivre, par DEX/version, les familles `swap`, `pool_create`, `liquidity`, `position`, `fee`, `reward`, `admin/config`, `mint`, `burn`, `transfer`, `account_create/close`, `wrap/unwrap`, `orderbook`, `vault`, `lock/unlock`, `launch` et `migration`; ajout de `DB_EVENT_MODEL_REVIEW.md` pour clarifier que `k_sol_dex_decoded_events` suffit à l'audit-only mais que des tables transversales sont nécessaires pour exploiter transfers, orderbook, vault, launch/migration et coverage upstream en requêtes métier. -0.7.48-pre-event-coverage-sync - Raccordement de `k_sol_dex_event_coverage_entries` au registre upstream Git : ajout de `DexEventCoverageService`, sync des entrées registry vers SQLite, inférence conservatoire `event_family` / `expected_db_target`, mapping local limité aux events Raydium déjà connus, refresh des compteurs observés/matérialisés depuis `k_sol_dex_decoded_events` et tables non-trade existantes, sans modification des decoders ni de la matérialisation trade/candle. -0.7.48-pre-event-coverage-fix-docs - Correction du refresh SQL `k_sol_dex_event_coverage_entries` pour éviter les requêtes dynamiques non compatibles avec `sqlx::query` 0.9 ; mise à jour documentaire README/ROADMAP pour acter `0.7.48-pre` comme checkpoint DB/reporting et réaligner la suite sur l’ordre Raydium avant Meteora (`0.7.48 raydium_cpmm`, `0.7.49 raydium_clmm`, puis Pump/Meteora). -0.7.48-pre-event-coverage-report - Clôture du checkpoint `0.7.48-pre` : raccordement des summaries `k_sol_dex_event_coverage_entries` aux diagnostics locaux, ajout des compteurs agrégés de couverture au `LocalPipelineDiagnosticSummaryDto` et au `LocalPipelineValidationReportDto`, ajout du profil `0.7.48-pre_event_coverage_db_checkpoint`, exposition du profil dans Demo Pipeline 2, et maintien des invariants : aucun decoder DEX modifié, aucun trade/candle créé, aucun `program_id` promu sans corpus. -0.7.48-pre-event-coverage-validation-scope - Correction du profil `0.7.48-pre_event_coverage_db_checkpoint` : le contrôle bloquant des trade candidates non matérialisés est maintenant borné aux DEX attendus de la tranche Raydium (`raydium_cpmm`, `raydium_clmm`, `raydium_amm_v4`) afin qu’un DEX partiel hors scope, comme `fluxbeam`, reste diagnostiqué sans bloquer le checkpoint DB/event coverage. +0.7.47 - Upstream Git Registry / DEX discovery preparation : ajout d’un registre générique `upstream_git` pour indexer `program_id`, discriminants d’instructions/events, noms d’entrées et familles de programmes depuis Carbon et sources Git/IDL externes ; extension Demo3 aux targets multi-surfaces, orderbook, burn/mint/transfer/wrap/unwrap/stake ; ajout de groupes de signatures réussies/échouées pour alimenter Demo2 ; maintien strict de l’invariant : aucune entrée upstream Git ne produit trade/candle sans decoder spécialisé et corpus local. +0.7.47-openbook-v2-audit - Ajout d’un decoder local `openbook_v2` audit-only : instructions `place_order`, `cancel_order_by_client_order_id`, `consume_events`, `settle_funds`, `close_open_orders_account`; cleanup du fallback `upstream_git.instruction_match`; extraction audit des `Program return` et `Program data`; mapping des logs `FillLog`, `OpenOrdersPositionLog`, `TotalOrderFillEvent`, `SettleFundsLog`; aucune matérialisation trade/candle. +0.7.47-phoenix-v1-audit - Ajout d’un decoder local `phoenix_v1` audit-only : `order_place`, `order_cancel`, `funds_withdraw`, `log`; parsing strict des instructions log `0x0f`; décodage audit du header Phoenix log et des events `Reduce`, `Place`, `TimeInForce`; correction du mapping `PlaceMultiplePostOnlyOrders` tag `0x10`; aucune matérialisation trade/candle. +0.7.47-doc-matrix - Révision documentaire : ajout d’une matrice DEX dédiée, ajout explicite des sources Git/IDL à consulter, et redécoupage du plan `0.7.48+` en un DEX/version par tranche afin d’éviter les lots “tous events/tous decoders” trop larges. +0.7.47-doc-event-coverage - Ajout d'une matrice événementielle complémentaire `DEX_EVENT_COVERAGE_MATRIX.md` pour suivre, par DEX/version, les familles `swap`, `pool_create`, `liquidity`, `position`, `fee`, `reward`, `admin/config`, `mint`, `burn`, `transfer`, `account_create/close`, `wrap/unwrap`, `orderbook`, `vault`, `lock/unlock`, `launch` et `migration`; ajout de `DB_EVENT_MODEL_REVIEW.md` pour clarifier que `k_sol_dex_decoded_events` suffit à l'audit-only mais que des tables transversales sont nécessaires pour exploiter transfers, orderbook, vault, launch/migration et coverage upstream en requêtes métier. +0.7.48-pre-event-coverage-sync - Raccordement de `k_sol_dex_event_coverage_entries` au registre upstream Git : ajout de `DexEventCoverageService`, sync des entrées registry vers SQLite, inférence conservatoire `event_family` / `expected_db_target`, mapping local limité aux events Raydium déjà connus, refresh des compteurs observés/matérialisés depuis `k_sol_dex_decoded_events` et tables non-trade existantes, sans modification des decoders ni de la matérialisation trade/candle. +0.7.48-pre-event-coverage-fix-docs - Correction du refresh SQL `k_sol_dex_event_coverage_entries` pour éviter les requêtes dynamiques non compatibles avec `sqlx::query` 0.9 ; mise à jour documentaire README/ROADMAP pour acter `0.7.48-pre` comme checkpoint DB/reporting et réaligner la suite sur l’ordre Raydium avant Meteora (`0.7.48 raydium_cpmm`, `0.7.49 raydium_clmm`, puis Pump/Meteora). +0.7.48-pre-event-coverage-report - Clôture du checkpoint `0.7.48-pre` : raccordement des summaries `k_sol_dex_event_coverage_entries` aux diagnostics locaux, ajout des compteurs agrégés de couverture au `LocalPipelineDiagnosticSummaryDto` et au `LocalPipelineValidationReportDto`, ajout du profil `0.7.48-pre_event_coverage_db_checkpoint`, exposition du profil dans Demo Pipeline 2, et maintien des invariants : aucun decoder DEX modifié, aucun trade/candle créé, aucun `program_id` promu sans corpus. +0.7.48-pre-event-coverage-validation-scope - Correction du profil `0.7.48-pre_event_coverage_db_checkpoint` : le contrôle bloquant des trade candidates non matérialisés est maintenant borné aux DEX attendus de la tranche Raydium (`raydium_cpmm`, `raydium_clmm`, `raydium_amm_v4`) afin qu’un DEX partiel hors scope, comme `fluxbeam`, reste diagnostiqué sans bloquer le checkpoint DB/event coverage. +0.7.48-raydium-cpmm-program-data - Complément Raydium CPMM : auto-sync conservatoire de `k_sol_dex_event_coverage_entries` lors des diagnostics/backfills si la table de coverage est vide, décodage des events CPMM `Program data` `swap_event` et `lp_change_event` sans sélecteur Anchor self-CPI, conservation explicite de `swap_event` en audit-only pour éviter tout doublon de trade/candle, matérialisation liquidity conservatoire de `lp_change_event` via `changeType`, et maintien des invariants failed transaction / non-trade / upstream Git. +0.7.48 - Raydium CPMM event coverage clôturé : décodage spécialisé des instructions/events CPMM Carbon/Raydium/fnzero, auto-sync coverage, index technique `k_sol_instruction_observations`, recherche Demo3 par instruction/discriminant, matérialisation validée des swaps, lifecycle, fees, admin/config, deposit/withdraw et `lp_change_event`, conservation de `swap_event` et de l’instruction inconnue `40f4bc78a7e9690a` en audit-only, et maintien des entrées `close_permission_pda` / `update_pool_status` en `upstream_git_mapped_unverified` faute de corpus local. diff --git a/Cargo.toml b/Cargo.toml index 1a7a8f7..e5c7622 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ members = [ ] [workspace.package] -version = "0.7.47" +version = "0.7.48" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-bobobot" @@ -89,3 +89,4 @@ manual_unwrap_or_default = "allow" manual_find = "allow" explicit_counter_loop = "allow" get_first = "allow" +implicit_saturating_sub = "allow" \ No newline at end of file diff --git a/DB_EVENT_MODEL_REVIEW.md b/DB_EVENT_MODEL_REVIEW.md index 22eee8c..bd2ad94 100644 --- a/DB_EVENT_MODEL_REVIEW.md +++ b/DB_EVENT_MODEL_REVIEW.md @@ -289,3 +289,20 @@ Objectif : - materialized events, - missing DB target, - trade_count invariant. + +## Note `0.7.48` — Raydium CPMM sans nouvelle table DB + +La tranche `0.7.48` confirme que `k_sol_dex_decoded_events` suffit pour continuer la couverture exhaustive CPMM en audit-only. + +Aucune nouvelle table n'est ajoutée pour CPMM : + +- les swaps exploitables restent dans `k_sol_trade_events` via les chemins existants ; +- `deposit` / `withdraw` utilisent les tables non-trade existantes seulement si le corpus et le rattachement pool/pair sont fiables ; +- les fees/admin/config/permission restent non-trade et ne peuvent pas produire candles ; +- les transfers SPL, account lifecycle, wrap/unwrap SOL, vault et launch/migration restent des familles transversales futures, à promouvoir seulement si plusieurs DEX en justifient le besoin. + +## Note 0.7.48 final — Instruction observations et CPMM + +La tranche `raydium_cpmm` ajoute `k_sol_instruction_observations` comme table technique d’index local, non comme table métier. Elle sert à chercher les instructions observées par `decoder_code`, `instruction_name` et `discriminator_hex`, puis à relier ces observations au corpus backfillé/rejoué. + +La matérialisation métier reste limitée aux tables existantes : `k_sol_trade_events`, `k_sol_liquidity_events`, `k_sol_pool_lifecycle_events`, `k_sol_fee_events` et `k_sol_pool_admin_events`. Les opérations SPL Token / Token-2022 visibles dans Solscan (`burn`, `transfer`, `transferChecked`, `closeAccount`) ne sont pas promues en tables métier dans `0.7.48`; elles justifient seulement une future table transversale si plusieurs DEX le nécessitent. diff --git a/DEX_DECODER_MATRIX.md b/DEX_DECODER_MATRIX.md index 0e6d596..6600e98 100644 --- a/DEX_DECODER_MATRIX.md +++ b/DEX_DECODER_MATRIX.md @@ -43,7 +43,7 @@ Cette matrice complète `kb_lib/src/dex_support_matrix.rs`. Elle documente **ce | 13 | `meteora_vault` | `to_verify` | Présent comme indice upstream / compte associé. | Corpus direct obligatoire ; decoder séparé si events vault réels ; aucune promotion via DAMM indirect. | | 14 | `fluxbeam` | `partial/to_verify` | Decoder initial existant ; Demo3 peut produire des candidats. | Vérifier source/IDL ; compléter swap, pool, liquidity, fees/admin ; matérialisation uniquement après corpus. | | 15 | `dexlab` | `partial/to_verify` | Decoder initial historique ; ancienne entrée beta supprimée. | Reconfirmer program id/source ; décoder events disponibles ; distinguer DexLab natif et liens OpenBook/market. | -| 16 | `lifinity_amm_v2` | `to_verify` | Program id listé par sources externes/Vybe ; pas de corpus concluant. | Trouver IDL/source ; Demo3 par program/market ; audit-only d’abord. | +| 16 | `lifinity_v2` | `to_verify` | Program id listé par sources externes/Vybe ; pas de corpus concluant. | Trouver IDL/source ; Demo3 par program/market ; audit-only d’abord. | | 17 | `stabble_stable_swap` / `stabble_weighted_swap` | `to_verify` | Program ids/indices via sources externes ; candidats Demo3 observables. | Source/IDL + corpus + decoder audit-only ; déterminer surface AMM et montants exploitables. | | 18 | `bonkswap` | `to_verify` | Program id/Carbon/Vybe selon registre ; swaps candidats possibles. | Vérifier program id, source et corpus ; décoder tous events ; pas de trade sans montants. | | 19 | `boop` / `boop_fun` | `to_verify / launch` | Entrée de découverte. | Séparer launch surface et swap effectif ; corpus + source obligatoire. | @@ -202,3 +202,24 @@ Un event peut devenir `materialized` uniquement si : | `aquifer` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | | `humidifi` | `to_verify` | `unknown` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | | `solfi_v2` | `to_verify` | `AMM` | `to_verify` | non | non | non | `to_verify` | vybe_supported_dex_amm_requires_local_corpus_and_decoder_source | + +## Note `0.7.48` — Raydium CPMM + +`raydium_cpmm` reste `supported`, mais sa couverture est maintenant explicitée au niveau entry/event coverage. + +Entrées CPMM couvertes localement depuis Carbon/fnzero/IDL : + +- swaps : `swap_base_input`, `swap_base_output` ; +- events Anchor self-CPI audit-only : `lp_change_event`, `swap_event` ; +- pool/lifecycle : `initialize`, `initialize_with_permission` ; +- liquidity : `deposit`, `withdraw` ; +- fees : `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee` ; +- admin/config/permission : `create_amm_config`, `update_amm_config`, `update_pool_status`, `create_permission_pda`, `close_permission_pda`. + +`create_amm_config` est traité comme admin/config, pas comme pool creation. `swap_event` est conservé comme audit-only pour ne pas doubler les trades matérialisés depuis les instructions `swap_base_input` / `swap_base_output`. + +## Note `0.7.48 final` — Raydium CPMM + +`raydium_cpmm` est considéré `supported` et clôturable pour la tranche `0.7.48`. Les entrées matérialisées couvrent swaps (`swap_base_input`, `swap_base_output`), liquidity (`deposit`, `withdraw`, `lp_change_event`), lifecycle (`initialize`, `initialize_with_permission`), fees (`collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee`) et admin/config (`create_amm_config`, `create_permission_pda`, `update_amm_config`). + +`swap_event` reste audit-only pour éviter tout doublon de trade/candle. `close_permission_pda` et `update_pool_status` restent connus upstream mais non observés localement. diff --git a/DEX_EVENT_COVERAGE_MATRIX.md b/DEX_EVENT_COVERAGE_MATRIX.md index 9d7ca69..dc80c2c 100644 --- a/DEX_EVENT_COVERAGE_MATRIX.md +++ b/DEX_EVENT_COVERAGE_MATRIX.md @@ -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é. diff --git a/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md b/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md index 4f413a9..00baab7 100644 --- a/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md +++ b/NEXT_SESSION_PROMPT_0.7.47_UPSTREAM_REGISTRY.md @@ -118,75 +118,75 @@ Les entrées de registre doivent être exposées à `kb_demo_app` via une comman DEX / AMM / CLMM / orderbook : ```text -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 +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_whirlpools fluxbeam -lifinity-amm-v2 -phoenix-v1 -openbook-v2 -stabble-stable-swap -stabble-weighted-swap +lifinity_v2 +phoenix_v1 +openbook_v2 +stabble_stable_swap +stabble_weighted_swap bonkswap boop moonshot heaven -okx-dex -pancake-swap +okx_dex +pancake_swap vertigo virtuals wavebreak -onchain-labs-dex-v1 -onchain-labs-dex-v2 +onchain_labs_dex_v1 +onchain_labs_dex_v2 ``` Agrégateurs / ordres / perps / lending : ```text -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 +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 : ```text -system-program -token-program -token-2022 -associated-token-account -address-lookup-table -memo-program -stake-program -mpl-token-metadata -mpl-core +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 +name_service +marinade_finance +solayer_restaking_program swig sharky -circle-message-transmitter-v2 -circle-token-messenger-v2 +circle_message_transmitter_v2 +circle_token_messenger_v2 ``` ## Règles de validation diff --git a/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md b/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md new file mode 100644 index 0000000..6a7bd1e --- /dev/null +++ b/NEXT_SESSION_PROMPT_0.7.49_RAYDIUM_CLMM.md @@ -0,0 +1,327 @@ +# Prompt de reprise — khadhroony-bobobot `0.7.49` / Raydium CLMM event coverage + +Reprise du projet `khadhroony-bobobot` après clôture fonctionnelle de `0.7.48 raydium_cpmm`. + +## Archive de départ + +Utiliser la dernière archive complète du workspace intégrant les deltas validés jusqu'à : + +```text +0.7.48-raydium-cpmm-final +``` + +Docs à fournir aussi : + +```text +README.md +ROADMAP.md +CHANGELOG.md +DEX_DECODER_MATRIX.md +DEX_EVENT_COVERAGE_MATRIX.md +DB_EVENT_MODEL_REVIEW.md +RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md +SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql +``` + +## État validé avant reprise + +`0.7.48` a clôturé la tranche `raydium_cpmm` : + +```text +k_sol_dex_event_coverage_entries synchronisée en snake_case local +k_sol_instruction_observations ajoutée comme table technique d'index instruction/discriminator +Demo3 enrichie avec recherche instruction/discriminator +Solscan instruction= utilisé comme accélérateur de recherche de signatures +raydium_cpmm Program data décodé pour lp_change_event / swap_event +raydium_cpmm deposit / withdraw / lp_change_event matérialisés liquidity +raydium_cpmm initialize / initialize_with_permission matérialisés lifecycle-only +raydium_cpmm collect_*_fee matérialisés fee +raydium_cpmm create_amm_config / create_permission_pda / update_amm_config matérialisés admin/config +raydium_cpmm swap_event conservé audit-only +close_permission_pda et update_pool_status conservés upstream_git_mapped_unverified faute de corpus local +instruction inconnue 40f4bc78a7e9690a conservée raydium_cpmm.instruction_audit +``` + +Validation locale finale observée : + +```text +cargo test -p kb_lib: ok, 386 passed +cargo clippy -p kb_lib --all-targets -- -D warnings: ok +replay local: 1124 replayed, 561 trades, 50 liquidity, 9 lifecycle, 2224 candle upserts +``` + +Couverture finale `raydium_cpmm` : + +```text +lp_change_event 25/25 liquidity, 0 trade +swap_event 529 decoded-only, 0 trade +deposit 11/11 liquidity, 0 trade +withdraw 14/14 liquidity, 0 trade +initialize 5/5 lifecycle, 0 admin, 0 trade +initialize_with_permission 4/4 lifecycle, 0 admin, 0 trade +collect_creator_fee 4/4 fee, 0 trade +collect_fund_fee 7/7 fee, 0 trade +collect_protocol_fee 15/15 fee, 0 trade +create_amm_config 6/6 admin, 0 trade +create_permission_pda 4/4 admin, 0 trade +update_amm_config 13/13 admin, 0 trade +swap_base_input 750 decoded, 482 trades +swap_base_output 25 decoded, 17 trades +close_permission_pda upstream_git_mapped_unverified +update_pool_status upstream_git_mapped_unverified +``` + +Invariants maintenus : + +```text +non-trade event = jamais trade/candle +failed transaction = audit-only +upstream Git/IDL/Solscan = indice, pas preuve métier +program_id upstream non promu sans corpus local +chaque decoder spécialisé remplace le fallback upstream_git.instruction_match +side effects SPL Token / Token-2022 restent transversaux, pas raydium_cpmm.* directs +pas de nouvelle table métier transversale sans preuve multi-DEX +``` + +## Décision de reprise + +Commencer `0.7.49` par `raydium_clmm`, avant Pump/Meteora. + +Ordre courant : + +```text +0.7.49 raydium_clmm +0.7.50 pump_swap +0.7.51 pump_fun +0.7.52 meteora_dbc +0.7.53 meteora_dlmm upstream parity +0.7.54 meteora_damm_v1 upstream parity +0.7.55 meteora_damm_v2 +0.7.56 phoenix_v1 audit-only completion +0.7.57 openbook_v2 audit-only completion +0.7.58 orca_whirlpools +0.7.59+ launch surfaces, candidats/historiques, validation consolidée +``` + +## Sources Git/IDL à utiliser systématiquement + +- https://github.com/sevenlabs-hq/carbon/tree/main/decoders +- https://github.com/0xfnzero/solana-streamer +- https://github.com/0xfnzero/sol-parser-sdk/tree/main/idl +- https://github.com/pinax-network/substreams-solana-idls/tree/main/src +- https://github.com/hodlwarden/solana-tx-parser/tree/main/src +- https://github.com/openbook-dex/openbook-v2 +- https://github.com/all-in-one-blockchain/phoenix-onchain-mm +- https://docs.vybenetwork.com/docs/available-dexs-amms + +Pour `0.7.49 raydium_clmm`, utiliser aussi explicitement : + +```text +https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK#programIdl +``` + +et les filtres Solscan de type : + +```text +https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK?instruction=&hide_spam=true&hide_failed=true&show_related=false&sort=desc +``` + +Solscan doit servir à trouver vite des signatures à backfiller, jamais comme preuve métier finale. + +## Objectif `0.7.49` — `raydium_clmm` + +Objectif : reprendre `raydium_clmm` comme deuxième tranche Raydium/version après CPMM. + +À faire : + +1. lire le code local `raydium_clmm` et les matérialisations existantes ; +2. lister toutes les instructions/events CLMM depuis Carbon/fnzero/IDL/Raydium/Solscan Program IDL ; +3. synchroniser/remplir `k_sol_dex_event_coverage_entries` pour `raydium_clmm` ; +4. utiliser `k_sol_instruction_observations` pour inspecter les discriminants réellement observés localement ; +5. ajouter à Demo3 les filtres instruction/discriminant CLMM si un binding/UI manque encore ; +6. chercher des signatures ciblées via Solscan `instruction=` ; +7. backfiller les signatures utiles dans Demo Pipeline 2 ; +8. rejouer localement `forceDexDecode=yes` ; +9. comparer listed/decoded/observed/materialized/trade_count via SQL coverage ; +10. compléter le decoder spécialisé `raydium_clmm` seulement pour les events confirmables ; +11. remplacer/nettoyer le fallback `upstream_git.instruction_match` quand un decoder local spécialisé couvre l'entrée ; +12. garder les events connus mais non observés en `upstream_git_mapped_unverified` ; +13. garder les events observés mais non matérialisés en audit-only/decoded ; +14. ne matérialiser que les non-trades prouvés par corpus et compatibles avec les tables existantes ; +15. ne pas modifier les règles trade/candle sauf bug de faux positif prouvé. + +## Familles à couvrir explicitement + +Ne pas se limiter aux swaps. + +Inclure dans l'audit coverage CLMM : + +```text +swap +pool_create +add_liquidity +remove_liquidity +position_open +position_close +fee +reward +admin/config +mint +burn +transfer +account_create +account_close +wrap_sol +unwrap_sol +order_place +order_cancel +order_fill +consume_events +settle_funds +vault_deposit +vault_withdraw +lock +unlock +launch +migration +stake +unstake +unknown/unmapped audit +``` + +Pour `raydium_clmm`, certaines familles sont probablement non applicables ou seulement observées comme side effects SPL Token/Token-2022. Elles doivent être explicitement justifiées dans la coverage matrix. + +## Points d'attention hérités de CPMM + +- `decoder_code` local doit rester en `snake_case` : `raydium_clmm`, pas `raydium-clmm`. +- Les slugs/chemins upstream peuvent garder les tirets : `raydium-clmm-decoder`. +- Les events side effects SPL Token (`burn`, `transfer`, `transferChecked`, `closeAccount`) ne doivent pas devenir `raydium_clmm.*` sans preuve qu'ils sont des instructions directes du programme CLMM. +- `k_sol_instruction_observations` est technique et peut être enrichie ; ne pas la confondre avec une table métier. +- `initialize_*` / création de pool doit rester lifecycle-only si c'est bien une création, pas admin. +- Les positions CLMM sont potentiellement des tables/catégories existantes ou à auditer : ne pas forcer liquidity simple si l'event représente une position NFT/tick. +- Les rewards/fees CLMM peuvent nécessiter un mapping plus fin que CPMM. + +## Requêtes SQL utiles + +Coverage CLMM : + +```sql +SELECT + entry_name, + entry_kind, + event_family, + expected_db_target, + proof_status, + observed_count, + materialized_count, + trade_count +FROM k_sol_dex_event_coverage_entries +WHERE decoder_code = 'raydium_clmm' +ORDER BY entry_kind, entry_name, discriminator_hex; +``` + +Instruction observations CLMM : + +```sql +SELECT + instruction_name, + discriminator_hex, + COUNT(*) AS observed_count, + COUNT(DISTINCT signature) AS tx_count +FROM k_sol_instruction_observations +WHERE decoder_code = 'raydium_clmm' +GROUP BY instruction_name, discriminator_hex +ORDER BY observed_count DESC; +``` + +Non-trade safety : + +```sql +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(le.id) AS liquidity_count, + COUNT(fe.id) AS fee_count, + COUNT(pa.id) AS admin_count, + COUNT(ple.id) AS lifecycle_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_liquidity_events le + ON le.decoded_event_id = de.id +LEFT JOIN k_sol_fee_events fe + ON fe.decoded_event_id = de.id +LEFT JOIN k_sol_pool_admin_events pa + ON pa.decoded_event_id = de.id +LEFT JOIN k_sol_pool_lifecycle_events ple + ON ple.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_clmm' +GROUP BY de.event_kind +ORDER BY de.event_kind; +``` + +Fallback upstream CLMM : + +```sql +SELECT + json_extract(payload_json, '$.upstreamDecoderCode') AS upstream_decoder_code, + json_extract(payload_json, '$.entryName') AS entry_name, + json_extract(payload_json, '$.discriminatorHex') AS discriminator_hex, + COUNT(*) AS fallback_count +FROM k_sol_dex_decoded_events +WHERE protocol_name = 'upstream_git' + AND event_kind = 'upstream_git.instruction_match' + AND json_extract(payload_json, '$.upstreamDecoderCode') = 'raydium_clmm' +GROUP BY upstream_decoder_code, entry_name, discriminator_hex +ORDER BY fallback_count DESC, entry_name; +``` + +Failed transaction safety : + +```sql +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +JOIN k_sol_chain_transactions tx + ON tx.id = de.transaction_id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_clmm' + AND tx.err_json IS NOT NULL + AND tx.err_json <> '' +GROUP BY de.event_kind +ORDER BY trade_count DESC, decoded_count DESC; +``` + +## Contraintes de code + +Conserver les règles du workspace : + +```text +Rust 2024 +pas de mod.rs +fichiers Rust avec // file: ... +pas de anyhow +pas de thiserror +pas de ? / unwrap / expect dans kb_lib applicatif +match / if let Err / let Err = ... else +rustdoc sur API publique +re-exports db.rs puis lib.rs si DB modifiée +``` + +## Livrables attendus pour `0.7.49` + +1. delta archive avec uniquement les fichiers ajoutés/modifiés ; +2. mise à jour `README.md`, `ROADMAP.md`, `CHANGELOG.md` si la tranche avance ; +3. rapport de couverture `raydium_clmm` ; +4. SQL de validation ; +5. tests verts : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` diff --git a/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md b/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md new file mode 100644 index 0000000..03c18dc --- /dev/null +++ b/RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md @@ -0,0 +1,204 @@ +# Rapport `0.7.48` — Raydium CPMM event coverage + +## Scope + +Tranche : `0.7.48`. +Decoder local : `raydium_cpmm`. +Programme : `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C`. + +Objectif : couvrir Raydium CPMM au-delà des swaps, avec preuve locale par backfill/replay SQL, sans modifier les règles trade/candle existantes et sans promouvoir de table métier transversale non nécessaire. + +## Sources utilisées + +Sources principales : + +- Carbon `carbon-raydium-cpmm-decoder` ; +- fnzero `solana-streamer` / `sol-parser-sdk` IDL `raydium_cpmm.json` ; +- Raydium CP-Swap officiel ; +- Solscan page programme / Program IDL comme accélérateur de recherche de signatures, notamment via `instruction=`. + +Règle retenue : Git/IDL/Solscan sont des indices de recherche. La preuve métier reste le corpus local backfillé puis rejoué. + +## Entrées CPMM inventoriées + +| Kind | Entrée | Discriminant | État final `0.7.48` | +|---|---|---|---| +| instruction | `close_permission_pda` | `9c5420764587467b` | connu upstream, non observé localement | +| instruction | `collect_creator_fee` | `1416567bc61cdb84` | décodé + matérialisé fee | +| instruction | `collect_fund_fee` | `a78a4e95dfc2067e` | décodé + matérialisé fee | +| instruction | `collect_protocol_fee` | `8888fcddc2427e59` | décodé + matérialisé fee | +| instruction | `create_amm_config` | `8934edd4d7756c68` | décodé + matérialisé admin/config | +| instruction | `create_permission_pda` | `878802d889a9b5ca` | décodé + matérialisé admin/config | +| instruction | `deposit` | `f223c68952e1f2b6` | décodé + matérialisé liquidity add | +| instruction | `initialize` | `afaf6d1f0d989bed` | décodé + matérialisé lifecycle | +| instruction | `initialize_with_permission` | `3f37fe4131b25979` | décodé + matérialisé lifecycle only | +| event | `lp_change_event` | `79a3cdc939da753c` | décodé + matérialisé liquidity bidirectionnelle | +| instruction | `swap_base_input` | `8fbe5adac41e33de` | décodé + trade matérialisé quand transaction OK | +| instruction | `swap_base_output` | `37d96256a34ab4ad` | décodé + trade matérialisé quand transaction OK | +| event | `swap_event` | `40c6cde8260871e2` | décodé audit-only, pas trade/candle | +| instruction | `update_amm_config` | `313cae889a1c74c8` | décodé + matérialisé admin/config | +| instruction | `update_pool_status` | `82576c062ee0757b` | connu upstream, non observé localement | +| instruction | `withdraw` | `b712469c946da122` | décodé + matérialisé liquidity remove | + +## Décodage ajouté ou stabilisé + +Le decoder spécialisé `raydium_cpmm` couvre maintenant : + +- les swaps instruction-scoped `swap_base_input` / `swap_base_output` ; +- les events `Program data:` / Anchor CPI `swap_event` et `lp_change_event` ; +- les instructions lifecycle `initialize` / `initialize_with_permission` ; +- les instructions liquidity `deposit` / `withdraw` ; +- les fees `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee` ; +- les instructions admin/config `create_amm_config`, `create_permission_pda`, `update_amm_config` ; +- les instructions connues mais non observées `close_permission_pda`, `update_pool_status` restent listées sans promotion métier. + +Le fallback `upstream_git.instruction_match` ne doit plus apparaître pour les instructions CPMM couvertes localement. + +## Matérialisation finale validée + +Rejeu local validé après backfills ciblés Solscan + Demo Pipeline 2 : + +| Event kind | Decoded | Table métier | Materialized | Trade count | Statut | +|---|---:|---|---:|---:|---| +| `raydium_cpmm.collect_creator_fee` | 4 | `k_sol_fee_events` | 4 | 0 | fee materialized | +| `raydium_cpmm.collect_fund_fee` | 7 | `k_sol_fee_events` | 7 | 0 | fee materialized | +| `raydium_cpmm.collect_protocol_fee` | 15 | `k_sol_fee_events` | 15 | 0 | fee materialized | +| `raydium_cpmm.create_amm_config` | 6 | `k_sol_pool_admin_events` | 6 | 0 | admin materialized | +| `raydium_cpmm.create_permission_pda` | 4 | `k_sol_pool_admin_events` | 4 | 0 | admin materialized | +| `raydium_cpmm.deposit` | 11 | `k_sol_liquidity_events` | 11 | 0 | liquidity add materialized | +| `raydium_cpmm.initialize` | 5 | `k_sol_pool_lifecycle_events` | 5 | 0 | lifecycle materialized | +| `raydium_cpmm.initialize_with_permission` | 4 | `k_sol_pool_lifecycle_events` | 4 | 0 | lifecycle only | +| `raydium_cpmm.lp_change_event` | 25 | `k_sol_liquidity_events` | 25 | 0 | liquidity materialized, `changeType` bidirectionnel | +| `raydium_cpmm.swap_base_input` | 750 | `k_sol_trade_events` | 482 | 482 | trade materialized for OK/actionable tx | +| `raydium_cpmm.swap_base_output` | 25 | `k_sol_trade_events` | 17 | 17 | trade materialized for OK/actionable tx | +| `raydium_cpmm.swap_event` | 529 | `k_sol_dex_decoded_events_only` | 0 | 0 | audit-only, no duplicate trade | +| `raydium_cpmm.update_amm_config` | 13 | `k_sol_pool_admin_events` | 13 | 0 | admin materialized | +| `raydium_cpmm.withdraw` | 14 | `k_sol_liquidity_events` | 14 | 0 | liquidity remove materialized | +| `raydium_cpmm.instruction_audit` | 3 | `k_sol_dex_decoded_events_only` | 0 | 0 | unknown audit-only | + +Replay final observé : + +```text +1124 replayed +561 trades +50 liquidity +9 lifecycle +2224 candle upserts +``` + +Le total liquidity correspond à : + +```text +deposit 11 +withdraw 14 +lp_change_event 25 +------------------- +total 50 +``` + +## `lp_change_event` + +`lp_change_event` est un event bidirectionnel : + +- `changeType = 0` : add/deposit liquidity ; +- `changeType = 1` : remove/withdraw liquidity. + +La coverage statique utilise donc `event_family = liquidity`, pas `liquidity_add`. La matérialisation résout le sens au niveau payload. Les events qui ne contiennent pas directement les mints sont enrichis via le contexte pool/pair local ou via le sibling `deposit` / `withdraw` déjà matérialisé dans la même transaction/replay. + +Validation finale : + +```text +changeType 0 -> 11 decoded / 11 liquidity / 0 trade +changeType 1 -> 14 decoded / 14 liquidity / 0 trade +``` + +## `initialize_with_permission` + +`initialize_with_permission` est traité comme pool lifecycle only. + +Validation finale : + +```text +raydium_cpmm.initialize 5 decoded / 5 lifecycle / 0 admin / 0 trade +raydium_cpmm.initialize_with_permission 4 decoded / 4 lifecycle / 0 admin / 0 trade +``` + +Le cleanup de matérialisation supprime les anciennes lignes admin dérivées si elles existent déjà dans la base. + +## Entrées non observées + +Solscan avec filtre `instruction=` n'a pas retourné de transaction locale utile pour : + +- `close_permission_pda` / `9c5420764587467b` ; +- `update_pool_status` / `82576c062ee0757b`. + +Ces entrées restent donc : + +```text +upstream_git_mapped_unverified +``` + +Absence Solscan ne signifie pas absence on-chain absolue, surtout si l'index UI ne couvre pas tout l'historique. Cela suffit cependant pour ne pas les promouvoir sans corpus local. + +## Instruction audit inconnue + +Le discriminator suivant a été observé localement : + +```text +40f4bc78a7e9690a +``` + +Il produit actuellement `raydium_cpmm.instruction_audit` avec `tradeCandidate=false` / `candleCandidate=false`. Il n'est pas nommé dans la tranche `0.7.48`, faute de preuve upstream/corpus suffisante. + +## Recherche Solscan retenue + +La page programme Solscan et l'onglet Program IDL sont utiles pour accélérer la recherche : + +```text +https://solscan.io/account/CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C#programIdl +``` + +Le filtre `instruction=` est documenté comme méthode pratique de découverte de signatures à backfiller localement, par exemple : + +```text +https://solscan.io/account/CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C?instruction=f223c68952e1f2b6&instruction=b712469c946da122&hide_spam=true&hide_failed=true&show_related=false&sort=desc +``` + +Solscan reste une aide de recherche, pas une source de vérité métier. + +## Table technique ajoutée + +`k_sol_instruction_observations` est ajoutée comme table technique d'index local. Elle permet de retrouver les signatures observées par `decoder_code`, `instruction_name` et `discriminator_hex`, sans créer de nouvelle table métier. + +Exemple : + +```sql +SELECT + instruction_name, + discriminator_hex, + COUNT(*) AS observed_count, + COUNT(DISTINCT signature) AS tx_count +FROM k_sol_instruction_observations +WHERE decoder_code = 'raydium_cpmm' +GROUP BY instruction_name, discriminator_hex +ORDER BY observed_count DESC; +``` + +## Invariants validés + +- `swap_event` ne produit aucun trade/candle. +- `deposit`, `withdraw`, `lp_change_event`, fees, admin/config et lifecycle gardent `trade_count=0`. +- Les transactions failed restent non matérialisées en trade/candle. +- Les side effects SPL Token / Token-2022 (`burn`, `transfer`, `transferChecked`, `closeAccount`) restent hors decoder métier CPMM direct et devront passer par une future table transversale si plusieurs DEX le justifient. +- Aucun program id n'est promu sans corpus local. + +## État de clôture + +`0.7.48 raydium_cpmm` est clôturable avec deux entrées connues mais non observées : + +```text +close_permission_pda +update_pool_status +``` + +La prochaine tranche fonctionnelle est `0.7.49 raydium_clmm`. diff --git a/README.md b/README.md index 1fd3d0f..eda1cd4 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,6 @@ Chaque DEX ou variante de DEX doit avoir sa propre étape de validation. Les fam - `pump_fun` ; - `raydium_launchlab` ; -- `raydium_launchpad` ; - `letsbonk` / `bonk_fun` ; - `bags` ; - `moonshot` ; @@ -351,9 +350,12 @@ La priorité immédiate après le point de reprise `0.7.43-E5C` est : 3. `0.7.45` : reprise séparée de `meteora_dlmm` — clôturée côté corpus DLMM actuel ; 4. `0.7.46` : reprise séparée de `meteora_damm_v1` — clôturée côté corpus DAMM v1 local ; 5. `0.7.47` : Upstream Git Registry / DEX discovery preparation — registre générique des `program_id`, discriminants, instructions et events issus de dépôts Git externes, tous non vérifiés par défaut ; -6. `0.7.48` : reprise séparée de `meteora_damm_v2` ; -7. `0.7.49` : reprise séparée de `meteora_dbc` ; -8. `0.7.50+` : validation progressive des autres DEX/surfaces issus du registre upstream Git : Orca, FluxBeam, DexLab, Lifinity, Phoenix, OpenBook, Stabble, BonkSwap, Boop, Moonshot, Heaven, Wavebreak, Vertigo, Virtuals, Pancake Swap, OKX DEX, Raydium Launchpad/Stable/Locking, puis launch surfaces. +6. `0.7.48-pre` : event coverage + DB model checkpoint — table coverage, sync upstream, refresh counts, diagnostics et profil validation ; +7. `0.7.48` : reprise séparée de `raydium_cpmm` ; +8. `0.7.49` : reprise séparée de `raydium_clmm` ; +9. `0.7.50` : reprise séparée de `pump_swap` ; +10. `0.7.51` : reprise séparée de `pump_fun` ; +11. `0.7.52+` : Meteora puis validation progressive des autres DEX/surfaces issus du registre upstream Git : Orca, FluxBeam, DexLab, Lifinity, Phoenix, OpenBook, Stabble, BonkSwap, Boop, Moonshot, Heaven, Wavebreak, Vertigo, Virtuals, Pancake Swap, OKX DEX, Raydium LaunchLab/Stable/Locking, puis launch surfaces. Garde-fous constants : @@ -463,3 +465,37 @@ La suite fonctionnelle reprend par Raydium avant Meteora : 3. `0.7.50` — `pump_swap` ; 4. `0.7.51` — `pump_fun` ; 5. `0.7.52+` — Meteora puis les autres DEX/surfaces. + +## Note 0.7.48 — Raydium CPMM event coverage + +La tranche `0.7.48` reprend `raydium_cpmm` avant Meteora, en s'appuyant sur la table `k_sol_dex_event_coverage_entries` ajoutée en `0.7.48-pre`. + +Le scope CPMM couvre désormais les entrées Carbon/fnzero/IDL suivantes : `close_permission_pda`, `collect_creator_fee`, `collect_fund_fee`, `collect_protocol_fee`, `create_amm_config`, `create_permission_pda`, `deposit`, `initialize`, `initialize_with_permission`, `lp_change_event`, `swap_base_input`, `swap_base_output`, `swap_event`, `update_amm_config`, `update_pool_status` et `withdraw`. + +Le decoder local spécialisé remplace le fallback `upstream_git.instruction_match` pour les instructions CPMM couvertes localement. Les events Anchor self-CPI `lp_change_event` et `swap_event` sont décodés comme preuve audit/coverage, mais ne produisent pas directement `trade_events`, metrics ou candles. Les swaps matérialisables restent les chemins instruction-scoped `swap_base_input` et `swap_base_output` lorsque les montants et le sens économique sont exploitables. + +Aucune nouvelle table DB n'est ajoutée en `0.7.48`. Les transfers, token account lifecycle, vaults, orderbook, launch/migration et locking restent documentés comme familles transversales futures, à promouvoir seulement après preuve multi-DEX. + +Voir aussi : + +- `DEX_EVENT_COVERAGE_MATRIX.md` pour la couverture par familles ; +- `RAYDIUM_CPMM_EVENT_COVERAGE_REPORT.md` pour le rapport de tranche ; +- `SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql` pour les requêtes de validation. + +Complément `0.7.48-raydium-cpmm-program-data` : la coverage DB est maintenant synchronisée automatiquement quand un refresh de coverage est demandé sur une base neuve et qu'aucune ligne n'existe encore. Les backfills token/pool/signature déclenchent aussi un refresh best-effort de la coverage afin d'éviter un état incohérent où `k_sol_dex_decoded_events` est rempli mais `k_sol_dex_event_coverage_entries` reste vide. + +Le decoder CPMM lit désormais les events `Program data:` émis par le programme Raydium CPMM. Les layouts `lp_change_event` et `swap_event` sont décodés depuis le payload event direct, en plus du chemin Anchor self-CPI `e445a52e51cb9a1d + event_discriminator`. `swap_event` reste `tradeCandidate=false` / `candleCandidate=false` : les seuls trades CPMM matérialisables restent `swap_base_input` et `swap_base_output`. `lp_change_event` peut alimenter la matérialisation liquidity si le corpus fournit un pool/pair fiable et si `changeType` distingue dépôt/retrait. + + + +### Note 0.7.48-part2-fix2 — Raydium CPMM coverage finalization + +La tranche CPMM reconnaît désormais tous les discriminants instruction-level listés par Carbon / Raydium CP-Swap côté classificateur local. `lp_change_event` est traité comme famille bidirectionnelle `liquidity`, avec sens add/remove résolu par `changeType`, et le refresh coverage est confirmé après replay local sans validation séparée. + +## Note 0.7.48 final — Raydium CPMM clôturable + +La tranche `0.7.48` clôture la couverture Raydium CPMM sur corpus local. Les entrées `deposit`, `withdraw` et `lp_change_event` matérialisent `k_sol_liquidity_events` sans créer de trade/candle ; `initialize` et `initialize_with_permission` matérialisent seulement `k_sol_pool_lifecycle_events` ; les fees matérialisent `k_sol_fee_events` ; les entrées admin/config observées matérialisent `k_sol_pool_admin_events`. + +La table technique `k_sol_instruction_observations` est ajoutée pour indexer localement les instructions observées par `decoder_code`, `instruction_name` et `discriminator_hex`. Demo3 peut rechercher par instruction/discriminant, ce qui reproduit localement l’usage pratique du filtre Solscan `instruction=`. + +État final CPMM observé : `561` trades, `50` liquidity events, `9` lifecycle events, `25/25` `lp_change_event` matérialisés, `swap_event` audit-only à `0` trade, et deux entrées connues mais non observées (`close_permission_pda`, `update_pool_status`) conservées en `upstream_git_mapped_unverified`. diff --git a/ROADMAP.md b/ROADMAP.md index 3f5e451..4caa189 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -851,7 +851,6 @@ Matrice cible initiale : | `raydium_cpmm` | AMM | supporté | conserver trades/candles | | `raydium_clmm` | CLMM | supporté | conserver trades/candles | | `raydium_launchlab` | launch surface | planifié, program id local connu | ajouter decoder/materialization dédiée | -| `raydium_launchpad` | launch surface | à vérifier | ne pas inventer de program id | | `raydium_amm_v4` | AMM legacy | partiel | corpus dédié après autres Raydium | | `raydium_router` | router | partiel | ne pas matérialiser en trade direct avant preuve | | `raydium_stable_swap` | AMM legacy | planifié | traiter seulement si corpus pertinent | @@ -1231,9 +1230,9 @@ Objectif : accélérer la découverte multi-DEX en indexant les `program_id`, di 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 à l’analyse : `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`. +- DEX / AMM / CLMM / orderbook : `meteora_damm_v2`, `meteora_dbc`, `meteora_dlmm`, `meteora_vault`, `raydium_amm_v4`, `raydium_clmm`, `raydium_cpmm`, `raydium_launchlab`, `raydium_liquidity_locking`, `raydium_stable_swap`, `orca_whirlpools`, `fluxbeam`, `lifinity_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 à l’analyse : `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 qu’il existe dans un dépôt Git externe. @@ -1581,3 +1580,47 @@ Demo3 discovery now supports multiple source addresses, `before` / `until` pagin 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 l’absence de `pool_id/pair_id` local pour leurs pools, pas par un échec de décodage. + +### 6.080B. Clôture `0.7.48` — `raydium_cpmm` event coverage + +Statut : delta préparé. + +Fait : + +- inventaire des entrées `raydium_cpmm` depuis Carbon et fnzero/IDL ; +- mapping local spécialisé des instructions CPMM non-swap connues ; +- ajout du décodage Anchor self-CPI audit-only `lp_change_event` et `swap_event` ; +- mise à jour de `known_local_event_kind` pour que la coverage DB reflète la couverture locale CPMM ; +- conservation de `swap_event` comme audit-only pour éviter un doublon avec les trades matérialisés depuis `swap_base_input` / `swap_base_output` ; +- maintien des règles : non-trade = zéro trade/candle, failed transaction = audit-only, upstream Git/IDL = indice et non preuve métier. + +Reste à exécuter localement après application du delta : + +```bash +cargo fmt +cargo test -p kb_lib +cargo clippy -p kb_lib --all-targets -- -D warnings +``` + +Puis relancer la validation SQL `SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql` sur la base de corpus CPMM. + +Complément appliqué après constitution du corpus CPMM : + +- auto-sync conservatoire de `k_sol_dex_event_coverage_entries` lors d'un refresh coverage si la base neuve ne contient encore aucune entrée coverage ; +- refresh coverage best-effort après backfill token, pool ou signature ; +- décodage des events `Program data:` CPMM sans sélecteur Anchor self-CPI pour `swap_event` et `lp_change_event` ; +- maintien de `swap_event` en decoded/audit-only pour ne jamais doubler les `trade_events` issus des instructions swap ; +- matérialisation liquidity possible pour `lp_change_event` lorsque le pool/pair local est connu, avec `changeType=0` comme add/deposit et `changeType=1` comme remove/withdraw ; +- aucun changement de règle trade/candle pour les swaps existants. + + + +### Note 0.7.48-part2-fix2 — Raydium CPMM coverage finalization + +La tranche CPMM reconnaît désormais tous les discriminants instruction-level listés par Carbon / Raydium CP-Swap côté classificateur local. `lp_change_event` est traité comme famille bidirectionnelle `liquidity`, avec sens add/remove résolu par `changeType`, et le refresh coverage est confirmé après replay local sans validation séparée. + +### Note 0.7.48 final — Raydium CPMM + +`0.7.48` est clôturable côté `raydium_cpmm`. Le decoder couvre les instructions/events CPMM listés par Carbon/fnzero/Raydium CP-Swap, avec matérialisation locale validée pour trades, liquidity, lifecycle, fees et admin/config. `swap_event` reste audit-only pour éviter les doublons avec `swap_base_input` / `swap_base_output`. Les side effects SPL Token / Token-2022 observés via Solscan (`burn`, `transfer`, `transferChecked`, `closeAccount`) restent hors decoder CPMM direct et alimenteront une réflexion transversale future. + +La suite reprend en `0.7.49` par `raydium_clmm`, en utilisant les sources Git/IDL habituelles et la page Solscan Program IDL `https://solscan.io/account/CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK#programIdl` pour accélérer la découverte de signatures par discriminant. diff --git a/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql b/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql new file mode 100644 index 0000000..ac02d0e --- /dev/null +++ b/SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql @@ -0,0 +1,231 @@ +-- file: SQL_VALIDATION_RAYDIUM_CPMM_0_7_48.sql + +-- 1. Coverage rows must exist after diagnostics/validation/backfill refresh. +SELECT * +FROM k_sol_dex_event_coverage_entries +WHERE decoder_code = 'raydium_cpmm' +ORDER BY entry_kind, entry_name, discriminator_hex; + +-- 2. Aggregated coverage summary for Raydium CPMM. +SELECT + decoder_code, + listed_entry_count, + decoded_entry_count, + observed_entry_count, + materialized_entry_count, + total_observed_count, + total_materialized_count, + trade_count, + audit_only_entry_count, + upstream_git_mapped_unverified_entry_count, + upstream_git_local_corpus_observed_entry_count, + upstream_git_local_corpus_materialized_entry_count +FROM ( + SELECT + decoder_code, + COUNT(*) AS listed_entry_count, + SUM(CASE WHEN local_event_kind IS NOT NULL AND local_event_kind <> '' THEN 1 ELSE 0 END) AS decoded_entry_count, + SUM(CASE WHEN observed_count > 0 THEN 1 ELSE 0 END) AS observed_entry_count, + SUM(CASE WHEN materialized_count > 0 THEN 1 ELSE 0 END) AS materialized_entry_count, + COALESCE(SUM(observed_count), 0) AS total_observed_count, + COALESCE(SUM(materialized_count), 0) AS total_materialized_count, + COALESCE(SUM(trade_count), 0) AS trade_count, + SUM(CASE WHEN expected_db_target = 'k_sol_dex_decoded_events_only' THEN 1 ELSE 0 END) AS audit_only_entry_count, + SUM(CASE WHEN proof_status = 'upstream_git_mapped_unverified' THEN 1 ELSE 0 END) AS upstream_git_mapped_unverified_entry_count, + SUM(CASE WHEN proof_status = 'upstream_git_local_corpus_observed' THEN 1 ELSE 0 END) AS upstream_git_local_corpus_observed_entry_count, + SUM(CASE WHEN proof_status = 'upstream_git_local_corpus_materialized' THEN 1 ELSE 0 END) AS upstream_git_local_corpus_materialized_entry_count + FROM k_sol_dex_event_coverage_entries + GROUP BY decoder_code +) +WHERE decoder_code = 'raydium_cpmm'; + +-- 3. Decoded event distribution. +SELECT + de.protocol_name, + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(DISTINCT de.transaction_id) AS transaction_count +FROM k_sol_dex_decoded_events de +WHERE de.protocol_name = 'raydium_cpmm' +GROUP BY de.protocol_name, de.event_kind +ORDER BY decoded_count DESC, de.event_kind; + +-- 4. Audit/non-trade safety: no audit/non-trade CPMM event may produce trades. +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.protocol_name = 'raydium_cpmm' + AND ( + de.event_kind LIKE '%audit%' + OR de.event_kind IN ( + 'raydium_cpmm.lp_change_event', + 'raydium_cpmm.swap_event', + 'raydium_cpmm.collect_creator_fee', + 'raydium_cpmm.collect_fund_fee', + 'raydium_cpmm.collect_protocol_fee', + 'raydium_cpmm.create_amm_config', + 'raydium_cpmm.update_amm_config', + 'raydium_cpmm.update_pool_status', + 'raydium_cpmm.create_permission_pda', + 'raydium_cpmm.close_permission_pda' + ) + OR json_extract(de.payload_json, '$.eventActionability') IN ('non_trade_useful', 'informational', 'non_actionable_trade') + ) +GROUP BY de.protocol_name, de.event_kind +ORDER BY trade_count DESC, de.event_kind; + +-- 5. Failed transactions must not materialize trades. +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +JOIN k_sol_chain_transactions tx + ON tx.id = de.transaction_id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_cpmm' + AND tx.err_json IS NOT NULL + AND tx.err_json <> '' +GROUP BY de.event_kind +ORDER BY trade_count DESC, decoded_count DESC; + +-- 6. Local specialized decoder must replace upstream fallback for CPMM entries. +SELECT + json_extract(payload_json, '$.upstreamDecoderCode') AS upstream_decoder_code, + json_extract(payload_json, '$.entryName') AS entry_name, + json_extract(payload_json, '$.discriminatorHex') AS discriminator_hex, + COUNT(*) AS fallback_count +FROM k_sol_dex_decoded_events +WHERE protocol_name = 'upstream_git' + AND event_kind = 'upstream_git.instruction_match' + AND json_extract(payload_json, '$.upstreamDecoderCode') = 'raydium_cpmm' +GROUP BY upstream_decoder_code, entry_name, discriminator_hex +ORDER BY fallback_count DESC, entry_name; + +-- 7. Program data events are decoded but must remain non-trade/non-candle candidates. +SELECT + event_kind, + COUNT(*) AS decoded_count, + SUM(CASE WHEN json_extract(payload_json, '$.tradeCandidate') = 1 THEN 1 ELSE 0 END) AS trade_candidate_count, + SUM(CASE WHEN json_extract(payload_json, '$.candleCandidate') = 1 THEN 1 ELSE 0 END) AS candle_candidate_count, + SUM(CASE WHEN json_extract(payload_json, '$.eventActionability') IN ('non_trade_useful', 'non_actionable_trade') THEN 1 ELSE 0 END) AS safe_actionability_count +FROM k_sol_dex_decoded_events +WHERE protocol_name = 'raydium_cpmm' + AND event_kind IN ('raydium_cpmm.lp_change_event', 'raydium_cpmm.swap_event') +GROUP BY event_kind +ORDER BY event_kind; + +-- 8. Liquidity materialization for lp_change_event, if pool/pair exists in local corpus. +SELECT + de.event_kind, + json_extract(de.payload_json, '$.changeType') AS change_type, + COUNT(de.id) AS decoded_count, + COUNT(le.id) AS liquidity_materialized_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_liquidity_events le + ON le.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_cpmm' + AND de.event_kind = 'raydium_cpmm.lp_change_event' +GROUP BY de.event_kind, change_type +ORDER BY change_type; + + +-- 9. Replay coverage hook check: capture this value before and after local replay. +SELECT MAX(updated_at) AS latest_coverage_refresh_at +FROM k_sol_dex_event_coverage_entries +WHERE decoder_code = 'raydium_cpmm'; + +-- 10. lp_change_event is a bidirectional liquidity event in coverage. +SELECT + entry_name, + event_family, + expected_db_target, + proof_status, + observed_count, + materialized_count, + trade_count +FROM k_sol_dex_event_coverage_entries +WHERE decoder_code = 'raydium_cpmm' + AND entry_name = 'lp_change_event'; + +-- 0.7.48 final — materialization safety summary. +SELECT + de.event_kind, + COUNT(*) AS decoded_count, + COUNT(le.id) AS liquidity_count, + COUNT(fe.id) AS fee_count, + COUNT(pa.id) AS admin_count, + COUNT(ple.id) AS lifecycle_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_liquidity_events le + ON le.decoded_event_id = de.id +LEFT JOIN k_sol_fee_events fe + ON fe.decoded_event_id = de.id +LEFT JOIN k_sol_pool_admin_events pa + ON pa.decoded_event_id = de.id +LEFT JOIN k_sol_pool_lifecycle_events ple + ON ple.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_cpmm' +GROUP BY de.event_kind +ORDER BY de.event_kind; + +-- 0.7.48 final — lp_change_event add/remove split. +SELECT + de.event_kind, + json_extract(de.payload_json, '$.changeType') AS change_type, + COUNT(*) AS decoded_count, + COUNT(le.id) AS liquidity_count, + COUNT(te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_liquidity_events le + ON le.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_cpmm' + AND de.event_kind = 'raydium_cpmm.lp_change_event' +GROUP BY de.event_kind, change_type +ORDER BY change_type; + +-- 0.7.48 final — initialize_with_permission must remain lifecycle-only. +SELECT + de.event_kind, + COUNT(DISTINCT de.id) AS decoded_count, + COUNT(DISTINCT ple.id) AS lifecycle_count, + COUNT(DISTINCT pa.id) AS admin_count, + COUNT(DISTINCT te.id) AS trade_count +FROM k_sol_dex_decoded_events de +LEFT JOIN k_sol_pool_lifecycle_events ple + ON ple.decoded_event_id = de.id +LEFT JOIN k_sol_pool_admin_events pa + ON pa.decoded_event_id = de.id +LEFT JOIN k_sol_trade_events te + ON te.decoded_event_id = de.id +WHERE de.protocol_name = 'raydium_cpmm' + AND de.event_kind IN ( + 'raydium_cpmm.initialize', + 'raydium_cpmm.initialize_with_permission' + ) +GROUP BY de.event_kind +ORDER BY de.event_kind; + +-- 0.7.48 final — instruction observation index. +SELECT + instruction_name, + discriminator_hex, + COUNT(*) AS observed_count, + COUNT(DISTINCT signature) AS tx_count +FROM k_sol_instruction_observations +WHERE decoder_code = 'raydium_cpmm' +GROUP BY instruction_name, discriminator_hex +ORDER BY observed_count DESC; diff --git a/kb_demo_app/frontend/demo3.html b/kb_demo_app/frontend/demo3.html index 828dc52..bd847b6 100644 --- a/kb_demo_app/frontend/demo3.html +++ b/kb_demo_app/frontend/demo3.html @@ -218,6 +218,16 @@
Leave all unchecked for generic discovery. Check several surfaces to scan once and keep candidates matching any selected target.
Use this to find corpus signatures for non-swap decoders without promoting unverified events. Leave all unchecked to request target='any'.
+
+ + +
Optional exact instruction-name filter. Accepts comma/space separated names.
+
+
+ + +
Optional first 8 bytes of instruction data, matching the Solscan instruction filter.
+
@@ -335,6 +345,7 @@ Kind Confidence Data prefix + Discriminator Verified pool Token A Token B @@ -346,7 +357,7 @@ - No on-chain candidate. + No on-chain candidate. diff --git a/kb_demo_app/frontend/demo_pipeline2.html b/kb_demo_app/frontend/demo_pipeline2.html index 77521df..9e1b47b 100644 --- a/kb_demo_app/frontend/demo_pipeline2.html +++ b/kb_demo_app/frontend/demo_pipeline2.html @@ -416,7 +416,7 @@ Aucun jeu de candles chargé.
-
+
diff --git a/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexDiscoveryRequest.ts b/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexDiscoveryRequest.ts index 0f722e3..4516a9c 100644 --- a/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexDiscoveryRequest.ts +++ b/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexDiscoveryRequest.ts @@ -44,6 +44,14 @@ scanOrder: string | null, * Optional target event family used to find non-swap signatures. */ targetEvent: string | null, +/** + * Optional instruction name filter, e.g. `withdraw` or `raydium_cpmm.withdraw`. + */ +targetInstructionName: string | null, +/** + * Optional instruction discriminator filter as 16-char lower hex, comma-separated when needed. + */ +targetDiscriminatorHex: string | null, /** * Whether transactions containing swap-like logs should be skipped. */ diff --git a/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexPairCandidate.ts b/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexPairCandidate.ts index 50c23ec..7df8e8d 100644 --- a/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexPairCandidate.ts +++ b/kb_demo_app/frontend/ts/bindings/Demo3OnchainDexPairCandidate.ts @@ -54,6 +54,10 @@ instructionName: string | null, * Prefix of the raw base58 instruction data, useful for audit grouping. */ instructionDataPrefix: string | null, +/** + * First eight instruction-data bytes as lower hex. + */ +instructionDiscriminatorHex: string | null, /** * Candidate pool address. */ diff --git a/kb_demo_app/frontend/ts/demo3.ts b/kb_demo_app/frontend/ts/demo3.ts index 10d9403..7aa6577 100644 --- a/kb_demo_app/frontend/ts/demo3.ts +++ b/kb_demo_app/frontend/ts/demo3.ts @@ -187,6 +187,20 @@ function validateOnchainRequest(request: Demo3OnchainDexDiscoveryRequest): void } throw new Error("Program id filter must be a valid Solana program id, or empty when using a preset that resolves it."); } + validateDiscriminatorFilter(request.targetDiscriminatorHex); +} + +function validateDiscriminatorFilter(value: string | null): void { + if (value === null || value.trim() === "") { + return; + } + const tokens = value.split(/[\s,]+/).map((token) => token.trim()).filter((token) => token !== ""); + for (const token of tokens) { + const normalized = token.startsWith("0x") || token.startsWith("0X") ? token.slice(2) : token; + if (!/^[0-9a-fA-F]{16}$/.test(normalized)) { + throw new Error(`Target discriminator '${token}' must be exactly 8 bytes / 16 hex characters.`); + } + } } function numberValueOrNull(value: string): number | null { @@ -320,6 +334,8 @@ function readOnchainRequest(): Demo3OnchainDexDiscoveryRequest { maxPages: intValue("demo3MaxPagesInput", 1), scanOrder: valueOrNull(byId("demo3ScanOrderSelect").value), targetEvent: readTargetEventFilter(), + targetInstructionName: valueOrNull(byId("demo3TargetInstructionNameInput").value), + targetDiscriminatorHex: valueOrNull(byId("demo3TargetDiscriminatorHexInput").value), excludeSwaps: byId("demo3ExcludeSwapsInput").checked, includeFailed: byId("demo3IncludeFailedInput").checked, httpRole: byId("demo3HttpRoleInput").value.trim() || "history_backfill", @@ -375,8 +391,10 @@ function renderOnchainResult(result: Demo3OnchainDexDiscoveryResult): void { byId("demo3SummaryRejectedCandidateCount").textContent = String(result.targetRejectedCandidateCount); byId("demo3SummaryCandidateCount").textContent = String(result.candidateCount); const targetEvent = targetEventLabel(result.request.targetEvent); + const targetInstruction = result.request.targetInstructionName ?? "any"; + const targetDiscriminator = result.request.targetDiscriminatorHex ?? "any"; const sourceText = result.resolvedSignatureAddresses.length === 0 ? result.resolvedSignatureAddress : result.resolvedSignatureAddresses.join(","); - byId("demo3TargetText").textContent = `${result.resolvedDexCode ?? "custom"} / program=${result.resolvedProgramId} / source=${result.resolvedSignatureSource}:${sourceText} / target=${targetEvent} / order=${result.request.scanOrder ?? "newest_first"}`; + byId("demo3TargetText").textContent = `${result.resolvedDexCode ?? "custom"} / program=${result.resolvedProgramId} / source=${result.resolvedSignatureSource}:${sourceText} / target=${targetEvent} / instr=${targetInstruction} / disc=${targetDiscriminator} / order=${result.request.scanOrder ?? "newest_first"}`; byId("demo3UniqueSignatureText").textContent = result.uniqueBackfillSignatures.length === 0 ? "-" : result.uniqueBackfillSignatures.join(", "); byId("demo3NextBeforeText").textContent = result.nextBeforeByAddress.length === 0 ? "-" : result.nextBeforeByAddress.map((cursor) => `${cursor.address}:${cursor.nextBeforeSignature ?? "-"}`).join(" | "); renderRejectedSummary(result); @@ -402,7 +420,7 @@ function renderRejectedSummary(result: Demo3OnchainDexDiscoveryResult): void { function renderOnchainCandidates(candidates: Demo3OnchainDexPairCandidate[]): void { const body = byId("demo3OnchainCandidateTableBody"); if (candidates.length === 0) { - body.innerHTML = 'No on-chain candidate.'; + body.innerHTML = 'No on-chain candidate.'; return; } body.innerHTML = candidates.map((candidate) => { @@ -428,6 +446,7 @@ function renderOnchainCandidates(candidates: Demo3OnchainDexPairCandidate[]): vo ${escapeHtml(candidate.candidateKind)} ${escapeHtml(candidate.confidence)} ${escapeHtml(shortText(candidate.instructionDataPrefix, 14))} + ${escapeHtml(shortText(candidate.instructionDiscriminatorHex, 16))} ${escapeHtml(shortText(verifiedPool, 14))} ${escapeHtml(shortText(candidate.tokenAMint, 14))} ${escapeHtml(shortText(candidate.tokenBMint, 14))} @@ -469,7 +488,7 @@ async function discoverOnchain(): Promise { return; } setStatus("running", "text-bg-warning"); - appendLogLine(`on-chain discovery dex='${request.dexCode ?? ""}' program='${request.programId ?? ""}' source='${request.signatureSource ?? "program_id"}:${request.sourceAddresses.join(",")}' target='${targetEventLabel(request.targetEvent)}' pages='${request.maxPages}' order='${request.scanOrder ?? "newest_first"}' before='${request.beforeSignature ?? ""}' until='${request.untilSignature ?? ""}' excludeSwaps='${request.excludeSwaps}' role='${request.httpRole}'`); + appendLogLine(`on-chain discovery dex='${request.dexCode ?? ""}' program='${request.programId ?? ""}' source='${request.signatureSource ?? "program_id"}:${request.sourceAddresses.join(",")}' target='${targetEventLabel(request.targetEvent)}' instruction='${request.targetInstructionName ?? ""}' discriminator='${request.targetDiscriminatorHex ?? ""}' pages='${request.maxPages}' order='${request.scanOrder ?? "newest_first"}' before='${request.beforeSignature ?? ""}' until='${request.untilSignature ?? ""}' excludeSwaps='${request.excludeSwaps}' role='${request.httpRole}'`); try { const payload = await invoke("demo3_discover_onchain_dex_pairs", { request }); lastResultJson = payload.resultJson; diff --git a/kb_demo_app/frontend/ts/demo_pipeline2.ts b/kb_demo_app/frontend/ts/demo_pipeline2.ts index c367948..fbf3d27 100644 --- a/kb_demo_app/frontend/ts/demo_pipeline2.ts +++ b/kb_demo_app/frontend/ts/demo_pipeline2.ts @@ -186,6 +186,32 @@ function renderCatalogTextareas( pairsTextarea.value = JSON.stringify(catalog.pairs, null, 2); } + +function toChartNumber(value: number | string | null | undefined): number { + if (value === null || value === undefined) { + return 0; + } + + if (typeof value === "number") { + return Number.isFinite(value) ? value : 0; + } + + const parsed = Number.parseFloat(value); + if (Number.isNaN(parsed) || !Number.isFinite(parsed)) { + return 0; + } + + return parsed; +} + +function calculateVisibleWindowStart(totalCandles: number): number { + if (totalCandles <= 90) { + return 0; + } + + return Math.max(0, ((totalCandles - 90) / totalCandles) * 100); +} + function parseCandlesJson(raw: string): PairCandle[] { if (raw.trim() === "") { return []; @@ -239,16 +265,18 @@ function renderCandlesChart( ); const ohlcData = sorted.map((candle) => [ - candle.open_price_quote_per_base, - candle.close_price_quote_per_base, - candle.low_price_quote_per_base, - candle.high_price_quote_per_base, + toChartNumber(candle.open_price_quote_per_base), + toChartNumber(candle.close_price_quote_per_base), + toChartNumber(candle.low_price_quote_per_base), + toChartNumber(candle.high_price_quote_per_base), ]); const volumeData = sorted.map((candle) => parseVolume(candle.quote_volume_raw, candle.trade_count), ); + const zoomStart = calculateVisibleWindowStart(sorted.length); + chartMeta.textContent = `Pair #${pairId.toString()} • timeframe ${timeframeSeconds.toString()}s • ${sorted.length} candles`; @@ -256,7 +284,8 @@ function renderCandlesChart( animation: false, legend: { data: ["OHLC", "Volume"], - top: 0, + top: 4, + left: 16, }, tooltip: { trigger: "axis", @@ -268,8 +297,8 @@ function renderCandlesChart( link: [{ xAxisIndex: "all" }], }, grid: [ - { left: 60, right: 24, top: 40, height: "58%" }, - { left: 60, right: 24, top: "74%", height: "16%" }, + { left: 76, right: 32, top: 52, height: "58%" }, + { left: 76, right: 32, top: "77%", height: "12%" }, ], xAxis: [ { @@ -277,7 +306,9 @@ function renderCandlesChart( data: categoryData, boundaryGap: true, axisLine: { onZero: false }, - splitLine: { show: false }, + axisTick: { alignWithLabel: true }, + splitLine: { show: true }, + axisLabel: { hideOverlap: true, margin: 14 }, min: "dataMin", max: "dataMax", }, @@ -287,9 +318,9 @@ function renderCandlesChart( data: categoryData, boundaryGap: true, axisLine: { onZero: false }, - axisTick: { show: false }, + axisTick: { alignWithLabel: true }, splitLine: { show: false }, - axisLabel: { show: false }, + axisLabel: { hideOverlap: true, margin: 10 }, min: "dataMin", max: "dataMax", }, @@ -297,27 +328,33 @@ function renderCandlesChart( yAxis: [ { scale: true, + splitNumber: 5, splitArea: { show: false }, + axisLabel: { margin: 12 }, }, { gridIndex: 1, scale: true, splitNumber: 2, + axisLabel: { margin: 12 }, }, ], dataZoom: [ { type: "inside", xAxisIndex: [0, 1], - start: 0, + filterMode: "none", + start: zoomStart, end: 100, }, { show: true, type: "slider", xAxisIndex: [0, 1], - bottom: 6, - start: 0, + filterMode: "none", + bottom: 8, + height: 22, + start: zoomStart, end: 100, }, ], @@ -326,11 +363,12 @@ function renderCandlesChart( name: "OHLC", type: "candlestick", data: ohlcData, + xAxisIndex: 0, + yAxisIndex: 0, + barMinWidth: 4, + barMaxWidth: 16, itemStyle: { - color: "#16a34a", - color0: "#dc2626", - borderColor: "#15803d", - borderColor0: "#b91c1c", + borderWidth: 1.4, }, }, { @@ -339,9 +377,13 @@ function renderCandlesChart( xAxisIndex: 1, yAxisIndex: 1, data: volumeData, + barMinWidth: 2, + barMaxWidth: 10, }, ], }, true); + + window.setTimeout(() => chart.resize(), 0); } document.addEventListener("DOMContentLoaded", async () => { @@ -468,6 +510,10 @@ document.addEventListener("DOMContentLoaded", async () => { const chart = echarts.init(safeChartElement); setEmptyChart(chart, safeChartMeta, "Aucune candle disponible."); window.addEventListener("resize", () => chart.resize()); + const chartCollapse = document.querySelector("#demoPipeline2ChartCollapse"); + chartCollapse?.addEventListener("shown.bs.collapse", () => { + window.setTimeout(() => chart.resize(), 0); + }); clearLogButton.addEventListener("click", () => { logTextarea.value = ""; diff --git a/kb_demo_app/package.json b/kb_demo_app/package.json index 2d85fff..ebbb15a 100644 --- a/kb_demo_app/package.json +++ b/kb_demo_app/package.json @@ -1,7 +1,7 @@ { "name": "kb-demo-app", "private": true, - "version": "0.7.47", + "version": "0.7.48", "type": "module", "scripts": { "dev": "vite", diff --git a/kb_demo_app/src/demo3.rs b/kb_demo_app/src/demo3.rs index a1e90ec..337d5ce 100644 --- a/kb_demo_app/src/demo3.rs +++ b/kb_demo_app/src/demo3.rs @@ -287,7 +287,10 @@ pub(crate) async fn demo3_search_local_dex_corpus( /// Search request for the static upstream registry exposed through Demo3. #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, TS)] -#[ts(export, export_to = "../frontend/ts/bindings/Demo3UpstreamRegistrySearchRequest.ts")] +#[ts( + export, + export_to = "../frontend/ts/bindings/Demo3UpstreamRegistrySearchRequest.ts" +)] #[serde(rename_all = "camelCase")] pub(crate) struct Demo3UpstreamRegistrySearchRequest { /// Optional decoder-code filter. @@ -423,10 +426,7 @@ pub(crate) fn demo3_search_upstream_registry( return Err(format!("cannot serialize upstream registry result: {}", error)); }, }; - return Ok(Demo3UpstreamRegistryPayload { - result_json, - result: ui_result, - }); + return Ok(Demo3UpstreamRegistryPayload { result_json, result: ui_result }); } fn to_lib_upstream_registry_request( @@ -491,8 +491,7 @@ fn from_lib_upstream_registry_summary( account_entry_count: summary.account_entry_count, upstream_git_unverified_count: summary.upstream_git_unverified_count, upstream_git_mapped_unverified_count: summary.upstream_git_mapped_unverified_count, - upstream_git_local_corpus_observed_count: summary - .upstream_git_local_corpus_observed_count, + upstream_git_local_corpus_observed_count: summary.upstream_git_local_corpus_observed_count, upstream_git_local_corpus_materialized_count: summary .upstream_git_local_corpus_materialized_count, upstream_git_layout_unverified_count: summary.upstream_git_layout_unverified_count, @@ -685,6 +684,12 @@ pub(crate) struct Demo3OnchainDexDiscoveryRequest { pub scan_order: std::option::Option, /// Optional target event family used to find non-swap signatures. pub target_event: std::option::Option, + /// Optional instruction name filter, e.g. `withdraw` or `raydium_cpmm.withdraw`. + #[serde(default)] + pub target_instruction_name: std::option::Option, + /// Optional instruction discriminator filter as 16-char lower hex, comma-separated when needed. + #[serde(default)] + pub target_discriminator_hex: std::option::Option, /// Whether transactions containing swap-like logs should be skipped. pub exclude_swaps: bool, /// Whether failed transactions should be returned as candidates. @@ -846,6 +851,8 @@ pub(crate) struct Demo3OnchainDexPairCandidate { pub instruction_name: std::option::Option, /// Prefix of the raw base58 instruction data, useful for audit grouping. pub instruction_data_prefix: std::option::Option, + /// First eight instruction-data bytes as lower hex. + pub instruction_discriminator_hex: std::option::Option, /// Candidate pool address. pub pool_address: std::option::Option, /// Candidate token A mint. @@ -966,6 +973,8 @@ fn to_lib_onchain_request( max_pages: request.max_pages, scan_order: normalize_optional_text(request.scan_order.clone()), target_event: normalize_optional_text(request.target_event.clone()), + target_instruction_name: normalize_optional_text(request.target_instruction_name.clone()), + target_discriminator_hex: normalize_optional_text(request.target_discriminator_hex.clone()), exclude_swaps: request.exclude_swaps, include_failed: request.include_failed, http_role: request.http_role.trim().to_string(), @@ -994,6 +1003,8 @@ fn from_lib_onchain_result( max_pages: result.request.max_pages, scan_order: result.request.scan_order, target_event: result.request.target_event, + target_instruction_name: result.request.target_instruction_name, + target_discriminator_hex: result.request.target_discriminator_hex, exclude_swaps: result.request.exclude_swaps, include_failed: result.request.include_failed, http_role: result.request.http_role, @@ -1074,6 +1085,7 @@ fn from_lib_onchain_candidate( inner_instruction_index: candidate.inner_instruction_index, instruction_name: candidate.instruction_name, instruction_data_prefix: candidate.instruction_data_prefix, + instruction_discriminator_hex: candidate.instruction_discriminator_hex, pool_address: candidate.pool_address, token_a_mint: candidate.token_a_mint, token_b_mint: candidate.token_b_mint, diff --git a/kb_demo_app/tauri.conf.json b/kb_demo_app/tauri.conf.json index 825885a..a0ad342 100644 --- a/kb_demo_app/tauri.conf.json +++ b/kb_demo_app/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "kb-demo-app", - "version": "0.7.47", + "version": "0.7.48", "identifier": "com.sasedev.kb-demo-app", "build": { "beforeDevCommand": "npm run dev", diff --git a/kb_lib/src/constants.rs b/kb_lib/src/constants.rs index bc3d5bc..7d35263 100644 --- a/kb_lib/src/constants.rs +++ b/kb_lib/src/constants.rs @@ -288,7 +288,7 @@ pub const RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID: &str = "5quBtoiQqxF9Jv6KYKctB59NT3 pub const BONKSWAP_PROGRAM_ID: &str = "BSwp6bEBihVLdqJRKGgzjcGLHkcTuzmSo1TQkHepzH8p"; /// Boop program id extracted from upstream Git decoder source. -pub const BOOP_PROGRAM_ID: &str = "boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4"; +pub const BOOP_FUN_PROGRAM_ID: &str = "boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4"; /// DFlow Aggregator v4 program id extracted from upstream Git decoder source. pub const DFLOW_AGGREGATOR_V4_PROGRAM_ID: &str = "DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH"; diff --git a/kb_lib/src/db.rs b/kb_lib/src/db.rs index 206d6bb..6399007 100644 --- a/kb_lib/src/db.rs +++ b/kb_lib/src/db.rs @@ -27,6 +27,7 @@ pub use dtos::DexDto; pub use dtos::DexEventCoverageEntryDto; pub use dtos::DexEventCoverageSummaryDto; pub use dtos::FeeEventDto; +pub use dtos::InstructionObservationDto; pub use dtos::KnownHttpEndpointDto; pub use dtos::KnownWsEndpointDto; pub use dtos::LaunchAttributionDto; @@ -96,6 +97,7 @@ pub use entities::DexEntity; pub use entities::DexEventCoverageEntryEntity; pub use entities::DexEventCoverageSummaryEntity; pub use entities::FeeEventEntity; +pub use entities::InstructionObservationEntity; pub use entities::KnownHttpEndpointEntity; pub use entities::KnownWsEndpointEntity; pub use entities::LaunchAttributionEntity; @@ -168,6 +170,8 @@ pub use queries::query_dexs_upsert; pub use queries::query_fee_events_get_by_decoded_event_id; pub use queries::query_fee_events_list_recent; pub use queries::query_fee_events_upsert; +pub use queries::query_instruction_observations_list_by_filter; +pub use queries::query_instruction_observations_upsert; pub use queries::query_known_http_endpoints_get; pub use queries::query_known_http_endpoints_list; pub use queries::query_known_http_endpoints_upsert; diff --git a/kb_lib/src/db/dtos.rs b/kb_lib/src/db/dtos.rs index 5bc53da..eb4a8c7 100644 --- a/kb_lib/src/db/dtos.rs +++ b/kb_lib/src/db/dtos.rs @@ -15,6 +15,7 @@ mod dex_event_coverage_entry; mod fee_event; mod known_http_endpoint; mod known_ws_endpoint; +mod instruction_observation; mod launch_attribution; mod launch_surface; mod launch_surface_key; @@ -84,6 +85,7 @@ pub use dex_event_coverage_entry::DexEventCoverageSummaryDto; pub use fee_event::FeeEventDto; pub use known_http_endpoint::KnownHttpEndpointDto; pub use known_ws_endpoint::KnownWsEndpointDto; +pub use instruction_observation::InstructionObservationDto; pub use launch_attribution::LaunchAttributionDto; pub use launch_surface::LaunchSurfaceDto; pub use launch_surface_key::LaunchSurfaceKeyDto; diff --git a/kb_lib/src/db/dtos/instruction_observation.rs b/kb_lib/src/db/dtos/instruction_observation.rs new file mode 100644 index 0000000..7ca3e1f --- /dev/null +++ b/kb_lib/src/db/dtos/instruction_observation.rs @@ -0,0 +1,155 @@ +// file: kb_lib/src/db/dtos/instruction_observation.rs + +//! Instruction observation DTOs. + +/// Persisted technical observation for one Solana instruction. +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +pub struct InstructionObservationDto { + /// Optional numeric primary key. + pub id: std::option::Option, + /// Stable observation key. + pub observation_key: std::string::String, + /// Parent transaction id. + pub transaction_id: i64, + /// Parent transaction signature. + pub signature: std::string::String, + /// Optional Solana slot. + pub slot: std::option::Option, + /// Optional block time. + pub block_time: std::option::Option, + /// Whether the parent transaction failed. + pub failed: bool, + /// Instruction row id. + pub instruction_id: i64, + /// Optional parent instruction id. + pub parent_instruction_id: std::option::Option, + /// Outer instruction index. + pub instruction_index: i64, + /// Optional inner instruction index. + pub inner_instruction_index: std::option::Option, + /// Instruction program id. + pub program_id: std::string::String, + /// Local decoder code when resolved. + pub decoder_code: std::option::Option, + /// First eight instruction-data bytes as lower-hex. + pub discriminator_hex: std::option::Option, + /// Known local instruction name when resolved. + pub instruction_name: std::option::Option, + /// Serialized accounts JSON. + pub accounts_json: std::string::String, + /// Optional serialized data JSON. + pub data_json: std::option::Option, + /// Optional decoded pool account from local decoded events. + pub pool_account: std::option::Option, + /// Optional decoded event kind attached to this instruction. + pub decoded_event_kind: std::option::Option, + /// Optional decoded event id attached to this instruction. + pub decoded_event_id: std::option::Option, + /// First observation timestamp. + pub observed_at: chrono::DateTime, + /// Last refresh timestamp. + pub updated_at: chrono::DateTime, +} + +impl InstructionObservationDto { + /// Creates a new instruction observation DTO. + #[allow(clippy::too_many_arguments)] + pub fn new( + observation_key: std::string::String, + transaction_id: i64, + signature: std::string::String, + slot: std::option::Option, + block_time: std::option::Option, + failed: bool, + instruction_id: i64, + parent_instruction_id: std::option::Option, + instruction_index: i64, + inner_instruction_index: std::option::Option, + program_id: std::string::String, + decoder_code: std::option::Option, + discriminator_hex: std::option::Option, + instruction_name: std::option::Option, + accounts_json: std::string::String, + data_json: std::option::Option, + pool_account: std::option::Option, + decoded_event_kind: std::option::Option, + decoded_event_id: std::option::Option, + ) -> Self { + let now = chrono::Utc::now(); + return Self { + id: None, + observation_key, + transaction_id, + signature, + slot, + block_time, + failed, + instruction_id, + parent_instruction_id, + instruction_index, + inner_instruction_index, + program_id, + decoder_code, + discriminator_hex, + instruction_name, + accounts_json, + data_json, + pool_account, + decoded_event_kind, + decoded_event_id, + observed_at: now, + updated_at: now, + }; + } +} + +impl TryFrom for InstructionObservationDto { + type Error = crate::Error; + + fn try_from(entity: crate::InstructionObservationEntity) -> Result { + let observed_at_result = chrono::DateTime::parse_from_rfc3339(entity.observed_at.as_str()); + let observed_at = match observed_at_result { + Ok(observed_at) => observed_at.with_timezone(&chrono::Utc), + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot parse instruction observation observed_at '{}': {}", + entity.observed_at, error + ))); + }, + }; + let updated_at_result = chrono::DateTime::parse_from_rfc3339(entity.updated_at.as_str()); + let updated_at = match updated_at_result { + Ok(updated_at) => updated_at.with_timezone(&chrono::Utc), + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot parse instruction observation updated_at '{}': {}", + entity.updated_at, error + ))); + }, + }; + return Ok(Self { + id: Some(entity.id), + observation_key: entity.observation_key, + transaction_id: entity.transaction_id, + signature: entity.signature, + slot: entity.slot, + block_time: entity.block_time, + failed: entity.failed != 0, + instruction_id: entity.instruction_id, + parent_instruction_id: entity.parent_instruction_id, + instruction_index: entity.instruction_index, + inner_instruction_index: entity.inner_instruction_index, + program_id: entity.program_id, + decoder_code: entity.decoder_code, + discriminator_hex: entity.discriminator_hex, + instruction_name: entity.instruction_name, + accounts_json: entity.accounts_json, + data_json: entity.data_json, + pool_account: entity.pool_account, + decoded_event_kind: entity.decoded_event_kind, + decoded_event_id: entity.decoded_event_id, + observed_at, + updated_at, + }); + } +} diff --git a/kb_lib/src/db/entities.rs b/kb_lib/src/db/entities.rs index 3c44045..779a14f 100644 --- a/kb_lib/src/db/entities.rs +++ b/kb_lib/src/db/entities.rs @@ -17,6 +17,7 @@ mod dex_event_coverage_entry; mod fee_event; mod known_http_endpoint; mod known_ws_endpoint; +mod instruction_observation; mod launch_attribution; mod launch_surface; mod launch_surface_key; @@ -62,6 +63,7 @@ pub use dex_event_coverage_entry::DexEventCoverageSummaryEntity; pub use fee_event::FeeEventEntity; pub use known_http_endpoint::KnownHttpEndpointEntity; pub use known_ws_endpoint::KnownWsEndpointEntity; +pub use instruction_observation::InstructionObservationEntity; pub use launch_attribution::LaunchAttributionEntity; pub use launch_surface::LaunchSurfaceEntity; pub use launch_surface_key::LaunchSurfaceKeyEntity; diff --git a/kb_lib/src/db/entities/instruction_observation.rs b/kb_lib/src/db/entities/instruction_observation.rs new file mode 100644 index 0000000..42ca19b --- /dev/null +++ b/kb_lib/src/db/entities/instruction_observation.rs @@ -0,0 +1,52 @@ +// file: kb_lib/src/db/entities/instruction_observation.rs + +//! Instruction observation entity. + +/// Persisted technical observation for one Solana instruction. +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, sqlx::FromRow)] +pub struct InstructionObservationEntity { + /// Internal row id. + pub id: i64, + /// Stable observation key. + pub observation_key: std::string::String, + /// Parent transaction id. + pub transaction_id: i64, + /// Parent transaction signature. + pub signature: std::string::String, + /// Optional Solana slot. + pub slot: std::option::Option, + /// Optional block time. + pub block_time: std::option::Option, + /// Transaction failed flag. + pub failed: i64, + /// Instruction row id. + pub instruction_id: i64, + /// Optional parent instruction id. + pub parent_instruction_id: std::option::Option, + /// Outer instruction index. + pub instruction_index: i64, + /// Optional inner instruction index. + pub inner_instruction_index: std::option::Option, + /// Instruction program id. + pub program_id: std::string::String, + /// Local decoder code when resolved. + pub decoder_code: std::option::Option, + /// First eight instruction-data bytes as lower-hex. + pub discriminator_hex: std::option::Option, + /// Known local instruction name when resolved. + pub instruction_name: std::option::Option, + /// Accounts JSON. + pub accounts_json: std::string::String, + /// Optional data JSON. + pub data_json: std::option::Option, + /// Optional pool account. + pub pool_account: std::option::Option, + /// Optional decoded event kind. + pub decoded_event_kind: std::option::Option, + /// Optional decoded event id. + pub decoded_event_id: std::option::Option, + /// First observation timestamp. + pub observed_at: std::string::String, + /// Last refresh timestamp. + pub updated_at: std::string::String, +} diff --git a/kb_lib/src/db/queries.rs b/kb_lib/src/db/queries.rs index 0b7c646..85bd70f 100644 --- a/kb_lib/src/db/queries.rs +++ b/kb_lib/src/db/queries.rs @@ -15,6 +15,7 @@ mod dex_event_coverage_entry; mod fee_event; mod known_http_endpoint; mod known_ws_endpoint; +mod instruction_observation; mod launch_attribution; mod launch_surface; mod launch_surface_key; @@ -92,6 +93,8 @@ pub use known_http_endpoint::query_known_http_endpoints_upsert; pub use known_ws_endpoint::query_known_ws_endpoints_get; pub use known_ws_endpoint::query_known_ws_endpoints_list; pub use known_ws_endpoint::query_known_ws_endpoints_upsert; +pub use instruction_observation::query_instruction_observations_list_by_filter; +pub use instruction_observation::query_instruction_observations_upsert; pub use launch_attribution::query_launch_attributions_get_by_decoded_event_id; pub use launch_attribution::query_launch_attributions_list_by_pool_id; pub use launch_attribution::query_launch_attributions_upsert; diff --git a/kb_lib/src/db/queries/dex_decoded_event.rs b/kb_lib/src/db/queries/dex_decoded_event.rs index bda0fd8..e190b91 100644 --- a/kb_lib/src/db/queries/dex_decoded_event.rs +++ b/kb_lib/src/db/queries/dex_decoded_event.rs @@ -442,7 +442,7 @@ mod tests { 0, None, Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID.to_string()), - Some("raydium-amm-v4".to_string()), + Some("raydium_amm_v4".to_string()), Some(1), r#"["Account0","Pool111","Lp111","TokenA111","TokenB111"]"#.to_string(), None, @@ -529,7 +529,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), r#"["ParentAccount","Pool111"]"#.to_string(), None, @@ -548,7 +548,7 @@ mod tests { 0, Some(0), Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(2), r#"["ChildAccount","Pool111"]"#.to_string(), None, diff --git a/kb_lib/src/db/queries/dex_event_coverage_entry.rs b/kb_lib/src/db/queries/dex_event_coverage_entry.rs index 19a423a..a774a4b 100644 --- a/kb_lib/src/db/queries/dex_event_coverage_entry.rs +++ b/kb_lib/src/db/queries/dex_event_coverage_entry.rs @@ -735,7 +735,7 @@ mod tests { let database = make_database().await; let upstream_service = crate::UpstreamRegistryService::new(); let request = crate::UpstreamRegistrySearchRequestDto { - decoder_code: Some("raydium-cpmm".to_string()), + decoder_code: Some("raydium_cpmm".to_string()), program_id: None, program_family: None, surface_kind: None, @@ -759,7 +759,7 @@ mod tests { .expect("coverage upsert must succeed"); assert!(id > 0); let rows = - crate::query_dex_event_coverage_entries_list_by_decoder(&database, "raydium-cpmm") + crate::query_dex_event_coverage_entries_list_by_decoder(&database, "raydium_cpmm") .await .expect("coverage list must succeed"); assert_eq!(rows.len(), 1); @@ -768,7 +768,7 @@ mod tests { .await .expect("coverage summary must succeed"); assert_eq!(summaries.len(), 1); - assert_eq!(summaries[0].decoder_code, "raydium-cpmm"); + assert_eq!(summaries[0].decoder_code, "raydium_cpmm"); assert_eq!(summaries[0].listed_entry_count, 1); assert_eq!(summaries[0].decoded_entry_count, 1); assert_eq!(summaries[0].observed_entry_count, 1); diff --git a/kb_lib/src/db/queries/instruction_observation.rs b/kb_lib/src/db/queries/instruction_observation.rs new file mode 100644 index 0000000..ec5f0ea --- /dev/null +++ b/kb_lib/src/db/queries/instruction_observation.rs @@ -0,0 +1,173 @@ +// file: kb_lib/src/db/queries/instruction_observation.rs + +//! Queries for `k_sol_instruction_observations`. + +/// Upserts one instruction observation row. +pub async fn query_instruction_observations_upsert( + database: &crate::Database, + dto: &crate::InstructionObservationDto, +) -> Result { + match database.connection() { + crate::DatabaseConnection::Sqlite(pool) => { + let query_result = sqlx::query( + r#" +INSERT INTO k_sol_instruction_observations ( + observation_key, + transaction_id, + signature, + slot, + block_time, + failed, + instruction_id, + parent_instruction_id, + instruction_index, + inner_instruction_index, + program_id, + decoder_code, + discriminator_hex, + instruction_name, + accounts_json, + data_json, + pool_account, + decoded_event_kind, + decoded_event_id, + observed_at, + updated_at +) +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) +ON CONFLICT(observation_key) DO UPDATE SET + transaction_id = excluded.transaction_id, + signature = excluded.signature, + slot = excluded.slot, + block_time = excluded.block_time, + failed = excluded.failed, + instruction_id = excluded.instruction_id, + parent_instruction_id = excluded.parent_instruction_id, + instruction_index = excluded.instruction_index, + inner_instruction_index = excluded.inner_instruction_index, + program_id = excluded.program_id, + decoder_code = excluded.decoder_code, + discriminator_hex = excluded.discriminator_hex, + instruction_name = excluded.instruction_name, + accounts_json = excluded.accounts_json, + data_json = excluded.data_json, + pool_account = excluded.pool_account, + decoded_event_kind = excluded.decoded_event_kind, + decoded_event_id = excluded.decoded_event_id, + updated_at = excluded.updated_at + "#, + ) + .bind(dto.observation_key.clone()) + .bind(dto.transaction_id) + .bind(dto.signature.clone()) + .bind(dto.slot) + .bind(dto.block_time) + .bind(if dto.failed { 1_i64 } else { 0_i64 }) + .bind(dto.instruction_id) + .bind(dto.parent_instruction_id) + .bind(dto.instruction_index) + .bind(dto.inner_instruction_index) + .bind(dto.program_id.clone()) + .bind(dto.decoder_code.clone()) + .bind(dto.discriminator_hex.clone()) + .bind(dto.instruction_name.clone()) + .bind(dto.accounts_json.clone()) + .bind(dto.data_json.clone()) + .bind(dto.pool_account.clone()) + .bind(dto.decoded_event_kind.clone()) + .bind(dto.decoded_event_id) + .bind(dto.observed_at.to_rfc3339()) + .bind(dto.updated_at.to_rfc3339()) + .execute(pool) + .await; + let query_result = match query_result { + Ok(query_result) => query_result, + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot upsert k_sol_instruction_observations on sqlite: {}", + error + ))); + }, + }; + return Ok(query_result.last_insert_rowid()); + }, + } +} + +/// Lists instruction observations by optional decoder/discriminator/instruction filters. +pub async fn query_instruction_observations_list_by_filter( + database: &crate::Database, + decoder_code: std::option::Option<&str>, + discriminator_hex: std::option::Option<&str>, + instruction_name: std::option::Option<&str>, + limit: u32, +) -> Result, crate::Error> { + if limit == 0 { + return Ok(std::vec::Vec::new()); + } + match database.connection() { + crate::DatabaseConnection::Sqlite(pool) => { + let query_result = sqlx::query_as::( + r#" +SELECT + id, + observation_key, + transaction_id, + signature, + slot, + block_time, + failed, + instruction_id, + parent_instruction_id, + instruction_index, + inner_instruction_index, + program_id, + decoder_code, + discriminator_hex, + instruction_name, + accounts_json, + data_json, + pool_account, + decoded_event_kind, + decoded_event_id, + observed_at, + updated_at +FROM k_sol_instruction_observations +WHERE (? IS NULL OR decoder_code = ?) + AND (? IS NULL OR discriminator_hex = ?) + AND (? IS NULL OR instruction_name = ?) +ORDER BY slot DESC, transaction_id DESC, instruction_id ASC +LIMIT ? + "#, + ) + .bind(decoder_code.map(str::to_string)) + .bind(decoder_code.map(str::to_string)) + .bind(discriminator_hex.map(str::to_string)) + .bind(discriminator_hex.map(str::to_string)) + .bind(instruction_name.map(str::to_string)) + .bind(instruction_name.map(str::to_string)) + .bind(i64::from(limit)) + .fetch_all(pool) + .await; + let entities = match query_result { + Ok(entities) => entities, + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot list k_sol_instruction_observations on sqlite: {}", + error + ))); + }, + }; + let mut dtos = std::vec::Vec::new(); + for entity in entities { + let dto_result = crate::InstructionObservationDto::try_from(entity); + let dto = match dto_result { + Ok(dto) => dto, + Err(error) => return Err(error), + }; + dtos.push(dto); + } + return Ok(dtos); + }, + } +} diff --git a/kb_lib/src/db/schema.rs b/kb_lib/src/db/schema.rs index d061cb5..8ed1a7f 100644 --- a/kb_lib/src/db/schema.rs +++ b/kb_lib/src/db/schema.rs @@ -230,6 +230,26 @@ pub(crate) async fn ensure_schema(database: &crate::Database) -> Result<(), crat if let Err(error) = result { return Err(error); } + let result = create_tbl_instruction_observations(pool).await; + if let Err(error) = result { + return Err(error); + } + let result = create_uix_instruction_observations_key(pool).await; + if let Err(error) = result { + return Err(error); + } + let result = create_idx_instruction_observations_decoder_discriminator(pool).await; + if let Err(error) = result { + return Err(error); + } + let result = create_idx_instruction_observations_signature(pool).await; + if let Err(error) = result { + return Err(error); + } + let result = create_idx_instruction_observations_instruction_name(pool).await; + if let Err(error) = result { + return Err(error); + } let result = create_tbl_dex_decode_replay_ledger(pool).await; if let Err(error) = result { return Err(error); @@ -1423,6 +1443,104 @@ ON k_sol_chain_instructions (program_id) .await; } +/// Creates `k_sol_instruction_observations`. +async fn create_tbl_instruction_observations(pool: &sqlx::SqlitePool) -> Result<(), crate::Error> { + return execute_sqlite_schema_statement( + pool, + "create_tbl_instruction_observations", + r#" +CREATE TABLE IF NOT EXISTS k_sol_instruction_observations ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + observation_key TEXT NOT NULL, + transaction_id INTEGER NOT NULL, + signature TEXT NOT NULL, + slot INTEGER NULL, + block_time INTEGER NULL, + failed INTEGER NOT NULL, + instruction_id INTEGER NOT NULL, + parent_instruction_id INTEGER NULL, + instruction_index INTEGER NOT NULL, + inner_instruction_index INTEGER NULL, + program_id TEXT NOT NULL, + decoder_code TEXT NULL, + discriminator_hex TEXT NULL, + instruction_name TEXT NULL, + accounts_json TEXT NOT NULL, + data_json TEXT NULL, + pool_account TEXT NULL, + decoded_event_kind TEXT NULL, + decoded_event_id INTEGER NULL, + observed_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + FOREIGN KEY(transaction_id) REFERENCES k_sol_chain_transactions(id), + FOREIGN KEY(instruction_id) REFERENCES k_sol_chain_instructions(id), + FOREIGN KEY(decoded_event_id) REFERENCES k_sol_dex_decoded_events(id) +) + "#, + ) + .await; +} + +/// Creates unique index on instruction observation key. +async fn create_uix_instruction_observations_key( + pool: &sqlx::SqlitePool, +) -> Result<(), crate::Error> { + return execute_sqlite_schema_statement( + pool, + "create_uix_instruction_observations_key", + r#" +CREATE UNIQUE INDEX IF NOT EXISTS uix_instruction_observations_key +ON k_sol_instruction_observations (observation_key) + "#, + ) + .await; +} + +/// Creates lookup index on decoder/discriminator. +async fn create_idx_instruction_observations_decoder_discriminator( + pool: &sqlx::SqlitePool, +) -> Result<(), crate::Error> { + return execute_sqlite_schema_statement( + pool, + "create_idx_instruction_observations_decoder_discriminator", + r#" +CREATE INDEX IF NOT EXISTS idx_instruction_observations_decoder_discriminator +ON k_sol_instruction_observations (decoder_code, discriminator_hex) + "#, + ) + .await; +} + +/// Creates lookup index on signature. +async fn create_idx_instruction_observations_signature( + pool: &sqlx::SqlitePool, +) -> Result<(), crate::Error> { + return execute_sqlite_schema_statement( + pool, + "create_idx_instruction_observations_signature", + r#" +CREATE INDEX IF NOT EXISTS idx_instruction_observations_signature +ON k_sol_instruction_observations (signature) + "#, + ) + .await; +} + +/// Creates lookup index on instruction name. +async fn create_idx_instruction_observations_instruction_name( + pool: &sqlx::SqlitePool, +) -> Result<(), crate::Error> { + return execute_sqlite_schema_statement( + pool, + "create_idx_instruction_observations_instruction_name", + r#" +CREATE INDEX IF NOT EXISTS idx_instruction_observations_instruction_name +ON k_sol_instruction_observations (instruction_name) + "#, + ) + .await; +} + /// Creates `k_sol_dex_decoded_events`. async fn create_tbl_dex_decoded_events(pool: &sqlx::SqlitePool) -> Result<(), crate::Error> { return execute_sqlite_schema_statement( diff --git a/kb_lib/src/dex.rs b/kb_lib/src/dex.rs index 5f0d95e..2ab0831 100644 --- a/kb_lib/src/dex.rs +++ b/kb_lib/src/dex.rs @@ -77,6 +77,10 @@ pub use raydium_clmm::RaydiumClmmSwapLegacyDecoded; pub use raydium_clmm::RaydiumClmmSwapV2Decoded; pub use raydium_clmm::decode_raydium_clmm_instruction; pub use raydium_cpmm::RaydiumCpmmDecodedEvent; +pub use raydium_cpmm::RaydiumCpmmLpChangeEventDecoded; pub use raydium_cpmm::RaydiumCpmmSwapDecoded; +pub use raydium_cpmm::RaydiumCpmmSwapEventDecoded; pub use raydium_cpmm::RaydiumCpmmSwapMode; +pub use raydium_cpmm::classify_raydium_cpmm_instruction_data; pub use raydium_cpmm::decode_raydium_cpmm_instruction; +pub use raydium_cpmm::decode_raydium_cpmm_program_data_event; diff --git a/kb_lib/src/dex/meteora_damm_v1.rs b/kb_lib/src/dex/meteora_damm_v1.rs index 172322a..8a6dee0 100644 --- a/kb_lib/src/dex/meteora_damm_v1.rs +++ b/kb_lib/src/dex/meteora_damm_v1.rs @@ -3009,7 +3009,7 @@ fn infer_trade_side(log_messages: &[std::string::String]) -> crate::SwapTradeSid mod tests { fn make_create_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-damm-v1-create-1".to_string(), + "sig-meteora_damm_v1-create-1".to_string(), Some(890001), Some(1779500001), Some("helius_primary_http".to_string()), @@ -3042,7 +3042,7 @@ mod tests { 0, None, Some(crate::METEORA_DAMM_V1_PROGRAM_ID.to_string()), - Some("meteora-damm-v1".to_string()), + Some("meteora_damm_v1".to_string()), Some(1), serde_json::json!([ "DammV1Pool111", @@ -3074,7 +3074,7 @@ mod tests { fn make_swap_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-damm-v1-swap-1".to_string(), + "sig-meteora_damm_v1-swap-1".to_string(), Some(890002), Some(1779500002), Some("helius_primary_http".to_string()), @@ -3107,7 +3107,7 @@ mod tests { 0, None, Some(crate::METEORA_DAMM_V1_PROGRAM_ID.to_string()), - Some("meteora-damm-v1".to_string()), + Some("meteora_damm_v1".to_string()), Some(1), serde_json::json!(["DammV1SwapPool111", "DammV1SwapTokenA111", crate::WSOL_MINT_ID]) .to_string(), @@ -3141,7 +3141,7 @@ mod tests { 0, None, Some(crate::METEORA_DAMM_V1_PROGRAM_ID.to_string()), - Some("meteora-damm-v1".to_string()), + Some("meteora_damm_v1".to_string()), Some(1), accounts.to_string(), Some(format!("\"{}\"", bs58::encode(data).into_string())), diff --git a/kb_lib/src/dex/meteora_damm_v2.rs b/kb_lib/src/dex/meteora_damm_v2.rs index bb5b76a..4fceb4e 100644 --- a/kb_lib/src/dex/meteora_damm_v2.rs +++ b/kb_lib/src/dex/meteora_damm_v2.rs @@ -758,7 +758,7 @@ fn is_trade_amount_or_price_key(normalized_key: &str) -> bool { mod tests { fn make_create_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-damm-v2-create-1".to_string(), + "sig-meteora_damm_v2-create-1".to_string(), Some(889001), Some(1779400001), Some("helius_primary_http".to_string()), @@ -791,7 +791,7 @@ mod tests { 0, None, Some(crate::METEORA_DAMM_V2_PROGRAM_ID.to_string()), - Some("meteora-damm-v2".to_string()), + Some("meteora_damm_v2".to_string()), Some(1), serde_json::json!([ "DammV2Pool111", @@ -823,7 +823,7 @@ mod tests { fn make_swap_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-damm-v2-swap-1".to_string(), + "sig-meteora_damm_v2-swap-1".to_string(), Some(889002), Some(1779400002), Some("helius_primary_http".to_string()), @@ -856,7 +856,7 @@ mod tests { 0, None, Some(crate::METEORA_DAMM_V2_PROGRAM_ID.to_string()), - Some("meteora-damm-v2".to_string()), + Some("meteora_damm_v2".to_string()), Some(1), serde_json::json!(["DammV2SwapPool111", "DammV2SwapTokenA111", crate::WSOL_MINT_ID]) .to_string(), diff --git a/kb_lib/src/dex/meteora_dbc.rs b/kb_lib/src/dex/meteora_dbc.rs index 4e71fcc..0057e8e 100644 --- a/kb_lib/src/dex/meteora_dbc.rs +++ b/kb_lib/src/dex/meteora_dbc.rs @@ -727,7 +727,7 @@ fn is_trade_amount_or_price_key(normalized_key: &str) -> bool { mod tests { fn make_create_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-dbc-create-1".to_string(), + "sig-meteora_dbc-create-1".to_string(), Some(888001), Some(1779300001), Some("helius_primary_http".to_string()), @@ -760,7 +760,7 @@ mod tests { 0, None, Some(crate::METEORA_DBC_PROGRAM_ID.to_string()), - Some("meteora-dbc".to_string()), + Some("meteora_dbc".to_string()), Some(1), serde_json::json!([ "DbcPool111", @@ -791,7 +791,7 @@ mod tests { fn make_swap_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-dbc-swap-1".to_string(), + "sig-meteora_dbc-swap-1".to_string(), Some(888002), Some(1779300002), Some("helius_primary_http".to_string()), @@ -824,7 +824,7 @@ mod tests { 0, None, Some(crate::METEORA_DBC_PROGRAM_ID.to_string()), - Some("meteora-dbc".to_string()), + Some("meteora_dbc".to_string()), Some(1), serde_json::json!(["DbcPoolSwap111", "DbcSwapTokenA111", crate::WSOL_MINT_ID]) .to_string(), diff --git a/kb_lib/src/dex/meteora_dlmm.rs b/kb_lib/src/dex/meteora_dlmm.rs index 82e4fbd..e32b348 100644 --- a/kb_lib/src/dex/meteora_dlmm.rs +++ b/kb_lib/src/dex/meteora_dlmm.rs @@ -2646,7 +2646,7 @@ fn first_8_bytes_hex(bytes: &[u8]) -> std::option::Option { mod tests { fn make_create_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-dlmm-create-1".to_string(), + "sig-meteora_dlmm-create-1".to_string(), Some(888101), Some(1779400001), Some("helius_primary_http".to_string()), @@ -2679,7 +2679,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), serde_json::json!([ "DlmmPair111", @@ -2708,7 +2708,7 @@ mod tests { fn make_swap_transaction() -> crate::ChainTransactionDto { let mut dto = crate::ChainTransactionDto::new( - "sig-meteora-dlmm-swap-1".to_string(), + "sig-meteora_dlmm-swap-1".to_string(), Some(888102), Some(1779400002), Some("helius_primary_http".to_string()), @@ -2741,7 +2741,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), serde_json::json!(["DlmmPairSwap111", "DlmmSwapTokenX111", crate::WSOL_MINT_ID]) .to_string(), @@ -2906,7 +2906,7 @@ mod tests { fn meteora_dlmm_inner_swap2_instruction_is_not_skipped() { let decoder = crate::MeteoraDlmmDecoder::new(); let mut transaction = crate::ChainTransactionDto::new( - "sig-meteora-dlmm-inner-swap2".to_string(), + "sig-meteora_dlmm-inner-swap2".to_string(), Some(888103), Some(1779400003), Some("helius_primary_http".to_string()), @@ -2933,7 +2933,7 @@ mod tests { 3, Some(14), Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(2), serde_json::json!([ "LbPair111", @@ -3030,7 +3030,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), serde_json::json!([ "Position111", @@ -3083,7 +3083,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), serde_json::json!([ "DlmmPairFee111", @@ -3132,7 +3132,7 @@ mod tests { 0, None, Some(crate::METEORA_DLMM_PROGRAM_ID.to_string()), - Some("meteora-dlmm".to_string()), + Some("meteora_dlmm".to_string()), Some(1), serde_json::json!([ "Position111", diff --git a/kb_lib/src/dex/openbook_v2.rs b/kb_lib/src/dex/openbook_v2.rs index adef9b7..e255c6b 100644 --- a/kb_lib/src/dex/openbook_v2.rs +++ b/kb_lib/src/dex/openbook_v2.rs @@ -102,7 +102,7 @@ impl OpenBookV2Decoder { Some(registry_match) => registry_match, None => continue, }; - if registry_match.decoder_code.as_str() != "openbook-v2" { + if registry_match.decoder_code.as_str() != "openbook_v2" { continue; } let accounts = parse_instruction_accounts_vec(instruction.accounts_json.as_str()); diff --git a/kb_lib/src/dex/orca_whirlpools.rs b/kb_lib/src/dex/orca_whirlpools.rs index 03c20a8..91b5184 100644 --- a/kb_lib/src/dex/orca_whirlpools.rs +++ b/kb_lib/src/dex/orca_whirlpools.rs @@ -532,7 +532,7 @@ mod tests { 0, None, Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID.to_string()), - Some("orca-whirlpools".to_string()), + Some("orca_whirlpools".to_string()), Some(1), serde_json::json!([ "OrcaPool111", @@ -599,7 +599,7 @@ mod tests { 0, None, Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID.to_string()), - Some("orca-whirlpools".to_string()), + Some("orca_whirlpools".to_string()), Some(1), serde_json::json!(["OrcaSwapPool111", "OrcaSwapTokenA111", crate::WSOL_MINT_ID]) .to_string(), diff --git a/kb_lib/src/dex/phoenix_v1.rs b/kb_lib/src/dex/phoenix_v1.rs index 88c134c..e7a0fb3 100644 --- a/kb_lib/src/dex/phoenix_v1.rs +++ b/kb_lib/src/dex/phoenix_v1.rs @@ -101,7 +101,7 @@ impl PhoenixV1Decoder { Some(registry_match) => registry_match, None => continue, }; - if registry_match.decoder_code.as_str() != "phoenix-v1" { + if registry_match.decoder_code.as_str() != "phoenix_v1" { continue; } let accounts = parse_instruction_accounts_vec(instruction.accounts_json.as_str()); diff --git a/kb_lib/src/dex/raydium_amm_v4.rs b/kb_lib/src/dex/raydium_amm_v4.rs index 7873790..702c4df 100644 --- a/kb_lib/src/dex/raydium_amm_v4.rs +++ b/kb_lib/src/dex/raydium_amm_v4.rs @@ -1080,7 +1080,7 @@ mod tests { 0, None, Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID.to_string()), - Some("raydium-amm-v4".to_string()), + Some("raydium_amm_v4".to_string()), Some(1), serde_json::json!([ "Account0", @@ -1215,7 +1215,7 @@ mod tests { 4, Some(0), Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID.to_string()), - Some("raydium-amm-v4".to_string()), + Some("raydium_amm_v4".to_string()), Some(2), serde_json::json!([ crate::SPL_TOKEN_PROGRAM_ID, diff --git a/kb_lib/src/dex/raydium_cpmm.rs b/kb_lib/src/dex/raydium_cpmm.rs index 2bae4e7..1d49afe 100644 --- a/kb_lib/src/dex/raydium_cpmm.rs +++ b/kb_lib/src/dex/raydium_cpmm.rs @@ -11,6 +11,57 @@ const RAYDIUM_CPMM_SWAP_BASE_INPUT_DISCRIMINATOR: [u8; 8] = [143, 190, 90, 218, /// Raydium CPMM `swap_base_output` discriminator. const RAYDIUM_CPMM_SWAP_BASE_OUTPUT_DISCRIMINATOR: [u8; 8] = [55, 217, 98, 86, 163, 74, 180, 173]; +/// Raydium CPMM `close_permission_pda` discriminator. +const RAYDIUM_CPMM_CLOSE_PERMISSION_PDA_DISCRIMINATOR: [u8; 8] = + [156, 84, 32, 118, 69, 135, 70, 123]; + +/// Raydium CPMM `collect_creator_fee` discriminator. +const RAYDIUM_CPMM_COLLECT_CREATOR_FEE_DISCRIMINATOR: [u8; 8] = + [20, 22, 86, 123, 198, 28, 219, 132]; + +/// Raydium CPMM `collect_fund_fee` discriminator. +const RAYDIUM_CPMM_COLLECT_FUND_FEE_DISCRIMINATOR: [u8; 8] = [167, 138, 78, 149, 223, 194, 6, 126]; + +/// Raydium CPMM `collect_protocol_fee` discriminator. +const RAYDIUM_CPMM_COLLECT_PROTOCOL_FEE_DISCRIMINATOR: [u8; 8] = + [136, 136, 252, 221, 194, 66, 126, 89]; + +/// Raydium CPMM `create_amm_config` discriminator. +const RAYDIUM_CPMM_CREATE_AMM_CONFIG_DISCRIMINATOR: [u8; 8] = + [137, 52, 237, 212, 215, 117, 108, 104]; + +/// Raydium CPMM `create_permission_pda` discriminator. +const RAYDIUM_CPMM_CREATE_PERMISSION_PDA_DISCRIMINATOR: [u8; 8] = + [135, 136, 2, 216, 137, 169, 181, 202]; + +/// Raydium CPMM `deposit` discriminator. +const RAYDIUM_CPMM_DEPOSIT_DISCRIMINATOR: [u8; 8] = [242, 35, 198, 137, 82, 225, 242, 182]; + +/// Raydium CPMM `withdraw` discriminator. +const RAYDIUM_CPMM_WITHDRAW_DISCRIMINATOR: [u8; 8] = [183, 18, 70, 156, 148, 109, 161, 34]; + +/// Raydium CPMM `initialize` discriminator. +const RAYDIUM_CPMM_INITIALIZE_DISCRIMINATOR: [u8; 8] = [175, 175, 109, 31, 13, 152, 155, 237]; + +/// Raydium CPMM `initialize_with_permission` discriminator. +const RAYDIUM_CPMM_INITIALIZE_WITH_PERMISSION_DISCRIMINATOR: [u8; 8] = + [63, 55, 254, 65, 49, 178, 89, 121]; + +/// Raydium CPMM `update_amm_config` discriminator. +const RAYDIUM_CPMM_UPDATE_AMM_CONFIG_DISCRIMINATOR: [u8; 8] = [49, 60, 174, 136, 154, 28, 116, 200]; + +/// Raydium CPMM `update_pool_status` discriminator. +const RAYDIUM_CPMM_UPDATE_POOL_STATUS_DISCRIMINATOR: [u8; 8] = [130, 87, 108, 6, 46, 224, 117, 123]; + +/// Anchor self-CPI log selector used by Raydium CPMM events. +const RAYDIUM_CPMM_ANCHOR_SELF_CPI_LOG_SELECTOR: [u8; 8] = [228, 69, 165, 46, 81, 203, 154, 29]; + +/// Raydium CPMM `LpChangeEvent` Anchor event discriminator. +const RAYDIUM_CPMM_LP_CHANGE_EVENT_DISCRIMINATOR: [u8; 8] = [121, 163, 205, 201, 57, 218, 117, 60]; + +/// Raydium CPMM `SwapEvent` Anchor event discriminator. +const RAYDIUM_CPMM_SWAP_EVENT_DISCRIMINATOR: [u8; 8] = [64, 198, 205, 232, 38, 8, 113, 226]; + /// Raydium CPMM decoded event. #[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] pub enum RaydiumCpmmDecodedEvent { @@ -18,6 +69,130 @@ pub enum RaydiumCpmmDecodedEvent { SwapBaseInput(RaydiumCpmmSwapDecoded), /// Swap where the user fixes the output amount. SwapBaseOutput(RaydiumCpmmSwapDecoded), + /// Pool initialization instruction. + Initialize(RaydiumCpmmPoolInitializeDecoded), + /// Permissioned pool initialization instruction. + InitializeWithPermission(RaydiumCpmmPoolInitializeDecoded), + /// Add-liquidity instruction. + Deposit(RaydiumCpmmLiquidityDecoded), + /// Remove-liquidity instruction. + Withdraw(RaydiumCpmmLiquidityDecoded), + /// Fee-collection instruction. + FeeCollection(RaydiumCpmmFeeCollectionDecoded), + /// Pool/config administration instruction. + PoolAdmin(RaydiumCpmmPoolAdminDecoded), + /// Anchor CPI liquidity change event retained as decoded audit evidence. + LpChangeEvent(RaydiumCpmmLpChangeEventDecoded), + /// Anchor CPI swap event retained as decoded audit evidence. + SwapEvent(RaydiumCpmmSwapEventDecoded), +} + +/// Raydium CPMM pool initialization instruction decoded from accounts and instruction data. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmPoolInitializeDecoded { + /// Instruction name. + pub instruction_name: std::string::String, + /// Creator/payer account. + pub creator: std::option::Option, + /// AMM config account. + pub amm_config: std::option::Option, + /// Pool state account. + pub pool_state: std::string::String, + /// Token 0 mint. + pub token_0_mint: std::string::String, + /// Token 1 mint. + pub token_1_mint: std::string::String, + /// LP mint, when present in the projected account list. + pub lp_mint: std::option::Option, + /// Normalized base mint. + pub base_mint: std::string::String, + /// Normalized quote mint. + pub quote_mint: std::string::String, + /// Initial amount for token 0, when present. + pub init_amount_0_raw: std::option::Option, + /// Initial amount for token 1, when present. + pub init_amount_1_raw: std::option::Option, + /// Opening timestamp, when present. + pub open_time_raw: std::option::Option, +} + +/// Raydium CPMM liquidity instruction decoded from accounts and instruction data. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmLiquidityDecoded { + /// Instruction name. + pub instruction_name: std::string::String, + /// Liquidity direction: `add` or `remove`. + pub liquidity_direction: std::string::String, + /// Owner/payer account. + pub owner: std::option::Option, + /// Pool state account. + pub pool_state: std::string::String, + /// Token 0 mint. + pub token_0_mint: std::string::String, + /// Token 1 mint. + pub token_1_mint: std::string::String, + /// LP mint, when present in the projected account list. + pub lp_mint: std::option::Option, + /// Normalized base mint. + pub base_mint: std::string::String, + /// Normalized quote mint. + pub quote_mint: std::string::String, + /// Amount of token 0 requested/minimum depending on direction. + pub token_0_amount_raw: std::string::String, + /// Amount of token 1 requested/minimum depending on direction. + pub token_1_amount_raw: std::string::String, + /// Base amount mapped from token 0/1. + pub base_amount_raw: std::string::String, + /// Quote amount mapped from token 0/1. + pub quote_amount_raw: std::string::String, + /// LP token amount. + pub lp_amount_raw: std::string::String, + /// Amount semantics. + pub amount_semantics: std::string::String, +} + +/// Raydium CPMM fee-collection instruction decoded from accounts. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmFeeCollectionDecoded { + /// Instruction name. + pub instruction_name: std::string::String, + /// Pool state account. + pub pool_state: std::string::String, + /// Token 0 mint. + pub token_0_mint: std::option::Option, + /// Token 1 mint. + pub token_1_mint: std::option::Option, + /// Normalized base mint. + pub base_mint: std::option::Option, + /// Normalized quote mint. + pub quote_mint: std::option::Option, + /// Fee category. + pub fee_scope: std::string::String, + /// Actor/authority account, when known. + pub actor_wallet: std::option::Option, +} + +/// Raydium CPMM pool/config administration instruction decoded from accounts. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmPoolAdminDecoded { + /// Instruction name. + pub instruction_name: std::string::String, + /// Pool account, when the instruction is pool-scoped. + pub pool_state: std::option::Option, + /// Config or permission account, when available. + pub config_or_permission_account: std::option::Option, + /// Actor/authority account, when known. + pub actor_wallet: std::option::Option, + /// Administration action category. + pub admin_action: std::string::String, + /// First u8 argument, when available. + pub first_u8_arg: std::option::Option, + /// First u64 argument, when available. + pub first_u64_arg_raw: std::option::Option, } /// Raydium CPMM swap mode. @@ -82,36 +257,181 @@ pub struct RaydiumCpmmSwapDecoded { pub amount_out_raw: std::option::Option, } +/// Raydium CPMM Anchor CPI liquidity change event. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmLpChangeEventDecoded { + /// Pool account reported by the CPI event. + pub pool_id: std::string::String, + /// LP amount before the change. + pub lp_amount_before_raw: std::string::String, + /// Token 0 vault balance before the change. + pub token_0_vault_before_raw: std::string::String, + /// Token 1 vault balance before the change. + pub token_1_vault_before_raw: std::string::String, + /// Token 0 amount involved in the change. + pub token_0_amount_raw: std::string::String, + /// Token 1 amount involved in the change. + pub token_1_amount_raw: std::string::String, + /// Token 0 transfer fee. + pub token_0_transfer_fee_raw: std::string::String, + /// Token 1 transfer fee. + pub token_1_transfer_fee_raw: std::string::String, + /// Raw Raydium change type. + pub change_type: u8, +} + +/// Raydium CPMM Anchor CPI swap event retained as audit evidence. +#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RaydiumCpmmSwapEventDecoded { + /// Pool account reported by the CPI event. + pub pool_id: std::string::String, + /// Input vault balance before the swap. + pub input_vault_before_raw: std::string::String, + /// Output vault balance before the swap. + pub output_vault_before_raw: std::string::String, + /// Input amount reported by the event. + pub input_amount_raw: std::string::String, + /// Output amount reported by the event. + pub output_amount_raw: std::string::String, + /// Input transfer fee reported by the event. + pub input_transfer_fee_raw: std::string::String, + /// Output transfer fee reported by the event. + pub output_transfer_fee_raw: std::string::String, + /// True when the event is base-input. + pub base_input: bool, + /// Optional input mint, available in newer Carbon layouts. + pub input_mint: std::option::Option, + /// Optional output mint, available in newer Carbon layouts. + pub output_mint: std::option::Option, + /// Optional normalized base mint. + pub base_mint: std::option::Option, + /// Optional normalized quote mint. + pub quote_mint: std::option::Option, + /// Optional trade fee reported by newer layouts. + pub trade_fee_raw: std::option::Option, + /// Optional creator fee reported by newer layouts. + pub creator_fee_raw: std::option::Option, + /// Optional creator-fee side flag reported by newer layouts. + pub creator_fee_on_input: std::option::Option, + /// Explicitly prevents this audit event from becoming a trade. + pub trade_candidate: bool, + /// Explicitly prevents this audit event from becoming a candle. + pub candle_candidate: bool, + /// Reason this event is decoded but not materialized as a trade. + pub skip_trade_reason: std::string::String, + /// Reason this event is decoded but not materialized as a candle. + pub skip_candle_reason: std::string::String, +} + impl RaydiumCpmmDecodedEvent { /// Returns the storage event kind. pub fn event_kind(&self) -> &'static str { match self { RaydiumCpmmDecodedEvent::SwapBaseInput(_) => return "raydium_cpmm.swap_base_input", RaydiumCpmmDecodedEvent::SwapBaseOutput(_) => return "raydium_cpmm.swap_base_output", + RaydiumCpmmDecodedEvent::Initialize(_) => return "raydium_cpmm.initialize", + RaydiumCpmmDecodedEvent::InitializeWithPermission(_) => { + return "raydium_cpmm.initialize_with_permission"; + }, + RaydiumCpmmDecodedEvent::Deposit(_) => return "raydium_cpmm.deposit", + RaydiumCpmmDecodedEvent::Withdraw(_) => return "raydium_cpmm.withdraw", + RaydiumCpmmDecodedEvent::FeeCollection(event) => { + match event.instruction_name.as_str() { + "raydium_cpmm.collect_creator_fee" => return "raydium_cpmm.collect_creator_fee", + "raydium_cpmm.collect_fund_fee" => return "raydium_cpmm.collect_fund_fee", + _ => return "raydium_cpmm.collect_protocol_fee", + } + }, + RaydiumCpmmDecodedEvent::PoolAdmin(event) => match event.instruction_name.as_str() { + "raydium_cpmm.close_permission_pda" => return "raydium_cpmm.close_permission_pda", + "raydium_cpmm.create_permission_pda" => return "raydium_cpmm.create_permission_pda", + "raydium_cpmm.update_amm_config" => return "raydium_cpmm.update_amm_config", + "raydium_cpmm.update_pool_status" => return "raydium_cpmm.update_pool_status", + _ => return "raydium_cpmm.create_amm_config", + }, + RaydiumCpmmDecodedEvent::LpChangeEvent(_) => return "raydium_cpmm.lp_change_event", + RaydiumCpmmDecodedEvent::SwapEvent(_) => return "raydium_cpmm.swap_event", } } - /// Returns the pool account. - pub fn pool_account(&self) -> &str { + /// Returns the pool account when one is decoded. + pub fn pool_account(&self) -> std::option::Option<&str> { match self { - RaydiumCpmmDecodedEvent::SwapBaseInput(event) => return event.pool_state.as_str(), - RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => return event.pool_state.as_str(), + RaydiumCpmmDecodedEvent::SwapBaseInput(event) => { + return Some(event.pool_state.as_str()); + }, + RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => { + return Some(event.pool_state.as_str()); + }, + RaydiumCpmmDecodedEvent::Initialize(event) => return Some(event.pool_state.as_str()), + RaydiumCpmmDecodedEvent::InitializeWithPermission(event) => { + return Some(event.pool_state.as_str()); + }, + RaydiumCpmmDecodedEvent::Deposit(event) => return Some(event.pool_state.as_str()), + RaydiumCpmmDecodedEvent::Withdraw(event) => return Some(event.pool_state.as_str()), + RaydiumCpmmDecodedEvent::FeeCollection(event) => { + return Some(event.pool_state.as_str()); + }, + RaydiumCpmmDecodedEvent::PoolAdmin(event) => return event.pool_state.as_deref(), + RaydiumCpmmDecodedEvent::LpChangeEvent(event) => return Some(event.pool_id.as_str()), + RaydiumCpmmDecodedEvent::SwapEvent(event) => return Some(event.pool_id.as_str()), } } - /// Returns the normalized base mint. - pub fn base_mint(&self) -> &str { + /// Returns the normalized base mint when one is decoded. + pub fn base_mint(&self) -> std::option::Option<&str> { match self { - RaydiumCpmmDecodedEvent::SwapBaseInput(event) => return event.base_mint.as_str(), - RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => return event.base_mint.as_str(), + RaydiumCpmmDecodedEvent::SwapBaseInput(event) => return Some(event.base_mint.as_str()), + RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => { + return Some(event.base_mint.as_str()); + }, + RaydiumCpmmDecodedEvent::Initialize(event) => return Some(event.base_mint.as_str()), + RaydiumCpmmDecodedEvent::InitializeWithPermission(event) => { + return Some(event.base_mint.as_str()); + }, + RaydiumCpmmDecodedEvent::Deposit(event) => return Some(event.base_mint.as_str()), + RaydiumCpmmDecodedEvent::Withdraw(event) => return Some(event.base_mint.as_str()), + RaydiumCpmmDecodedEvent::FeeCollection(event) => return event.base_mint.as_deref(), + RaydiumCpmmDecodedEvent::PoolAdmin(_) => return None, + RaydiumCpmmDecodedEvent::LpChangeEvent(_) => return None, + RaydiumCpmmDecodedEvent::SwapEvent(event) => return event.base_mint.as_deref(), } } - /// Returns the normalized quote mint. - pub fn quote_mint(&self) -> &str { + /// Returns the normalized quote mint when one is decoded. + pub fn quote_mint(&self) -> std::option::Option<&str> { match self { - RaydiumCpmmDecodedEvent::SwapBaseInput(event) => return event.quote_mint.as_str(), - RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => return event.quote_mint.as_str(), + RaydiumCpmmDecodedEvent::SwapBaseInput(event) => { + return Some(event.quote_mint.as_str()); + }, + RaydiumCpmmDecodedEvent::SwapBaseOutput(event) => { + return Some(event.quote_mint.as_str()); + }, + RaydiumCpmmDecodedEvent::Initialize(event) => return Some(event.quote_mint.as_str()), + RaydiumCpmmDecodedEvent::InitializeWithPermission(event) => { + return Some(event.quote_mint.as_str()); + }, + RaydiumCpmmDecodedEvent::Deposit(event) => return Some(event.quote_mint.as_str()), + RaydiumCpmmDecodedEvent::Withdraw(event) => return Some(event.quote_mint.as_str()), + RaydiumCpmmDecodedEvent::FeeCollection(event) => return event.quote_mint.as_deref(), + RaydiumCpmmDecodedEvent::PoolAdmin(_) => return None, + RaydiumCpmmDecodedEvent::LpChangeEvent(_) => return None, + RaydiumCpmmDecodedEvent::SwapEvent(event) => return event.quote_mint.as_deref(), + } + } + + /// Returns the LP mint when one is decoded. + pub fn lp_mint(&self) -> std::option::Option<&str> { + match self { + RaydiumCpmmDecodedEvent::Initialize(event) => return event.lp_mint.as_deref(), + RaydiumCpmmDecodedEvent::InitializeWithPermission(event) => { + return event.lp_mint.as_deref(); + }, + RaydiumCpmmDecodedEvent::Deposit(event) => return event.lp_mint.as_deref(), + RaydiumCpmmDecodedEvent::Withdraw(event) => return event.lp_mint.as_deref(), + _ => return None, } } @@ -132,6 +452,62 @@ impl RaydiumCpmmDecodedEvent { Err(_) => return None, } }, + crate::RaydiumCpmmDecodedEvent::Initialize(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::InitializeWithPermission(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::Deposit(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::Withdraw(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::FeeCollection(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::PoolAdmin(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::LpChangeEvent(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, + crate::RaydiumCpmmDecodedEvent::SwapEvent(event) => { + let result = serde_json::to_string(event); + match result { + Ok(payload) => return Some(payload), + Err(_) => return None, + } + }, } } } @@ -153,10 +529,20 @@ pub fn decode_raydium_cpmm_instruction( Ok(data) => data, Err(_) => return std::vec::Vec::new(), }; - if data.len() < 24 { + if data.len() < 8 { return std::vec::Vec::new(); } let discriminator = [data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]]; + if discriminator == RAYDIUM_CPMM_ANCHOR_SELF_CPI_LOG_SELECTOR { + let decoded_anchor_event = decode_raydium_cpmm_anchor_cpi_event(data.as_slice()); + match decoded_anchor_event { + Some(decoded_anchor_event) => return vec![decoded_anchor_event], + None => return std::vec::Vec::new(), + } + } + if data.len() < 24 { + return std::vec::Vec::new(); + } if discriminator == RAYDIUM_CPMM_SWAP_BASE_INPUT_DISCRIMINATOR { let amount_in = match read_u64_le(data.as_slice(), 8) { Some(value) => value, @@ -201,9 +587,540 @@ pub fn decode_raydium_cpmm_instruction( }; return vec![RaydiumCpmmDecodedEvent::SwapBaseOutput(swap)]; } + if discriminator == RAYDIUM_CPMM_DEPOSIT_DISCRIMINATOR { + let event = match build_raydium_cpmm_liquidity( + "raydium_cpmm.deposit", + "add", + accounts.as_slice(), + data.as_slice(), + ) { + Some(event) => event, + None => return std::vec::Vec::new(), + }; + return vec![RaydiumCpmmDecodedEvent::Deposit(event)]; + } + if discriminator == RAYDIUM_CPMM_WITHDRAW_DISCRIMINATOR { + let event = match build_raydium_cpmm_liquidity( + "raydium_cpmm.withdraw", + "remove", + accounts.as_slice(), + data.as_slice(), + ) { + Some(event) => event, + None => return std::vec::Vec::new(), + }; + return vec![RaydiumCpmmDecodedEvent::Withdraw(event)]; + } + if discriminator == RAYDIUM_CPMM_INITIALIZE_DISCRIMINATOR { + let event = match build_raydium_cpmm_initialize( + "raydium_cpmm.initialize", + accounts.as_slice(), + data.as_slice(), + false, + ) { + Some(event) => event, + None => return std::vec::Vec::new(), + }; + return vec![RaydiumCpmmDecodedEvent::Initialize(event)]; + } + if discriminator == RAYDIUM_CPMM_INITIALIZE_WITH_PERMISSION_DISCRIMINATOR { + let event = match build_raydium_cpmm_initialize( + "raydium_cpmm.initialize_with_permission", + accounts.as_slice(), + data.as_slice(), + true, + ) { + Some(event) => event, + None => return std::vec::Vec::new(), + }; + return vec![RaydiumCpmmDecodedEvent::InitializeWithPermission(event)]; + } + if discriminator == RAYDIUM_CPMM_COLLECT_CREATOR_FEE_DISCRIMINATOR { + return build_raydium_cpmm_fee_or_admin_event( + "raydium_cpmm.collect_creator_fee", + "creator", + accounts.as_slice(), + data.as_slice(), + ); + } + if discriminator == RAYDIUM_CPMM_COLLECT_FUND_FEE_DISCRIMINATOR { + return build_raydium_cpmm_fee_or_admin_event( + "raydium_cpmm.collect_fund_fee", + "fund", + accounts.as_slice(), + data.as_slice(), + ); + } + if discriminator == RAYDIUM_CPMM_COLLECT_PROTOCOL_FEE_DISCRIMINATOR { + return build_raydium_cpmm_fee_or_admin_event( + "raydium_cpmm.collect_protocol_fee", + "protocol", + accounts.as_slice(), + data.as_slice(), + ); + } + if discriminator == RAYDIUM_CPMM_CREATE_AMM_CONFIG_DISCRIMINATOR { + return vec![RaydiumCpmmDecodedEvent::PoolAdmin(build_raydium_cpmm_admin( + "raydium_cpmm.create_amm_config", + "create_amm_config", + accounts.as_slice(), + data.as_slice(), + None, + ))]; + } + if discriminator == RAYDIUM_CPMM_CREATE_PERMISSION_PDA_DISCRIMINATOR { + return vec![RaydiumCpmmDecodedEvent::PoolAdmin(build_raydium_cpmm_admin( + "raydium_cpmm.create_permission_pda", + "create_permission_pda", + accounts.as_slice(), + data.as_slice(), + None, + ))]; + } + if discriminator == RAYDIUM_CPMM_CLOSE_PERMISSION_PDA_DISCRIMINATOR { + return vec![RaydiumCpmmDecodedEvent::PoolAdmin(build_raydium_cpmm_admin( + "raydium_cpmm.close_permission_pda", + "close_permission_pda", + accounts.as_slice(), + data.as_slice(), + None, + ))]; + } + if discriminator == RAYDIUM_CPMM_UPDATE_AMM_CONFIG_DISCRIMINATOR { + return vec![RaydiumCpmmDecodedEvent::PoolAdmin(build_raydium_cpmm_admin( + "raydium_cpmm.update_amm_config", + "update_amm_config", + accounts.as_slice(), + data.as_slice(), + None, + ))]; + } + if discriminator == RAYDIUM_CPMM_UPDATE_POOL_STATUS_DISCRIMINATOR { + let pool_state = account_at(accounts.as_slice(), 1); + return vec![RaydiumCpmmDecodedEvent::PoolAdmin(build_raydium_cpmm_admin( + "raydium_cpmm.update_pool_status", + "update_pool_status", + accounts.as_slice(), + data.as_slice(), + pool_state, + ))]; + } return std::vec::Vec::new(); } +/// Classifies one projected Raydium CPMM instruction data payload. +pub fn classify_raydium_cpmm_instruction_data( + data_json: &str, +) -> std::option::Option<&'static str> { + let data_base58 = match parse_data_json_as_base58(data_json) { + Some(data_base58) => data_base58, + None => return None, + }; + let data = match bs58::decode(data_base58.as_str()).into_vec() { + Ok(data) => data, + Err(_) => return None, + }; + if data.len() < 8 { + return None; + } + let discriminator = [data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]]; + if discriminator == RAYDIUM_CPMM_SWAP_BASE_INPUT_DISCRIMINATOR { + return Some("swap_base_input"); + } + if discriminator == RAYDIUM_CPMM_SWAP_BASE_OUTPUT_DISCRIMINATOR { + return Some("swap_base_output"); + } + if discriminator == RAYDIUM_CPMM_CLOSE_PERMISSION_PDA_DISCRIMINATOR { + return Some("close_permission_pda"); + } + if discriminator == RAYDIUM_CPMM_COLLECT_CREATOR_FEE_DISCRIMINATOR { + return Some("collect_creator_fee"); + } + if discriminator == RAYDIUM_CPMM_COLLECT_FUND_FEE_DISCRIMINATOR { + return Some("collect_fund_fee"); + } + if discriminator == RAYDIUM_CPMM_COLLECT_PROTOCOL_FEE_DISCRIMINATOR { + return Some("collect_protocol_fee"); + } + if discriminator == RAYDIUM_CPMM_CREATE_AMM_CONFIG_DISCRIMINATOR { + return Some("create_amm_config"); + } + if discriminator == RAYDIUM_CPMM_CREATE_PERMISSION_PDA_DISCRIMINATOR { + return Some("create_permission_pda"); + } + if discriminator == RAYDIUM_CPMM_DEPOSIT_DISCRIMINATOR { + return Some("deposit"); + } + if discriminator == RAYDIUM_CPMM_WITHDRAW_DISCRIMINATOR { + return Some("withdraw"); + } + if discriminator == RAYDIUM_CPMM_INITIALIZE_DISCRIMINATOR { + return Some("initialize"); + } + if discriminator == RAYDIUM_CPMM_INITIALIZE_WITH_PERMISSION_DISCRIMINATOR { + return Some("initialize_with_permission"); + } + if discriminator == RAYDIUM_CPMM_UPDATE_AMM_CONFIG_DISCRIMINATOR { + return Some("update_amm_config"); + } + if discriminator == RAYDIUM_CPMM_UPDATE_POOL_STATUS_DISCRIMINATOR { + return Some("update_pool_status"); + } + return None; +} + +/// Decodes Raydium CPMM Anchor events emitted in `Program data:` logs. +pub fn decode_raydium_cpmm_program_data_event( + data_base64: &str, +) -> std::option::Option { + let decoded = decode_base64_standard(data_base64); + let data = match decoded { + Some(data) => data, + None => return None, + }; + return decode_raydium_cpmm_event_data(data.as_slice()); +} + +fn decode_raydium_cpmm_anchor_cpi_event( + data: &[u8], +) -> std::option::Option { + if data.len() < 16 { + return None; + } + let discriminator = [data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]]; + if discriminator != RAYDIUM_CPMM_ANCHOR_SELF_CPI_LOG_SELECTOR { + return None; + } + return decode_raydium_cpmm_event_data(&data[8..]); +} + +fn decode_raydium_cpmm_event_data(data: &[u8]) -> std::option::Option { + if data.len() < 8 { + return None; + } + let event_discriminator = + [data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]]; + if event_discriminator == RAYDIUM_CPMM_LP_CHANGE_EVENT_DISCRIMINATOR { + let event = decode_raydium_cpmm_lp_change_event(data); + match event { + Some(event) => return Some(RaydiumCpmmDecodedEvent::LpChangeEvent(event)), + None => return None, + } + } + if event_discriminator == RAYDIUM_CPMM_SWAP_EVENT_DISCRIMINATOR { + let event = decode_raydium_cpmm_swap_event(data); + match event { + Some(event) => return Some(RaydiumCpmmDecodedEvent::SwapEvent(event)), + None => return None, + } + } + return None; +} + +fn decode_raydium_cpmm_lp_change_event( + data: &[u8], +) -> std::option::Option { + if data.len() < 97 { + return None; + } + let pool_id = match read_pubkey_base58(data, 8) { + Some(value) => value, + None => return None, + }; + let lp_amount_before = match read_u64_le(data, 40) { + Some(value) => value, + None => return None, + }; + let token_0_vault_before = match read_u64_le(data, 48) { + Some(value) => value, + None => return None, + }; + let token_1_vault_before = match read_u64_le(data, 56) { + Some(value) => value, + None => return None, + }; + let token_0_amount = match read_u64_le(data, 64) { + Some(value) => value, + None => return None, + }; + let token_1_amount = match read_u64_le(data, 72) { + Some(value) => value, + None => return None, + }; + let token_0_transfer_fee = match read_u64_le(data, 80) { + Some(value) => value, + None => return None, + }; + let token_1_transfer_fee = match read_u64_le(data, 88) { + Some(value) => value, + None => return None, + }; + return Some(RaydiumCpmmLpChangeEventDecoded { + pool_id, + lp_amount_before_raw: lp_amount_before.to_string(), + token_0_vault_before_raw: token_0_vault_before.to_string(), + token_1_vault_before_raw: token_1_vault_before.to_string(), + token_0_amount_raw: token_0_amount.to_string(), + token_1_amount_raw: token_1_amount.to_string(), + token_0_transfer_fee_raw: token_0_transfer_fee.to_string(), + token_1_transfer_fee_raw: token_1_transfer_fee.to_string(), + change_type: data[96], + }); +} + +fn decode_raydium_cpmm_swap_event(data: &[u8]) -> std::option::Option { + if data.len() < 89 { + return None; + } + let pool_id = match read_pubkey_base58(data, 8) { + Some(value) => value, + None => return None, + }; + let input_vault_before = match read_u64_le(data, 40) { + Some(value) => value, + None => return None, + }; + let output_vault_before = match read_u64_le(data, 48) { + Some(value) => value, + None => return None, + }; + let input_amount = match read_u64_le(data, 56) { + Some(value) => value, + None => return None, + }; + let output_amount = match read_u64_le(data, 64) { + Some(value) => value, + None => return None, + }; + let input_transfer_fee = match read_u64_le(data, 72) { + Some(value) => value, + None => return None, + }; + let output_transfer_fee = match read_u64_le(data, 80) { + Some(value) => value, + None => return None, + }; + let base_input = data[88] != 0; + let input_mint = read_pubkey_base58(data, 89); + let output_mint = read_pubkey_base58(data, 121); + let (base_mint, quote_mint) = + normalize_optional_raydium_cpmm_mints(input_mint.as_deref(), output_mint.as_deref()); + let trade_fee_raw = match read_u64_le(data, 153) { + Some(value) => Some(value.to_string()), + None => None, + }; + let creator_fee_raw = match read_u64_le(data, 161) { + Some(value) => Some(value.to_string()), + None => None, + }; + let creator_fee_on_input = if data.len() > 169 { Some(data[169] != 0) } else { None }; + return Some(RaydiumCpmmSwapEventDecoded { + pool_id, + input_vault_before_raw: input_vault_before.to_string(), + output_vault_before_raw: output_vault_before.to_string(), + input_amount_raw: input_amount.to_string(), + output_amount_raw: output_amount.to_string(), + input_transfer_fee_raw: input_transfer_fee.to_string(), + output_transfer_fee_raw: output_transfer_fee.to_string(), + base_input, + input_mint, + output_mint, + base_mint, + quote_mint, + trade_fee_raw, + creator_fee_raw, + creator_fee_on_input, + trade_candidate: false, + candle_candidate: false, + skip_trade_reason: "raydium_cpmm_anchor_swap_event_audit_only".to_string(), + skip_candle_reason: "raydium_cpmm_anchor_swap_event_audit_only".to_string(), + }); +} + +fn normalize_optional_raydium_cpmm_mints( + input_mint: std::option::Option<&str>, + output_mint: std::option::Option<&str>, +) -> ( + std::option::Option, + std::option::Option, +) { + let input_mint = match input_mint { + Some(input_mint) => input_mint, + None => return (None, None), + }; + let output_mint = match output_mint { + Some(output_mint) => output_mint, + None => return (None, None), + }; + let normalized = normalize_raydium_cpmm_pair(input_mint, output_mint, "", ""); + return (Some(normalized.base_mint), Some(normalized.quote_mint)); +} + +fn build_raydium_cpmm_initialize( + instruction_name: &str, + accounts: &[std::string::String], + data: &[u8], + with_permission: bool, +) -> std::option::Option { + let pool_index = if with_permission { 4usize } else { 3usize }; + let mint_0_index = if with_permission { 5usize } else { 4usize }; + let mint_1_index = if with_permission { 6usize } else { 5usize }; + let pool_state = match account_at(accounts, pool_index) { + Some(pool_state) => pool_state, + None => return None, + }; + let token_0_mint = match account_at(accounts, mint_0_index) { + Some(token_0_mint) => token_0_mint, + None => return None, + }; + let token_1_mint = match account_at(accounts, mint_1_index) { + Some(token_1_mint) => token_1_mint, + None => return None, + }; + let (base_mint, quote_mint) = + normalize_raydium_cpmm_mints(token_0_mint.as_str(), token_1_mint.as_str()); + return Some(RaydiumCpmmPoolInitializeDecoded { + instruction_name: instruction_name.to_string(), + creator: account_at(accounts, 0), + amm_config: account_at(accounts, 1), + pool_state, + token_0_mint, + token_1_mint, + lp_mint: account_at(accounts, if with_permission { 7usize } else { 6usize }), + base_mint, + quote_mint, + init_amount_0_raw: read_u64_le(data, 8).map(|value| return value.to_string()), + init_amount_1_raw: read_u64_le(data, 16).map(|value| return value.to_string()), + open_time_raw: read_u64_le(data, 24).map(|value| return value.to_string()), + }); +} + +fn build_raydium_cpmm_liquidity( + instruction_name: &str, + direction: &str, + accounts: &[std::string::String], + data: &[u8], +) -> std::option::Option { + let pool_state = match account_at(accounts, 2) { + Some(pool_state) => pool_state, + None => return None, + }; + let token_0_mint = match account_at(accounts, 10) { + Some(token_0_mint) => token_0_mint, + None => return None, + }; + let token_1_mint = match account_at(accounts, 11) { + Some(token_1_mint) => token_1_mint, + None => return None, + }; + let (base_mint, quote_mint) = + normalize_raydium_cpmm_mints(token_0_mint.as_str(), token_1_mint.as_str()); + let lp_amount = match read_u64_le(data, 8) { + Some(lp_amount) => lp_amount, + None => return None, + }; + let token_0_amount = match read_u64_le(data, 16) { + Some(token_0_amount) => token_0_amount, + None => return None, + }; + let token_1_amount = match read_u64_le(data, 24) { + Some(token_1_amount) => token_1_amount, + None => return None, + }; + let (base_amount, quote_amount) = + map_token_0_1_amounts_to_base_quote(token_0_mint.as_str(), token_0_amount, token_1_amount); + let amount_semantics = if direction == "add" { + "lp_fixed_max_token_amounts".to_string() + } else { + "lp_fixed_min_token_amounts".to_string() + }; + return Some(RaydiumCpmmLiquidityDecoded { + instruction_name: instruction_name.to_string(), + liquidity_direction: direction.to_string(), + owner: account_at(accounts, 0), + pool_state, + token_0_mint, + token_1_mint, + lp_mint: account_at(accounts, 4), + base_mint, + quote_mint, + token_0_amount_raw: token_0_amount.to_string(), + token_1_amount_raw: token_1_amount.to_string(), + base_amount_raw: base_amount.to_string(), + quote_amount_raw: quote_amount.to_string(), + lp_amount_raw: lp_amount.to_string(), + amount_semantics, + }); +} + +fn build_raydium_cpmm_fee_or_admin_event( + instruction_name: &str, + fee_scope: &str, + accounts: &[std::string::String], + data: &[u8], +) -> std::vec::Vec { + let pool_state = match account_at(accounts, 2) { + Some(pool_state) => pool_state, + None => return std::vec::Vec::new(), + }; + let token_0_mint = account_at(accounts, 6); + let token_1_mint = account_at(accounts, 7); + let (base_mint, quote_mint) = match (token_0_mint.as_deref(), token_1_mint.as_deref()) { + (Some(token_0_mint), Some(token_1_mint)) => { + let (base_mint, quote_mint) = normalize_raydium_cpmm_mints(token_0_mint, token_1_mint); + (Some(base_mint), Some(quote_mint)) + }, + _ => (None, None), + }; + let _ = data; + return vec![RaydiumCpmmDecodedEvent::FeeCollection(RaydiumCpmmFeeCollectionDecoded { + instruction_name: instruction_name.to_string(), + pool_state, + token_0_mint, + token_1_mint, + base_mint, + quote_mint, + fee_scope: fee_scope.to_string(), + actor_wallet: account_at(accounts, 0), + })]; +} + +fn build_raydium_cpmm_admin( + instruction_name: &str, + admin_action: &str, + accounts: &[std::string::String], + data: &[u8], + pool_state: std::option::Option, +) -> RaydiumCpmmPoolAdminDecoded { + return RaydiumCpmmPoolAdminDecoded { + instruction_name: instruction_name.to_string(), + pool_state, + config_or_permission_account: account_at(accounts, 0), + actor_wallet: account_at(accounts, 1), + admin_action: admin_action.to_string(), + first_u8_arg: data.get(8).copied(), + first_u64_arg_raw: read_u64_le(data, 8).map(|value| return value.to_string()), + }; +} + +fn account_at( + accounts: &[std::string::String], + index: usize, +) -> std::option::Option { + return accounts.get(index).cloned(); +} + +fn map_token_0_1_amounts_to_base_quote( + token_0_mint: &str, + token_0_amount: u64, + token_1_amount: u64, +) -> (u64, u64) { + if token_0_mint == crate::WSOL_MINT_ID { + return (token_1_amount, token_0_amount); + } + return (token_0_amount, token_1_amount); +} + fn build_raydium_cpmm_swap( swap_mode: RaydiumCpmmSwapMode, accounts: &[std::string::String], @@ -255,6 +1172,15 @@ fn build_raydium_cpmm_swap( }); } + +fn normalize_raydium_cpmm_mints( + mint_a: &str, + mint_b: &str, +) -> (std::string::String, std::string::String) { + let normalized = normalize_raydium_cpmm_pair(mint_a, mint_b, "", ""); + return (normalized.base_mint, normalized.quote_mint); +} + struct RaydiumCpmmNormalizedPair { base_mint: std::string::String, quote_mint: std::string::String, @@ -321,6 +1247,15 @@ fn is_quote_mint(mint: &str) -> bool { return false; } +fn decode_base64_standard(encoded: &str) -> std::option::Option> { + use base64::Engine as _; + let decoded = base64::engine::general_purpose::STANDARD.decode(encoded.as_bytes()); + match decoded { + Ok(decoded) => return Some(decoded), + Err(_) => return None, + } +} + fn parse_accounts_json( accounts_json: &str, ) -> std::option::Option> { @@ -336,6 +1271,20 @@ fn parse_data_json_as_base58(data_json: &str) -> std::option::Option>(data_json); + if let Ok(values) = json_array_result { + if values.is_empty() { + return None; + } + if values.len() > 1 && values[1].as_str() != "base58" { + return None; + } + let value = values[0].trim(); + if value.is_empty() { + return None; + } + return Some(value.to_string()); + } let trimmed = data_json.trim(); if trimmed.is_empty() { return None; @@ -347,6 +1296,13 @@ fn parse_data_json_as_base58(data_json: &str) -> std::option::Option std::option::Option { + if data.len() < offset + 32 { + return None; + } + return Some(bs58::encode(&data[offset..offset + 32]).into_string()); +} + fn read_u64_le(data: &[u8], offset: usize) -> std::option::Option { if data.len() < offset + 8 { return None; @@ -366,6 +1322,8 @@ fn read_u64_le(data: &[u8], offset: usize) -> std::option::Option { #[cfg(test)] mod tests { + use super::*; + #[test] fn decodes_swap_base_input() { let accounts_json = r#"[ @@ -440,4 +1398,62 @@ mod tests { }, } } + + #[test] + fn decodes_program_data_swap_event_without_anchor_selector() { + let event = crate::decode_raydium_cpmm_program_data_event( + "QMbN6CYIceJO6v1PBzcyVgs32NvLbZWxigBNEVRxobydBucKB/GSLp1C5V0EAAAA064SWHVOCABn8Q8AAAAAAMCRyD8eAAAAAAAAAAAAAAAAAAAAAAAAAAAGm4hX/quBhPtof2NGGMA12sQ53BrrO1WYoPAAAAAAAcuxLv4dE0rdpr3axeHcFej4SEyTWeVah03mTAU4++RUNQoAAAAAAAAAAAAAAAAAAAE=", + ); + match event { + Some(crate::RaydiumCpmmDecodedEvent::SwapEvent(decoded)) => { + assert_eq!(decoded.pool_id, "6K4dKwMvbzZWH5N8kU11DVM2Yj28j3Uask1kVcskBWyj"); + assert_eq!(decoded.input_amount_raw, "1044839"); + assert_eq!(decoded.output_amount_raw, "129919128000"); + assert_eq!( + decoded.input_mint, + Some("So11111111111111111111111111111111111111112".to_string()) + ); + assert_eq!( + decoded.output_mint, + Some("Ei8TxDKgP7hAJCLmDCtJMae7W9p1iqk6eK38LYyfuLq9".to_string()) + ); + assert!(!decoded.trade_candidate); + assert!(!decoded.candle_candidate); + }, + _ => panic!("expected swap event"), + } + } + + #[test] + fn classifies_all_known_cpmm_instruction_data() { + let fixtures = [ + (RAYDIUM_CPMM_SWAP_BASE_INPUT_DISCRIMINATOR, "swap_base_input"), + (RAYDIUM_CPMM_SWAP_BASE_OUTPUT_DISCRIMINATOR, "swap_base_output"), + (RAYDIUM_CPMM_CLOSE_PERMISSION_PDA_DISCRIMINATOR, "close_permission_pda"), + (RAYDIUM_CPMM_COLLECT_CREATOR_FEE_DISCRIMINATOR, "collect_creator_fee"), + (RAYDIUM_CPMM_COLLECT_FUND_FEE_DISCRIMINATOR, "collect_fund_fee"), + (RAYDIUM_CPMM_COLLECT_PROTOCOL_FEE_DISCRIMINATOR, "collect_protocol_fee"), + (RAYDIUM_CPMM_CREATE_AMM_CONFIG_DISCRIMINATOR, "create_amm_config"), + (RAYDIUM_CPMM_CREATE_PERMISSION_PDA_DISCRIMINATOR, "create_permission_pda"), + (RAYDIUM_CPMM_DEPOSIT_DISCRIMINATOR, "deposit"), + (RAYDIUM_CPMM_WITHDRAW_DISCRIMINATOR, "withdraw"), + (RAYDIUM_CPMM_INITIALIZE_DISCRIMINATOR, "initialize"), + ( + RAYDIUM_CPMM_INITIALIZE_WITH_PERMISSION_DISCRIMINATOR, + "initialize_with_permission", + ), + (RAYDIUM_CPMM_UPDATE_AMM_CONFIG_DISCRIMINATOR, "update_amm_config"), + (RAYDIUM_CPMM_UPDATE_POOL_STATUS_DISCRIMINATOR, "update_pool_status"), + ]; + for (discriminator, expected) in fixtures { + let mut data = std::vec::Vec::from(discriminator); + data.extend_from_slice(&[0_u8; 24]); + let encoded = bs58::encode(data).into_string(); + let data_json = serde_json::json!([encoded, "base58"]).to_string(); + assert_eq!( + crate::classify_raydium_cpmm_instruction_data(data_json.as_str()), + Some(expected) + ); + } + } } diff --git a/kb_lib/src/dex_decode.rs b/kb_lib/src/dex_decode.rs index 970cfb9..14ccc92 100644 --- a/kb_lib/src/dex_decode.rs +++ b/kb_lib/src/dex_decode.rs @@ -1012,11 +1012,11 @@ impl DexDecodeService { "raydium_cpmm", crate::RAYDIUM_CPMM_PROGRAM_ID.to_string(), event_kind.as_str(), - Some(decoded_event.pool_account().to_string()), - None, - Some(decoded_event.base_mint().to_string()), - Some(decoded_event.quote_mint().to_string()), + decoded_event.pool_account().map(|value| return value.to_string()), None, + decoded_event.base_mint().map(|value| return value.to_string()), + decoded_event.quote_mint().map(|value| return value.to_string()), + decoded_event.lp_mint().map(|value| return value.to_string()), payload_value, ) .await; @@ -1174,6 +1174,7 @@ impl DexDecodeService { instructions: &[crate::ChainInstructionDto], ) -> Result, crate::Error> { let mut persisted = std::vec::Vec::new(); + let mut program_data_events = collect_raydium_cpmm_program_data_events(transaction); for instruction in instructions { let program_id = match instruction.program_id.as_ref() { Some(program_id) => program_id, @@ -1186,6 +1187,8 @@ impl DexDecodeService { Some(data_json) => data_json, None => continue, }; + let instruction_kind = + crate::classify_raydium_cpmm_instruction_data(data_json.as_str()); let decoded_events = crate::decode_raydium_cpmm_instruction( instruction.accounts_json.as_str(), data_json.as_str(), @@ -1199,6 +1202,18 @@ impl DexDecodeService { }; persisted.push(persisted_event); } + let program_data_persist_result = persist_matching_raydium_cpmm_program_data_event( + self, + transaction, + instruction, + instruction_kind, + &mut program_data_events, + &mut persisted, + ) + .await; + if let Err(error) = program_data_persist_result { + return Err(error); + } } return Ok(persisted); } @@ -1808,6 +1823,11 @@ struct RaydiumMappedNonTradeInstructionSpec { enum RaydiumMappedNonTradeAmountLayout { None, ClmmLiquidityV2, + CpmmAmmConfig, + CpmmDeposit, + CpmmFeePair, + CpmmInitialize, + CpmmPoolStatus, CpmmWithdraw, } @@ -1894,26 +1914,81 @@ fn raydium_mapped_non_trade_instruction_spec( } } if protocol_name == "raydium_cpmm" { - if discriminator_hex == "1416567bc61cdb84" && account_count >= 14 { + if discriminator_hex == "9c5420764587467b" && account_count >= 4 { return Some(RaydiumMappedNonTradeInstructionSpec { - instruction_name: "collect_creator_fee", - event_kind: "raydium_cpmm.collect_creator_fee", - pool_account_index: Some(3), + instruction_name: "close_permission_pda", + event_kind: "raydium_cpmm.close_permission_pda", + pool_account_index: None, token_a_mint_index: None, token_b_mint_index: None, lp_mint_index: None, amount_layout: RaydiumMappedNonTradeAmountLayout::None, }); } - if discriminator_hex == "b712469c946da122" && account_count >= 14 { + if discriminator_hex == "1416567bc61cdb84" && account_count >= 13 { return Some(RaydiumMappedNonTradeInstructionSpec { - instruction_name: "withdraw", - event_kind: "raydium_cpmm.withdraw", - pool_account_index: Some(3), + instruction_name: "collect_creator_fee", + event_kind: "raydium_cpmm.collect_creator_fee", + pool_account_index: Some(2), + token_a_mint_index: Some(6), + token_b_mint_index: Some(7), + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::None, + }); + } + if discriminator_hex == "a78a4e95dfc2067e" && account_count >= 12 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "collect_fund_fee", + event_kind: "raydium_cpmm.collect_fund_fee", + pool_account_index: Some(2), + token_a_mint_index: Some(6), + token_b_mint_index: Some(7), + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmFeePair, + }); + } + if discriminator_hex == "8888fcddc2427e59" && account_count >= 12 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "collect_protocol_fee", + event_kind: "raydium_cpmm.collect_protocol_fee", + pool_account_index: Some(2), + token_a_mint_index: Some(6), + token_b_mint_index: Some(7), + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmFeePair, + }); + } + if discriminator_hex == "8934edd4d7756c68" && account_count >= 3 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "create_amm_config", + event_kind: "raydium_cpmm.create_amm_config", + pool_account_index: None, token_a_mint_index: None, token_b_mint_index: None, lp_mint_index: None, - amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmWithdraw, + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmAmmConfig, + }); + } + if discriminator_hex == "878802d889a9b5ca" && account_count >= 4 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "create_permission_pda", + event_kind: "raydium_cpmm.create_permission_pda", + pool_account_index: None, + token_a_mint_index: None, + token_b_mint_index: None, + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::None, + }); + } + if discriminator_hex == "f223c68952e1f2b6" && account_count >= 13 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "deposit", + event_kind: "raydium_cpmm.deposit", + pool_account_index: Some(2), + token_a_mint_index: Some(10), + token_b_mint_index: Some(11), + lp_mint_index: Some(12), + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmDeposit, }); } if discriminator_hex == "afaf6d1f0d989bed" && account_count >= 20 { @@ -1923,8 +1998,52 @@ fn raydium_mapped_non_trade_instruction_spec( pool_account_index: Some(3), token_a_mint_index: Some(4), token_b_mint_index: Some(5), - lp_mint_index: Some(13), - amount_layout: RaydiumMappedNonTradeAmountLayout::None, + lp_mint_index: Some(6), + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmInitialize, + }); + } + if discriminator_hex == "3f37fe4131b25979" && account_count >= 21 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "initialize_with_permission", + event_kind: "raydium_cpmm.initialize_with_permission", + pool_account_index: Some(4), + token_a_mint_index: Some(5), + token_b_mint_index: Some(6), + lp_mint_index: Some(7), + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmInitialize, + }); + } + if discriminator_hex == "313cae889a1c74c8" && account_count >= 2 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "update_amm_config", + event_kind: "raydium_cpmm.update_amm_config", + pool_account_index: None, + token_a_mint_index: None, + token_b_mint_index: None, + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmAmmConfig, + }); + } + if discriminator_hex == "82576c062ee0757b" && account_count >= 2 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "update_pool_status", + event_kind: "raydium_cpmm.update_pool_status", + pool_account_index: Some(1), + token_a_mint_index: None, + token_b_mint_index: None, + lp_mint_index: None, + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmPoolStatus, + }); + } + if discriminator_hex == "b712469c946da122" && account_count >= 14 { + return Some(RaydiumMappedNonTradeInstructionSpec { + instruction_name: "withdraw", + event_kind: "raydium_cpmm.withdraw", + pool_account_index: Some(2), + token_a_mint_index: Some(10), + token_b_mint_index: Some(11), + lp_mint_index: Some(12), + amount_layout: RaydiumMappedNonTradeAmountLayout::CpmmWithdraw, }); } } @@ -1979,6 +2098,15 @@ fn enrich_raydium_mapped_non_trade_payload( "instructionName".to_string(), serde_json::Value::String(mapped_spec.instruction_name.to_string()), ); + object.insert( + "upstreamInstructionName".to_string(), + serde_json::Value::String(mapped_spec.instruction_name.to_string()), + ); + object.insert("localSpecializedDecoder".to_string(), serde_json::Value::Bool(true)); + object.insert( + "adminAction".to_string(), + serde_json::Value::String(mapped_spec.instruction_name.to_string()), + ); object.insert("decodedFromAudit".to_string(), serde_json::Value::Bool(true)); object.insert( "auditReason".to_string(), @@ -2032,6 +2160,94 @@ fn insert_raydium_mapped_amounts( ); } }, + RaydiumMappedNonTradeAmountLayout::CpmmAmmConfig => { + if let Some(param) = read_u8_from_bytes(data, 8) { + object.insert( + "configParam".to_string(), + serde_json::Value::Number(serde_json::Number::from(param as u64)), + ); + } + if let Some(value) = read_u64_le_from_bytes(data, 9) { + object.insert( + "configValue".to_string(), + serde_json::Value::String(value.to_string()), + ); + } + }, + RaydiumMappedNonTradeAmountLayout::CpmmDeposit => { + if let Some(lp_amount) = read_u64_le_from_bytes(data, 8) { + object.insert( + "lpAmountRaw".to_string(), + serde_json::Value::String(lp_amount.to_string()), + ); + object.insert( + "liquidity".to_string(), + serde_json::Value::String(lp_amount.to_string()), + ); + } + if let Some(amount_0) = read_u64_le_from_bytes(data, 16) { + object.insert( + "tokenAAmount".to_string(), + serde_json::Value::String(amount_0.to_string()), + ); + } + if let Some(amount_1) = read_u64_le_from_bytes(data, 24) { + object.insert( + "tokenBAmount".to_string(), + serde_json::Value::String(amount_1.to_string()), + ); + } + }, + RaydiumMappedNonTradeAmountLayout::CpmmFeePair => { + if let Some(amount_0) = read_u64_le_from_bytes(data, 8) { + object.insert( + "tokenAAmount".to_string(), + serde_json::Value::String(amount_0.to_string()), + ); + object.insert( + "amount0RequestedRaw".to_string(), + serde_json::Value::String(amount_0.to_string()), + ); + } + if let Some(amount_1) = read_u64_le_from_bytes(data, 16) { + object.insert( + "tokenBAmount".to_string(), + serde_json::Value::String(amount_1.to_string()), + ); + object.insert( + "amount1RequestedRaw".to_string(), + serde_json::Value::String(amount_1.to_string()), + ); + } + }, + RaydiumMappedNonTradeAmountLayout::CpmmInitialize => { + if let Some(amount_0) = read_u64_le_from_bytes(data, 8) { + object.insert( + "tokenAAmount".to_string(), + serde_json::Value::String(amount_0.to_string()), + ); + } + if let Some(amount_1) = read_u64_le_from_bytes(data, 16) { + object.insert( + "tokenBAmount".to_string(), + serde_json::Value::String(amount_1.to_string()), + ); + } + if let Some(open_time) = read_u64_le_from_bytes(data, 24) { + object.insert( + "openTime".to_string(), + serde_json::Value::String(open_time.to_string()), + ); + } + }, + RaydiumMappedNonTradeAmountLayout::CpmmPoolStatus => { + if let Some(status) = read_u8_from_bytes(data, 8) { + object.insert( + "poolStatus".to_string(), + serde_json::Value::Number(serde_json::Number::from(status as u64)), + ); + } + }, RaydiumMappedNonTradeAmountLayout::CpmmWithdraw => { if let Some(lp_amount) = read_u64_le_from_bytes(data, 8) { object.insert( @@ -2073,6 +2289,13 @@ fn instruction_data_bytes_from_base58( } } +fn read_u8_from_bytes(data: &[u8], offset: usize) -> std::option::Option { + if data.len() < offset + 1 { + return None; + } + return Some(data[offset]); +} + fn read_u64_le_from_bytes(data: &[u8], offset: usize) -> std::option::Option { if data.len() < offset + 8 { return None; @@ -2453,6 +2676,150 @@ fn append_persisted_events( } } +#[derive(Clone, Debug)] +struct RaydiumCpmmProgramDataEventCandidate { + decoded_event: crate::RaydiumCpmmDecodedEvent, + consumed: bool, +} + +fn collect_raydium_cpmm_program_data_events( + transaction: &crate::ChainTransactionDto, +) -> std::vec::Vec { + let logs = extract_transaction_log_messages(transaction.transaction_json.as_str()); + let mut events = std::vec::Vec::new(); + let mut cpmm_stack_depth = 0_u32; + for log_message in logs { + if is_program_invoke_log(log_message.as_str(), crate::RAYDIUM_CPMM_PROGRAM_ID) { + cpmm_stack_depth += 1; + continue; + } + if is_program_success_or_failed_log(log_message.as_str(), crate::RAYDIUM_CPMM_PROGRAM_ID) { + cpmm_stack_depth = cpmm_stack_depth.saturating_sub(1); + continue; + } + if cpmm_stack_depth == 0 { + continue; + } + let data_base64 = match log_message.strip_prefix("Program data: ") { + Some(data_base64) => data_base64.trim(), + None => continue, + }; + if data_base64.is_empty() { + continue; + } + let decoded_event = crate::decode_raydium_cpmm_program_data_event(data_base64); + if let Some(decoded_event) = decoded_event { + events.push(RaydiumCpmmProgramDataEventCandidate { decoded_event, consumed: false }); + } + } + return events; +} + +async fn persist_matching_raydium_cpmm_program_data_event( + service: &DexDecodeService, + transaction: &crate::ChainTransactionDto, + instruction: &crate::ChainInstructionDto, + instruction_kind: std::option::Option<&str>, + program_data_events: &mut [RaydiumCpmmProgramDataEventCandidate], + persisted: &mut std::vec::Vec, +) -> Result<(), crate::Error> { + let expected_event_kind = match instruction_kind { + Some("swap_base_input") => Some("swap_event"), + Some("swap_base_output") => Some("swap_event"), + Some("deposit") => Some("lp_change_event"), + Some("withdraw") => Some("lp_change_event"), + _ => None, + }; + let expected_event_kind = match expected_event_kind { + Some(expected_event_kind) => expected_event_kind, + None => return Ok(()), + }; + let mut index = 0_usize; + while index < program_data_events.len() { + if program_data_events[index].consumed { + index += 1; + continue; + } + let event_matches = match (&program_data_events[index].decoded_event, expected_event_kind) { + (crate::RaydiumCpmmDecodedEvent::SwapEvent(_), "swap_event") => true, + (crate::RaydiumCpmmDecodedEvent::LpChangeEvent(_), "lp_change_event") => true, + _ => false, + }; + if !event_matches { + index += 1; + continue; + } + program_data_events[index].consumed = true; + let persist_result = service + .persist_raydium_cpmm_event( + transaction, + instruction, + &program_data_events[index].decoded_event, + ) + .await; + let persisted_event = match persist_result { + Ok(persisted_event) => persisted_event, + Err(error) => return Err(error), + }; + persisted.push(persisted_event); + return Ok(()); + } + return Ok(()); +} + +fn extract_transaction_log_messages(transaction_json: &str) -> std::vec::Vec { + let value_result = serde_json::from_str::(transaction_json); + let value = match value_result { + Ok(value) => value, + Err(_) => return std::vec::Vec::new(), + }; + let meta = match value.get("meta") { + Some(meta) => meta, + None => return std::vec::Vec::new(), + }; + let logs = match meta.get("logMessages") { + Some(logs) => logs, + None => return std::vec::Vec::new(), + }; + let logs = match logs.as_array() { + Some(logs) => logs, + None => return std::vec::Vec::new(), + }; + let mut output = std::vec::Vec::new(); + for log in logs { + if let Some(log) = log.as_str() { + output.push(log.to_string()); + } + } + return output; +} + +fn is_program_invoke_log(log_message: &str, program_id: &str) -> bool { + if !log_message.starts_with("Program ") { + return false; + } + if !log_message.contains(" invoke [") { + return false; + } + return log_message.contains(program_id); +} + +fn is_program_success_or_failed_log(log_message: &str, program_id: &str) -> bool { + if !log_message.starts_with("Program ") { + return false; + } + if !log_message.contains(program_id) { + return false; + } + if log_message.ends_with(" success") { + return true; + } + if log_message.contains(" failed: ") { + return true; + } + return false; +} + fn decoded_instruction_ids_from_persisted_events( persisted: &[crate::DexDecodedEventDto], ) -> std::collections::HashSet { @@ -2603,7 +2970,7 @@ mod tests { "instructions": [ { "programId": crate::RAYDIUM_AMM_V4_PROGRAM_ID, - "program": "raydium-amm-v4", + "program": "raydium_amm_v4", "stackHeight": 1, "accounts": [ "Account0", @@ -2887,7 +3254,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DBC_PROGRAM_ID, - "program": "meteora-dbc", + "program": "meteora_dbc", "stackHeight": 1, "accounts": [ "DbcPoolDecode111", @@ -2962,7 +3329,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DAMM_V2_PROGRAM_ID, - "program": "meteora-damm-v2", + "program": "meteora_damm_v2", "stackHeight": 1, "accounts": [ "DammV2DecodePool111", @@ -3039,7 +3406,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DAMM_V1_PROGRAM_ID, - "program": "meteora-damm-v1", + "program": "meteora_damm_v1", "stackHeight": 1, "accounts": [ "DammV1DecodePool111", @@ -3116,7 +3483,7 @@ mod tests { "instructions": [ { "programId": crate::ORCA_WHIRLPOOLS_PROGRAM_ID, - "program": "orca-whirlpools", + "program": "orca_whirlpools", "stackHeight": 1, "accounts": [ "OrcaDecodePool111", @@ -3488,36 +3855,32 @@ mod tests { #[test] fn maps_observed_raydium_cpmm_non_swap_discriminators() { - let collect_creator_fee = super::raydium_mapped_non_trade_instruction_spec( - "raydium_cpmm", - Some("1416567bc61cdb84"), - 14, - ); - let collect_creator_fee = match collect_creator_fee { - Some(collect_creator_fee) => collect_creator_fee, - None => panic!("collect_creator_fee discriminator must be mapped"), - }; - assert_eq!(collect_creator_fee.event_kind, "raydium_cpmm.collect_creator_fee"); - let withdraw = super::raydium_mapped_non_trade_instruction_spec( - "raydium_cpmm", - Some("b712469c946da122"), - 14, - ); - let withdraw = match withdraw { - Some(withdraw) => withdraw, - None => panic!("withdraw discriminator must be mapped"), - }; - assert_eq!(withdraw.event_kind, "raydium_cpmm.withdraw"); - let initialize = super::raydium_mapped_non_trade_instruction_spec( - "raydium_cpmm", - Some("afaf6d1f0d989bed"), - 20, - ); - let initialize = match initialize { - Some(initialize) => initialize, - None => panic!("initialize discriminator must be mapped"), - }; - assert_eq!(initialize.event_kind, "raydium_cpmm.initialize"); + let expected = [ + ("9c5420764587467b", 4_usize, "raydium_cpmm.close_permission_pda"), + ("1416567bc61cdb84", 13_usize, "raydium_cpmm.collect_creator_fee"), + ("a78a4e95dfc2067e", 12_usize, "raydium_cpmm.collect_fund_fee"), + ("8888fcddc2427e59", 12_usize, "raydium_cpmm.collect_protocol_fee"), + ("8934edd4d7756c68", 3_usize, "raydium_cpmm.create_amm_config"), + ("878802d889a9b5ca", 4_usize, "raydium_cpmm.create_permission_pda"), + ("f223c68952e1f2b6", 13_usize, "raydium_cpmm.deposit"), + ("afaf6d1f0d989bed", 20_usize, "raydium_cpmm.initialize"), + ("3f37fe4131b25979", 21_usize, "raydium_cpmm.initialize_with_permission"), + ("313cae889a1c74c8", 2_usize, "raydium_cpmm.update_amm_config"), + ("82576c062ee0757b", 2_usize, "raydium_cpmm.update_pool_status"), + ("b712469c946da122", 14_usize, "raydium_cpmm.withdraw"), + ]; + for (discriminator, account_count, event_kind) in expected { + let mapped = super::raydium_mapped_non_trade_instruction_spec( + "raydium_cpmm", + Some(discriminator), + account_count, + ); + let mapped = match mapped { + Some(mapped) => mapped, + None => panic!("raydium cpmm discriminator must be mapped: {}", discriminator), + }; + assert_eq!(mapped.event_kind, event_kind); + } } #[test] @@ -3573,7 +3936,7 @@ mod tests { let registry_match = crate::UpstreamRegistryEntryDto { source_repo: Some("sevenlabs-hq/carbon".to_string()), source_path: Some("decoders/example.rs".to_string()), - decoder_code: "meteora-damm-v2".to_string(), + decoder_code: "meteora_damm_v2".to_string(), program_id: Some(crate::METEORA_DAMM_V2_PROGRAM_ID.to_string()), program_family: "meteora".to_string(), surface_kind: "amm".to_string(), diff --git a/kb_lib/src/dex_detect.rs b/kb_lib/src/dex_detect.rs index 3ed2feb..8ca3b35 100644 --- a/kb_lib/src/dex_detect.rs +++ b/kb_lib/src/dex_detect.rs @@ -1036,7 +1036,7 @@ mod tests { "instructions": [ { "programId": crate::RAYDIUM_AMM_V4_PROGRAM_ID, - "program": "raydium-amm-v4", + "program": "raydium_amm_v4", "stackHeight": 1, "accounts": [ "Account0", @@ -1462,7 +1462,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DBC_PROGRAM_ID, - "program": "meteora-dbc", + "program": "meteora_dbc", "stackHeight": 1, "accounts": [ "DbcDetectPool111", @@ -1581,7 +1581,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DAMM_V2_PROGRAM_ID, - "program": "meteora-damm-v2", + "program": "meteora_damm_v2", "stackHeight": 1, "accounts": [ "DammV2DetectPool111", @@ -1701,7 +1701,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DAMM_V1_PROGRAM_ID, - "program": "meteora-damm-v1", + "program": "meteora_damm_v1", "stackHeight": 1, "accounts": [ "DammV1DetectPool111", @@ -1821,7 +1821,7 @@ mod tests { "instructions": [ { "programId": crate::ORCA_WHIRLPOOLS_PROGRAM_ID, - "program": "orca-whirlpools", + "program": "orca_whirlpools", "stackHeight": 1, "accounts": [ "OrcaDetectPool111", diff --git a/kb_lib/src/dex_event_classification.rs b/kb_lib/src/dex_event_classification.rs index 8759667..b35132f 100644 --- a/kb_lib/src/dex_event_classification.rs +++ b/kb_lib/src/dex_event_classification.rs @@ -320,6 +320,9 @@ pub fn is_dex_liquidity_event_kind(event_kind: &str) -> bool { if event_kind.contains(".deposit") { return true; } + if event_kind.contains(".lp_change_event") { + return true; + } if event_kind.contains(".withdraw") { return true; } @@ -518,6 +521,9 @@ pub fn is_dex_migration_event_kind(event_kind: &str) -> bool { /// Returns true for pool creation or initialization events. pub fn is_dex_pool_creation_event_kind(event_kind: &str) -> bool { + if event_kind.contains("amm_config") { + return false; + } if event_kind.contains(".initialize_position") { return false; } @@ -552,6 +558,9 @@ pub fn is_dex_pair_creation_event_kind(event_kind: &str) -> bool { /// Returns true for admin, configuration or permission changes. pub fn is_dex_admin_event_kind(event_kind: &str) -> bool { + if event_kind.contains(".initialize_with_permission") { + return false; + } if event_kind.contains(".lock_liquidity") { return true; } @@ -1152,6 +1161,15 @@ mod tests { ); } + #[test] + fn classifies_initialize_with_permission_as_lifecycle_only() { + let event_kind = "raydium_cpmm.initialize_with_permission"; + assert!(super::is_dex_pool_lifecycle_event_kind(event_kind)); + assert!(!super::is_dex_admin_event_kind(event_kind)); + assert_eq!(super::classify_dex_event_category_code(event_kind), "pool_lifecycle"); + assert_eq!(super::classify_dex_event_lifecycle_kind_code(event_kind), "pool_creation"); + } + #[test] fn classifies_audit_suffix_events_as_informational() { assert!(super::is_dex_informational_event_kind("openbook_v2.settle_funds_audit")); diff --git a/kb_lib/src/dex_event_coverage.rs b/kb_lib/src/dex_event_coverage.rs index 112a53f..bb02dcb 100644 --- a/kb_lib/src/dex_event_coverage.rs +++ b/kb_lib/src/dex_event_coverage.rs @@ -38,15 +38,10 @@ impl DexEventCoverageService { }; } - /// Synchronizes static upstream registry entries into SQLite coverage rows. - /// - /// The resulting rows are still discovery/audit metadata. A row can become - /// observed or materialized only through local corpus replay and explicit - /// count refreshes. - pub async fn sync_upstream_registry( + async fn upsert_upstream_registry_rows( &self, decoder_code: std::option::Option, - ) -> Result { + ) -> Result<(usize, usize), crate::Error> { let request = crate::UpstreamRegistrySearchRequestDto { decoder_code: decoder_code.clone(), program_id: None, @@ -70,6 +65,30 @@ impl DexEventCoverageService { Err(error) => return Err(error), } } + return Ok((search_result.entries.len(), upserted_entry_count)); + } + + async fn ensure_upstream_registry_rows_if_needed( + &self, + decoder_code: std::option::Option, + ) -> Result<(usize, usize), crate::Error> { + return self.upsert_upstream_registry_rows(decoder_code).await; + } + + /// Synchronizes static upstream registry entries into SQLite coverage rows. + /// + /// The resulting rows are still discovery/audit metadata. A row can become + /// observed or materialized only through local corpus replay and explicit + /// count refreshes. + pub async fn sync_upstream_registry( + &self, + decoder_code: std::option::Option, + ) -> Result { + let sync_counts = self.upsert_upstream_registry_rows(decoder_code.clone()).await; + let (upstream_entry_count, upserted_entry_count) = match sync_counts { + Ok(sync_counts) => sync_counts, + Err(error) => return Err(error), + }; let refreshed_entry_count = match &decoder_code { Some(decoder_code) => { let refresh_result = @@ -103,7 +122,7 @@ impl DexEventCoverageService { }; return Ok(crate::DexEventCoverageSyncResult { decoder_code, - upstream_entry_count: search_result.entries.len(), + upstream_entry_count, upserted_entry_count, refreshed_entry_count, summaries, @@ -115,6 +134,11 @@ impl DexEventCoverageService { &self, decoder_code: std::option::Option, ) -> Result { + let sync_counts = self.ensure_upstream_registry_rows_if_needed(decoder_code.clone()).await; + let (upstream_entry_count, upserted_entry_count) = match sync_counts { + Ok(sync_counts) => sync_counts, + Err(error) => return Err(error), + }; let refreshed_entry_count = match &decoder_code { Some(decoder_code) => { let refresh_result = @@ -148,8 +172,8 @@ impl DexEventCoverageService { }; return Ok(crate::DexEventCoverageSyncResult { decoder_code, - upstream_entry_count: 0, - upserted_entry_count: 0, + upstream_entry_count, + upserted_entry_count, refreshed_entry_count, summaries, }); @@ -160,8 +184,12 @@ fn build_coverage_entry_from_upstream( entry: &crate::UpstreamRegistryEntryDto, ) -> crate::DexEventCoverageEntryDto { let event_family = infer_event_family(entry.entry_name.as_str(), entry.entry_kind.as_str()); - let expected_db_target = - infer_expected_db_target(event_family.as_deref(), entry.entry_kind.as_str()); + let expected_db_target = infer_expected_db_target_for_entry( + entry.decoder_code.as_str(), + entry.entry_name.as_str(), + event_family.as_deref(), + entry.entry_kind.as_str(), + ); let local_event_kind = known_local_event_kind(entry.decoder_code.as_str(), entry.entry_name.as_str()); let mut coverage_entry = crate::DexEventCoverageEntryDto::from_upstream_registry_entry( @@ -177,6 +205,18 @@ fn build_coverage_entry_from_upstream( return coverage_entry; } +fn infer_expected_db_target_for_entry( + decoder_code: &str, + entry_name: &str, + event_family: std::option::Option<&str>, + entry_kind: &str, +) -> std::option::Option { + if decoder_code == "raydium_cpmm" && entry_name == "swap_event" { + return Some(crate::DexEventCoverageEntryDto::DB_TARGET_DECODED_EVENTS_ONLY.to_string()); + } + return infer_expected_db_target(event_family, entry_kind); +} + fn infer_expected_db_target( event_family: std::option::Option<&str>, entry_kind: &str, @@ -195,6 +235,7 @@ fn infer_expected_db_target( let target = match family { "swap" => crate::DexEventCoverageEntryDto::DB_TARGET_TRADE_EVENTS, "pool_create" => crate::DexEventCoverageEntryDto::DB_TARGET_POOL_LIFECYCLE_EVENTS, + "liquidity" => crate::DexEventCoverageEntryDto::DB_TARGET_LIQUIDITY_EVENTS, "liquidity_add" => crate::DexEventCoverageEntryDto::DB_TARGET_LIQUIDITY_EVENTS, "liquidity_remove" => crate::DexEventCoverageEntryDto::DB_TARGET_LIQUIDITY_EVENTS, "position_open" => crate::DexEventCoverageEntryDto::DB_TARGET_POOL_LIFECYCLE_EVENTS, @@ -235,6 +276,9 @@ fn infer_event_family( return None; } let normalized = entry_name.to_ascii_lowercase(); + if normalized == "lp_change_event" { + return Some("liquidity".to_string()); + } if contains_any(normalized.as_str(), &["swap", "buy", "sell", "trade"]) { return Some("swap".to_string()); } @@ -360,29 +404,58 @@ fn known_local_event_kind( entry_name: &str, ) -> std::option::Option { match (decoder_code, entry_name) { - ("raydium-cpmm", "swap_base_input") => { + ("raydium_cpmm", "swap_base_input") => { return Some("raydium_cpmm.swap_base_input".to_string()); }, - ("raydium-cpmm", "swap_base_output") => { + ("raydium_cpmm", "swap_base_output") => { return Some("raydium_cpmm.swap_base_output".to_string()); }, - ("raydium-cpmm", "collect_creator_fee") => { + ("raydium_cpmm", "close_permission_pda") => { + return Some("raydium_cpmm.close_permission_pda".to_string()); + }, + ("raydium_cpmm", "collect_creator_fee") => { return Some("raydium_cpmm.collect_creator_fee".to_string()); }, - ("raydium-cpmm", "withdraw") => return Some("raydium_cpmm.withdraw".to_string()), - ("raydium-cpmm", "initialize") => return Some("raydium_cpmm.initialize".to_string()), - ("raydium-clmm", "swap") => return Some("raydium_clmm.swap".to_string()), - ("raydium-clmm", "swap_v2") => return Some("raydium_clmm.swap_v2".to_string()), - ("raydium-clmm", "increase_liquidity_v2") => { + ("raydium_cpmm", "collect_fund_fee") => { + return Some("raydium_cpmm.collect_fund_fee".to_string()); + }, + ("raydium_cpmm", "collect_protocol_fee") => { + return Some("raydium_cpmm.collect_protocol_fee".to_string()); + }, + ("raydium_cpmm", "create_amm_config") => { + return Some("raydium_cpmm.create_amm_config".to_string()); + }, + ("raydium_cpmm", "create_permission_pda") => { + return Some("raydium_cpmm.create_permission_pda".to_string()); + }, + ("raydium_cpmm", "deposit") => return Some("raydium_cpmm.deposit".to_string()), + ("raydium_cpmm", "initialize") => return Some("raydium_cpmm.initialize".to_string()), + ("raydium_cpmm", "initialize_with_permission") => { + return Some("raydium_cpmm.initialize_with_permission".to_string()); + }, + ("raydium_cpmm", "lp_change_event") => { + return Some("raydium_cpmm.lp_change_event".to_string()); + }, + ("raydium_cpmm", "swap_event") => return Some("raydium_cpmm.swap_event".to_string()), + ("raydium_cpmm", "update_amm_config") => { + return Some("raydium_cpmm.update_amm_config".to_string()); + }, + ("raydium_cpmm", "update_pool_status") => { + return Some("raydium_cpmm.update_pool_status".to_string()); + }, + ("raydium_cpmm", "withdraw") => return Some("raydium_cpmm.withdraw".to_string()), + ("raydium_clmm", "swap") => return Some("raydium_clmm.swap".to_string()), + ("raydium_clmm", "swap_v2") => return Some("raydium_clmm.swap_v2".to_string()), + ("raydium_clmm", "increase_liquidity_v2") => { return Some("raydium_clmm.increase_liquidity_v2".to_string()); }, - ("raydium-clmm", "decrease_liquidity_v2") => { + ("raydium_clmm", "decrease_liquidity_v2") => { return Some("raydium_clmm.decrease_liquidity_v2".to_string()); }, - ("raydium-clmm", "open_position_with_token22_nft") => { + ("raydium_clmm", "open_position_with_token22_nft") => { return Some("raydium_clmm.open_position_with_token22_nft".to_string()); }, - ("raydium-clmm", "close_position") => { + ("raydium_clmm", "close_position") => { return Some("raydium_clmm.close_position".to_string()); }, _ => return None, @@ -442,7 +515,7 @@ mod tests { async fn sync_upstream_registry_persists_raydium_cpmm_coverage_rows() { let database = make_database().await; let service = crate::DexEventCoverageService::new(database.clone()); - let result = service.sync_upstream_registry(Some("raydium-cpmm".to_string())).await; + let result = service.sync_upstream_registry(Some("raydium_cpmm".to_string())).await; let result = match result { Ok(result) => result, Err(error) => panic!("coverage sync must succeed: {}", error), @@ -451,7 +524,7 @@ mod tests { assert_eq!(result.upstream_entry_count, result.upserted_entry_count); let rows_result = crate::query_dex_event_coverage_entries_list_by_decoder( database.as_ref(), - "raydium-cpmm", + "raydium_cpmm", ) .await; let rows = match rows_result { @@ -467,7 +540,46 @@ mod tests { assert!(rows.iter().any(|row| return { row.entry_name == "deposit" && row.event_family == Some("liquidity_add".to_string()) - && row.local_event_kind.is_none() + && row.local_event_kind == Some("raydium_cpmm.deposit".to_string()) + })); + assert!(rows.iter().any(|row| return { + row.entry_name == "lp_change_event" + && row.event_family == Some("liquidity".to_string()) + && row.expected_db_target + == Some(crate::DexEventCoverageEntryDto::DB_TARGET_LIQUIDITY_EVENTS.to_string()) + && row.local_event_kind == Some("raydium_cpmm.lp_change_event".to_string()) + })); + assert!(rows.iter().any(|row| return { + row.entry_name == "swap_event" + && row.event_family == Some("swap".to_string()) + && row.expected_db_target + == Some( + crate::DexEventCoverageEntryDto::DB_TARGET_DECODED_EVENTS_ONLY.to_string(), + ) + && row.local_event_kind == Some("raydium_cpmm.swap_event".to_string()) })); } + + #[tokio::test] + async fn refresh_local_counts_auto_syncs_empty_coverage_table() { + let database = make_database().await; + let service = crate::DexEventCoverageService::new(database.clone()); + let result = service.refresh_local_counts(Some("raydium_cpmm".to_string())).await; + let result = match result { + Ok(result) => result, + Err(error) => panic!("coverage refresh must succeed: {}", error), + }; + assert!(result.upstream_entry_count > 0); + assert_eq!(result.upstream_entry_count, result.upserted_entry_count); + let rows_result = crate::query_dex_event_coverage_entries_list_by_decoder( + database.as_ref(), + "raydium_cpmm", + ) + .await; + let rows = match rows_result { + Ok(rows) => rows, + Err(error) => panic!("coverage rows must load: {}", error), + }; + assert!(!rows.is_empty()); + } } diff --git a/kb_lib/src/dex_support_matrix.rs b/kb_lib/src/dex_support_matrix.rs index acd743d..c5df0bc 100644 --- a/kb_lib/src/dex_support_matrix.rs +++ b/kb_lib/src/dex_support_matrix.rs @@ -628,7 +628,7 @@ const DEX_SUPPORT_MATRIX_ENTRIES: &[DexSupportMatrixEntry] = &[ version: "unknown", surface_type: "launch", surface_role: "launch_surface", - program_id: Some(crate::BOOP_PROGRAM_ID), + program_id: Some(crate::BOOP_FUN_PROGRAM_ID), router_program_id: None, program_id_status: "to_verify", observed: false, @@ -2934,7 +2934,7 @@ mod tests { ("zora", crate::ZORA_PROGRAM_ID), ("raydium_liquidity_locking", crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), ("okx_dex", crate::OKX_DEX_PROGRAM_ID), - ("boop_fun", crate::BOOP_PROGRAM_ID), + ("boop_fun", crate::BOOP_FUN_PROGRAM_ID), ("heaven", crate::HEAVEN_PROGRAM_ID), ("bonkswap", crate::BONKSWAP_PROGRAM_ID), ("metadao_launchpad_v0_7_0", crate::METADAO_LAUNCHPAD_V0_7_0_PROGRAM_ID), diff --git a/kb_lib/src/instruction_observation_index.rs b/kb_lib/src/instruction_observation_index.rs new file mode 100644 index 0000000..2d28c06 --- /dev/null +++ b/kb_lib/src/instruction_observation_index.rs @@ -0,0 +1,351 @@ +// file: kb_lib/src/instruction_observation_index.rs + +//! Local technical index of observed Solana instructions. +//! +//! This index is not a business materialization table. It is an audit/search +//! aid used to find local corpus evidence by program, decoder, instruction +//! discriminator and instruction name. + +#[derive(Debug, Clone, sqlx::FromRow)] +struct InstructionObservationSourceRow { + transaction_id: i64, + signature: std::string::String, + slot: std::option::Option, + block_time: std::option::Option, + err_json: std::option::Option, + instruction_id: i64, + parent_instruction_id: std::option::Option, + instruction_index: i64, + inner_instruction_index: std::option::Option, + program_id: std::option::Option, + accounts_json: std::string::String, + data_json: std::option::Option, + pool_account: std::option::Option, + decoded_event_kind: std::option::Option, + decoded_event_id: std::option::Option, +} + +/// Result of refreshing the instruction-observation index. +#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct InstructionObservationIndexRefreshResult { + /// Number of source instruction rows scanned. + pub scanned_instruction_count: usize, + /// Number of observation rows upserted. + pub upserted_observation_count: usize, +} + +/// Service that builds and refreshes `k_sol_instruction_observations`. +#[derive(Debug, Clone)] +pub struct InstructionObservationIndexService { + database: std::sync::Arc, +} + +impl InstructionObservationIndexService { + /// Creates a new instruction-observation index service. + pub fn new(database: std::sync::Arc) -> Self { + return Self { database }; + } + + /// Refreshes observations for one transaction signature. + pub async fn refresh_signature( + &self, + signature: &str, + ) -> Result { + let rows_result = self.list_source_rows_by_signature(signature).await; + let rows = match rows_result { + Ok(rows) => rows, + Err(error) => return Err(error), + }; + return self.upsert_source_rows(rows).await; + } + + /// Refreshes observations for recently persisted instructions. + pub async fn refresh_recent( + &self, + limit: u32, + ) -> Result { + let rows_result = self.list_recent_source_rows(limit).await; + let rows = match rows_result { + Ok(rows) => rows, + Err(error) => return Err(error), + }; + return self.upsert_source_rows(rows).await; + } + + async fn upsert_source_rows( + &self, + rows: std::vec::Vec, + ) -> Result { + let mut result = crate::InstructionObservationIndexRefreshResult::default(); + for row in rows { + result.scanned_instruction_count += 1; + let dto_option = build_instruction_observation_dto(row); + let dto = match dto_option { + Some(dto) => dto, + None => continue, + }; + let upsert_result = + crate::query_instruction_observations_upsert(self.database.as_ref(), &dto).await; + match upsert_result { + Ok(_) => result.upserted_observation_count += 1, + Err(error) => return Err(error), + } + } + return Ok(result); + } + + async fn list_source_rows_by_signature( + &self, + signature: &str, + ) -> Result, crate::Error> { + match self.database.connection() { + crate::DatabaseConnection::Sqlite(pool) => { + let query_result = sqlx::query_as::( + r#" +SELECT + tx.id AS transaction_id, + tx.signature AS signature, + tx.slot AS slot, + tx.block_time_unix AS block_time, + tx.err_json AS err_json, + ins.id AS instruction_id, + ins.parent_instruction_id AS parent_instruction_id, + ins.instruction_index AS instruction_index, + ins.inner_instruction_index AS inner_instruction_index, + ins.program_id AS program_id, + ins.accounts_json AS accounts_json, + ins.data_json AS data_json, + de.pool_account AS pool_account, + de.event_kind AS decoded_event_kind, + de.id AS decoded_event_id +FROM k_sol_chain_instructions ins +JOIN k_sol_chain_transactions tx + ON tx.id = ins.transaction_id +LEFT JOIN k_sol_dex_decoded_events de + ON de.transaction_id = tx.id + AND de.instruction_id = ins.id +WHERE tx.signature = ? +ORDER BY ins.instruction_index ASC, ins.inner_instruction_index ASC, ins.id ASC + "#, + ) + .bind(signature.to_string()) + .fetch_all(pool) + .await; + match query_result { + Ok(rows) => return Ok(rows), + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot list instruction observation source rows for signature '{}': {}", + signature, error + ))); + }, + } + }, + } + } + + async fn list_recent_source_rows( + &self, + limit: u32, + ) -> Result, crate::Error> { + if limit == 0 { + return Ok(std::vec::Vec::new()); + } + match self.database.connection() { + crate::DatabaseConnection::Sqlite(pool) => { + let query_result = sqlx::query_as::( + r#" +SELECT + tx.id AS transaction_id, + tx.signature AS signature, + tx.slot AS slot, + tx.block_time_unix AS block_time, + tx.err_json AS err_json, + ins.id AS instruction_id, + ins.parent_instruction_id AS parent_instruction_id, + ins.instruction_index AS instruction_index, + ins.inner_instruction_index AS inner_instruction_index, + ins.program_id AS program_id, + ins.accounts_json AS accounts_json, + ins.data_json AS data_json, + de.pool_account AS pool_account, + de.event_kind AS decoded_event_kind, + de.id AS decoded_event_id +FROM k_sol_chain_instructions ins +JOIN k_sol_chain_transactions tx + ON tx.id = ins.transaction_id +LEFT JOIN k_sol_dex_decoded_events de + ON de.transaction_id = tx.id + AND de.instruction_id = ins.id +ORDER BY ins.id DESC +LIMIT ? + "#, + ) + .bind(i64::from(limit)) + .fetch_all(pool) + .await; + match query_result { + Ok(rows) => return Ok(rows), + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot list recent instruction observation source rows: {}", + error + ))); + }, + } + }, + } + } +} + +fn build_instruction_observation_dto( + row: InstructionObservationSourceRow, +) -> std::option::Option { + let program_id = match row.program_id.clone() { + Some(program_id) => program_id, + None => return None, + }; + let discriminator_hex = discriminator_hex_from_data_json(row.data_json.as_ref()); + let decoder_code = resolve_decoder_code(program_id.as_str()); + let instruction_name = resolve_instruction_name( + program_id.as_str(), + decoder_code.as_deref(), + discriminator_hex.as_deref(), + ); + let observation_key = format!( + "{}|{}|{}|{}", + row.signature, + row.instruction_index, + option_i64_key(row.inner_instruction_index), + discriminator_hex.clone().unwrap_or_default() + ); + return Some(crate::InstructionObservationDto::new( + observation_key, + row.transaction_id, + row.signature, + row.slot, + row.block_time, + row.err_json.is_some(), + row.instruction_id, + row.parent_instruction_id, + row.instruction_index, + row.inner_instruction_index, + program_id, + decoder_code, + discriminator_hex, + instruction_name, + row.accounts_json, + row.data_json, + row.pool_account, + row.decoded_event_kind, + row.decoded_event_id, + )); +} + +fn resolve_decoder_code(program_id: &str) -> std::option::Option { + let entry = crate::dex_support_matrix_entry_by_program_id(program_id); + match entry { + Some(entry) => return Some(entry.code.to_string()), + None => return None, + } +} + +fn resolve_instruction_name( + program_id: &str, + decoder_code: std::option::Option<&str>, + discriminator_hex: std::option::Option<&str>, +) -> std::option::Option { + let discriminator_hex = match discriminator_hex { + Some(discriminator_hex) => discriminator_hex, + None => return None, + }; + if program_id == crate::RAYDIUM_CPMM_PROGRAM_ID || decoder_code == Some("raydium_cpmm") { + let name = match discriminator_hex { + "9c5420764587467b" => "raydium_cpmm.close_permission_pda", + "1416567bc61cdb84" => "raydium_cpmm.collect_creator_fee", + "a78a4e95dfc2067e" => "raydium_cpmm.collect_fund_fee", + "8888fcddc2427e59" => "raydium_cpmm.collect_protocol_fee", + "8934edd4d7756c68" => "raydium_cpmm.create_amm_config", + "878802d889a9b5ca" => "raydium_cpmm.create_permission_pda", + "f223c68952e1f2b6" => "raydium_cpmm.deposit", + "afaf6d1f0d989bed" => "raydium_cpmm.initialize", + "3f37fe4131b25979" => "raydium_cpmm.initialize_with_permission", + "8fbe5adac41e33de" => "raydium_cpmm.swap_base_input", + "37d96256a34ab4ad" => "raydium_cpmm.swap_base_output", + "313cae889a1c74c8" => "raydium_cpmm.update_amm_config", + "82576c062ee0757b" => "raydium_cpmm.update_pool_status", + "b712469c946da122" => "raydium_cpmm.withdraw", + _ => return None, + }; + return Some(name.to_string()); + } + return None; +} + +fn discriminator_hex_from_data_json( + data_json: std::option::Option<&std::string::String>, +) -> std::option::Option { + let decoded = match decode_data_json_as_bytes(data_json) { + Some(decoded) => decoded, + None => return None, + }; + if decoded.len() < 8 { + return None; + } + return Some(bytes_to_hex(&decoded[0..8])); +} + +fn decode_data_json_as_bytes( + data_json: std::option::Option<&std::string::String>, +) -> std::option::Option> { + let data_json = match data_json { + Some(data_json) => data_json, + None => return None, + }; + let parsed_result = serde_json::from_str::(data_json.as_str()); + let parsed = match parsed_result { + Ok(parsed) => parsed, + Err(_) => return None, + }; + match parsed { + serde_json::Value::String(base58_text) => { + let decoded_result = bs58::decode(base58_text.as_str()).into_vec(); + match decoded_result { + Ok(decoded) => return Some(decoded), + Err(_) => return None, + } + }, + serde_json::Value::Array(values) => { + let first = match values.first() { + Some(first) => first, + None => return None, + }; + let base58_text = match first.as_str() { + Some(base58_text) => base58_text, + None => return None, + }; + let decoded_result = bs58::decode(base58_text).into_vec(); + match decoded_result { + Ok(decoded) => return Some(decoded), + Err(_) => return None, + } + }, + _ => return None, + } +} + +fn bytes_to_hex(bytes: &[u8]) -> std::string::String { + let mut text = std::string::String::new(); + for byte in bytes { + text.push_str(format!("{:02x}", byte).as_str()); + } + return text; +} + +fn option_i64_key(value: std::option::Option) -> std::string::String { + match value { + Some(value) => return value.to_string(), + None => return "-".to_string(), + } +} diff --git a/kb_lib/src/launch_origin.rs b/kb_lib/src/launch_origin.rs index 809ad94..7639b18 100644 --- a/kb_lib/src/launch_origin.rs +++ b/kb_lib/src/launch_origin.rs @@ -736,7 +736,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DBC_PROGRAM_ID, - "program": "meteora-dbc", + "program": "meteora_dbc", "stackHeight": 1, "accounts": [ "DbcDetectPool111", @@ -829,7 +829,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DAMM_V2_PROGRAM_ID, - "program": "meteora-damm-v2", + "program": "meteora_damm_v2", "stackHeight": 1, "accounts": [ "MoonitDammV2Pool111", diff --git a/kb_lib/src/lib.rs b/kb_lib/src/lib.rs index 16c7dc8..255cbe1 100644 --- a/kb_lib/src/lib.rs +++ b/kb_lib/src/lib.rs @@ -51,6 +51,8 @@ mod error; mod http_client; /// HTTP endpoint pool and routing. mod http_pool; +/// Technical index for observed chain instructions. +mod instruction_observation_index; /// Generic JSON-RPC 2.0 WebSocket helpers. mod json_rpc_ws; /// Launch surface attribution service. @@ -173,7 +175,7 @@ pub use constants::BONK_MINT_ID; /// Bonkswap program id extracted from upstream Git decoder source. pub use constants::BONKSWAP_PROGRAM_ID; /// Boop program id extracted from upstream Git decoder source. -pub use constants::BOOP_PROGRAM_ID; +pub use constants::BOOP_FUN_PROGRAM_ID; /// BPF Loader program identifier. ("BPFLoader1111111111111111111111111111111111"). /// @see solana_sdk::pubkey::Pubkey = solana_sdk_ids::bpf_loader_deprecated::ID pub use constants::BPF_LOADER_DEPRECATED_PROGRAM_ID; @@ -491,6 +493,10 @@ pub use db::DexEventCoverageSummaryEntity; pub use db::FeeEventDto; /// Persisted fee event row. pub use db::FeeEventEntity; +/// Application-facing on-chain observation DTO. +pub use db::InstructionObservationDto; +/// Persisted technical observation for one Solana instruction. +pub use db::InstructionObservationEntity; /// Application-facing known HTTP endpoint DTO. pub use db::KnownHttpEndpointDto; /// Application-facing known WebSocket endpoint DTO. @@ -767,6 +773,9 @@ pub use db::query_fee_events_get_by_decoded_event_id; pub use db::query_fee_events_list_recent; /// Inserts or updates one normalized fee event row. pub use db::query_fee_events_upsert; +/// Inserts one on-chain observation row and returns its numeric id. +pub use db::query_instruction_observations_list_by_filter; +pub use db::query_instruction_observations_upsert; /// Reads one known HTTP endpoint by name. pub use db::query_known_http_endpoints_get; /// Lists all known HTTP endpoints. @@ -1141,14 +1150,22 @@ pub use dex::RaydiumClmmSwapLegacyDecoded; pub use dex::RaydiumClmmSwapV2Decoded; /// Raydium CPMM decoded event. pub use dex::RaydiumCpmmDecodedEvent; +/// Raydium CPMM Anchor CPI liquidity-change event. +pub use dex::RaydiumCpmmLpChangeEventDecoded; /// Raydium CPMM decoded swap. pub use dex::RaydiumCpmmSwapDecoded; +/// Raydium CPMM Anchor CPI swap event retained as audit evidence. +pub use dex::RaydiumCpmmSwapEventDecoded; /// Raydium CPMM swap mode. pub use dex::RaydiumCpmmSwapMode; +/// Decodes one Raydium CPMM instruction from projected instruction fields. +pub use dex::classify_raydium_cpmm_instruction_data; /// Decodes a Raydium CLMM instruction. pub use dex::decode_raydium_clmm_instruction; /// Decodes one Raydium CPMM instruction from projected instruction fields. pub use dex::decode_raydium_cpmm_instruction; +/// Decodes Raydium CPMM Anchor events emitted in `Program data:` logs. +pub use dex::decode_raydium_cpmm_program_data_event; /// DEX decode service. pub use dex_decode::DexDecodeService; /// Business-level DEX detection service. @@ -1263,6 +1280,10 @@ pub use http_client::parse_json_rpc_http_response_value; pub use http_pool::HttpEndpointPool; /// Snapshot of one pooled HTTP endpoint. pub use http_pool::HttpPoolClientSnapshot; +/// Instruction-observation index refresh result. +pub use instruction_observation_index::InstructionObservationIndexRefreshResult; +/// Technical service that indexes observed Solana instructions. +pub use instruction_observation_index::InstructionObservationIndexService; /// JSON-RPC 2.0 error object. pub use json_rpc_ws::JsonRpcWsErrorObject; /// JSON-RPC 2.0 error response. diff --git a/kb_lib/src/local_pipeline_diagnostics.rs b/kb_lib/src/local_pipeline_diagnostics.rs index ef3b118..566fd75 100644 --- a/kb_lib/src/local_pipeline_diagnostics.rs +++ b/kb_lib/src/local_pipeline_diagnostics.rs @@ -825,17 +825,14 @@ async fn query_validation_i64( async fn load_event_coverage_summaries( database: &crate::Database, ) -> Result, crate::Error> { - let refresh_result = - crate::query_dex_event_coverage_entries_refresh_local_counts(database).await; - if let Err(error) = refresh_result { - return Err(error); - } - let summaries_result = - crate::query_dex_event_coverage_entries_list_summary_by_decoder(database).await; - match summaries_result { - Ok(summaries) => return Ok(summaries), + let coverage_service = + crate::DexEventCoverageService::new(std::sync::Arc::new(database.clone())); + let refresh_result = coverage_service.refresh_local_counts(None).await; + let refresh_result = match refresh_result { + Ok(refresh_result) => refresh_result, Err(error) => return Err(error), - } + }; + return Ok(refresh_result.summaries); } #[derive(Debug, Clone)] diff --git a/kb_lib/src/local_pipeline_replay.rs b/kb_lib/src/local_pipeline_replay.rs index bdfa875..9f1613d 100644 --- a/kb_lib/src/local_pipeline_replay.rs +++ b/kb_lib/src/local_pipeline_replay.rs @@ -183,6 +183,8 @@ impl LocalPipelineReplayService { let pair_analytic_signal = crate::PairAnalyticSignalService::new(self.database.clone()); let transaction_classification = crate::TransactionClassificationService::new(self.database.clone()); + let instruction_observation_index = + crate::InstructionObservationIndexService::new(self.database.clone()); let mut result = LocalPipelineReplayResult { selected_transaction_count: signatures.len(), reset_market_materialization_deleted_count, @@ -424,6 +426,24 @@ impl LocalPipelineReplayService { ); }, } + let instruction_index_result = + instruction_observation_index.refresh_signature(signature.as_str()).await; + match instruction_index_result { + Ok(index_result) => { + tracing::debug!( + signature = %signature, + upserted_observation_count = index_result.upserted_observation_count, + "instruction observation index refreshed during local replay" + ); + }, + Err(error) => { + tracing::warn!( + signature = %signature, + error = %error, + "instruction observation index refresh failed during local replay" + ); + }, + } result.replayed_transaction_count += 1; } if config.refresh_missing_token_metadata { @@ -451,9 +471,31 @@ impl LocalPipelineReplayService { }, } } + self.refresh_event_coverage_best_effort().await; return Ok(result); } + async fn refresh_event_coverage_best_effort(&self) { + let coverage_service = crate::DexEventCoverageService::new(self.database.clone()); + let refresh_result = coverage_service.refresh_local_counts(None).await; + match refresh_result { + Ok(refresh_result) => { + tracing::debug!( + upserted_entry_count = refresh_result.upserted_entry_count, + refreshed_entry_count = refresh_result.refreshed_entry_count, + summary_count = refresh_result.summaries.len(), + "dex event coverage refreshed after local pipeline replay" + ); + }, + Err(error) => { + tracing::warn!( + error = %error, + "dex event coverage refresh failed after local pipeline replay" + ); + }, + } + } + async fn get_certified_dex_decode_skip_ledger( &self, config: &crate::LocalPipelineReplayConfig, @@ -777,7 +819,12 @@ mod tests { let ledger = super::build_success_dex_decode_replay_ledger(1, "sig", events.as_slice()) .expect("ledger must build"); assert_eq!(ledger.event_count, 2); - assert_eq!(ledger.status_reason.as_deref(), Some("decode completed and certified for skip: event_count=2, effective_event_count=0, instruction_audit_count=2, distinct_token_mint_count=2")); + assert_eq!( + ledger.status_reason.as_deref(), + Some( + "decode completed and certified for skip: event_count=2, effective_event_count=0, instruction_audit_count=2, distinct_token_mint_count=2" + ) + ); assert!(!ledger.force_replay_required); assert!(ledger.can_skip_decode()); } diff --git a/kb_lib/src/local_pipeline_validation.rs b/kb_lib/src/local_pipeline_validation.rs index 706436d..13ca001 100644 --- a/kb_lib/src/local_pipeline_validation.rs +++ b/kb_lib/src/local_pipeline_validation.rs @@ -1824,7 +1824,7 @@ mod tests { summary.event_coverage_upstream_git_local_corpus_observed_entry_count = 1; summary.event_coverage_upstream_git_local_corpus_materialized_entry_count = 1; summary.event_coverage_summaries.push(crate::DexEventCoverageSummaryDto { - decoder_code: "raydium-cpmm".to_string(), + decoder_code: "raydium_cpmm".to_string(), listed_entry_count: 4, decoded_entry_count: 3, observed_entry_count: 2, diff --git a/kb_lib/src/non_trade_event_materialization.rs b/kb_lib/src/non_trade_event_materialization.rs index 761d151..87d1f05 100644 --- a/kb_lib/src/non_trade_event_materialization.rs +++ b/kb_lib/src/non_trade_event_materialization.rs @@ -102,7 +102,17 @@ impl NonTradeEventMaterializationService { continue; }, }; - if crate::is_dex_liquidity_event_kind(decoded_event.event_kind.as_str()) { + if crate::is_dex_pool_lifecycle_event_kind(decoded_event.event_kind.as_str()) { + let cleanup_result = + self.delete_stale_pool_admin_event_for_lifecycle(decoded_event).await; + match cleanup_result { + Ok(_) => {}, + Err(error) => return Err(error), + } + } + if crate::is_dex_liquidity_event_kind(decoded_event.event_kind.as_str()) + && !decoded_event.event_kind.ends_with(".lp_change_event") + { let materialized = self .materialize_liquidity_event( &transaction, @@ -159,7 +169,9 @@ impl NonTradeEventMaterializationService { Err(error) => return Err(error), } } - if crate::is_dex_admin_event_kind(decoded_event.event_kind.as_str()) { + if crate::is_dex_admin_event_kind(decoded_event.event_kind.as_str()) + && !crate::is_dex_pool_lifecycle_event_kind(decoded_event.event_kind.as_str()) + { let materialized = self .materialize_pool_admin_event( &transaction, @@ -178,6 +190,36 @@ impl NonTradeEventMaterializationService { } } } + for decoded_event in &decoded_events { + if !decoded_event.event_kind.ends_with(".lp_change_event") { + continue; + } + let payload_result = + serde_json::from_str::(decoded_event.payload_json.as_str()); + let payload = match payload_result { + Ok(payload) => payload, + Err(error) => { + tracing::warn!( + signature = %transaction.signature, + event_kind = %decoded_event.event_kind, + error = %error, + "skipping postponed lp_change_event materialization for invalid decoded payload" + ); + continue; + }, + }; + let materialized = self + .materialize_liquidity_event(&transaction, transaction_id, decoded_event, &payload) + .await; + match materialized { + Ok(was_materialized) => { + if was_materialized { + result.liquidity_event_count += 1; + } + }, + Err(error) => return Err(error), + } + } return Ok(result); } @@ -274,6 +316,12 @@ impl NonTradeEventMaterializationService { "fund_fee_amount", "creatorFeeAmount", "creator_fee_amount", + "amount0RequestedRaw", + "amount_0_requested_raw", + "amount1RequestedRaw", + "amount_1_requested_raw", + "tokenAAmount", + "tokenBAmount", "amount", ], ); @@ -370,6 +418,48 @@ impl NonTradeEventMaterializationService { } } + async fn delete_stale_pool_admin_event_for_lifecycle( + &self, + decoded_event: &crate::DexDecodedEventDto, + ) -> Result<(), crate::Error> { + let decoded_event_id = match decoded_event.id { + Some(decoded_event_id) => decoded_event_id, + None => return Ok(()), + }; + match self.database.connection() { + crate::DatabaseConnection::Sqlite(pool) => { + let delete_result = sqlx::query( + r#" +DELETE FROM k_sol_pool_admin_events +WHERE decoded_event_id = ? + "#, + ) + .bind(decoded_event_id) + .execute(pool) + .await; + let delete_result = match delete_result { + Ok(delete_result) => delete_result, + Err(error) => { + return Err(crate::Error::Db(format!( + "cannot delete stale k_sol_pool_admin_events for lifecycle decoded_event_id '{}' on sqlite: {}", + decoded_event_id, error + ))); + }, + }; + let deleted_count = delete_result.rows_affected(); + if deleted_count > 0 { + tracing::debug!( + decoded_event_id = decoded_event_id, + event_kind = %decoded_event.event_kind, + deleted_count = deleted_count, + "removed stale pool admin materialization for lifecycle event" + ); + } + return Ok(()); + }, + } + } + async fn materialize_pool_admin_event( &self, transaction: &crate::ChainTransactionDto, @@ -437,6 +527,16 @@ impl NonTradeEventMaterializationService { Ok(context) => context, Err(error) => return Err(error), }; + let context = if context.pool_id.is_some() && context.pair.is_some() { + context + } else { + let ensured_context = + self.ensure_liquidity_context_from_decoded_event(decoded_event, context).await; + match ensured_context { + Ok(ensured_context) => ensured_context, + Err(error) => return Err(error), + } + }; let dex_id = match context.dex_id { Some(dex_id) => dex_id, None => return Ok(false), @@ -458,6 +558,12 @@ impl NonTradeEventMaterializationService { crate::LiquidityEventKind::PositionOpen } else if crate::is_dex_position_close_event_kind(decoded_event.event_kind.as_str()) { crate::LiquidityEventKind::PositionClose + } else if decoded_event.event_kind.ends_with(".lp_change_event") { + let change_type = extract_first_u64(payload, &["changeType", "change_type"]); + match change_type { + Some(1) => crate::LiquidityEventKind::Remove, + _ => crate::LiquidityEventKind::Add, + } } else if crate::is_dex_liquidity_remove_event_kind(decoded_event.event_kind.as_str()) { crate::LiquidityEventKind::Remove } else { @@ -487,6 +593,10 @@ impl NonTradeEventMaterializationService { "amount_base", "tokenAAmount", "token_a_amount", + "token0AmountRaw", + "token_0_amount_raw", + "amount0RequestedRaw", + "amount_0_requested_raw", "amountA", "amount_a", ], @@ -502,6 +612,10 @@ impl NonTradeEventMaterializationService { "amount_quote", "tokenBAmount", "token_b_amount", + "token1AmountRaw", + "token_1_amount_raw", + "amount1RequestedRaw", + "amount_1_requested_raw", "amountB", "amount_b", ], @@ -559,6 +673,54 @@ impl NonTradeEventMaterializationService { } } + async fn ensure_liquidity_context_from_decoded_event( + &self, + decoded_event: &crate::DexDecodedEventDto, + context: NonTradeDecodedEventContext, + ) -> Result { + let dex_id = match context.dex_id { + Some(dex_id) => dex_id, + None => return Ok(context), + }; + if context.pool_id.is_some() && context.pair.is_some() { + return Ok(context); + } + if decoded_event.pool_account.is_none() + || decoded_event.token_a_mint.is_none() + || decoded_event.token_b_mint.is_none() + { + return Ok(context); + } + let materialization_input_result = + crate::dex_pool_materialization::DexPoolMaterializationInput::from_decoded_event( + decoded_event, + dex_id, + crate::PoolKind::Amm, + crate::PoolStatus::Active, + crate::dex_pool_materialization::DexPoolTokenOrder::AlreadyBaseQuote, + None, + None, + None, + ); + let materialization_input = match materialization_input_result { + Ok(materialization_input) => materialization_input, + Err(_) => return Ok(context), + }; + let materialization_result = crate::dex_pool_materialization::materialize_dex_pool( + self.database.as_ref(), + &materialization_input, + ) + .await; + if let Err(error) = materialization_result { + return Err(error); + } + let refreshed_context = self.resolve_decoded_event_context(decoded_event).await; + match refreshed_context { + Ok(refreshed_context) => return Ok(refreshed_context), + Err(error) => return Err(error), + } + } + async fn resolve_decoded_event_context( &self, decoded_event: &crate::DexDecodedEventDto, @@ -627,6 +789,29 @@ impl NonTradeEventMaterializationService { } } +fn extract_first_u64( + value: &serde_json::Value, + candidate_keys: &[&str], +) -> std::option::Option { + if let Some(object) = value.as_object() { + for candidate_key in candidate_keys { + let candidate_value = object.get(*candidate_key); + if let Some(candidate_value) = candidate_value { + if let Some(number) = candidate_value.as_u64() { + return Some(number); + } + if let Some(text) = candidate_value.as_str() { + let parsed = text.parse::(); + if let Ok(parsed) = parsed { + return Some(parsed); + } + } + } + } + } + return None; +} + fn extract_first_amount_string( value: &serde_json::Value, candidate_keys: &[&str], diff --git a/kb_lib/src/onchain_dex_pair_discovery.rs b/kb_lib/src/onchain_dex_pair_discovery.rs index 6c734e3..7fa8806 100644 --- a/kb_lib/src/onchain_dex_pair_discovery.rs +++ b/kb_lib/src/onchain_dex_pair_discovery.rs @@ -37,6 +37,12 @@ pub struct OnchainDexPairDiscoveryRequestDto { pub scan_order: std::option::Option, /// Optional target event family used to score and filter candidate signatures. pub target_event: std::option::Option, + /// Optional instruction-name filter, for example `raydium_cpmm.withdraw` or `withdraw`. + #[serde(default)] + pub target_instruction_name: std::option::Option, + /// Optional first-eight-byte discriminator filter as lower hex; accepts comma/space separated values. + #[serde(default)] + pub target_discriminator_hex: std::option::Option, /// Whether transactions containing swap-like logs should be skipped. pub exclude_swaps: bool, /// Whether failed transactions should be returned as candidates. @@ -209,6 +215,8 @@ pub struct OnchainDexPairCandidateDto { pub instruction_name: std::option::Option, /// Prefix of the raw base58 instruction data, useful for audit grouping. pub instruction_data_prefix: std::option::Option, + /// First eight instruction-data bytes as lower hex. + pub instruction_discriminator_hex: std::option::Option, /// Candidate pool address when it can be extracted safely or heuristically. pub pool_address: std::option::Option, /// Candidate token A/base mint when it can be extracted. @@ -382,6 +390,8 @@ impl OnchainDexPairDiscoveryService { let logs = extract_log_messages(&transaction_value); let target_keeps_mixed_swaps = target_event_keeps_mixed_swap_transactions( normalized_request.target_event.as_deref(), + normalized_request.target_instruction_name.as_deref(), + normalized_request.target_discriminator_hex.as_deref(), ); if normalized_request.exclude_swaps && logs_contain_swap(logs.as_slice()) @@ -396,6 +406,8 @@ impl OnchainDexPairDiscoveryService { resolved.program_id.as_str(), resolved.dex_code.clone(), normalized_request.target_event.as_deref(), + normalized_request.target_instruction_name.as_deref(), + normalized_request.target_discriminator_hex.as_deref(), ); result.scanned_instruction_count += extraction.scanned_instruction_count; result.target_program_instruction_count += extraction.target_program_instruction_count; @@ -683,6 +695,8 @@ fn normalize_request( max_pages: clamp_u32(default_if_zero(request.max_pages, 1), 1, 25), scan_order: Some(normalize_scan_order(request.scan_order.as_deref()).to_string()), target_event: normalize_target_event(request.target_event), + target_instruction_name: normalize_instruction_name_filter(request.target_instruction_name), + target_discriminator_hex: normalize_discriminator_filter(request.target_discriminator_hex), exclude_swaps: request.exclude_swaps, include_failed: request.include_failed, http_role, @@ -773,6 +787,56 @@ fn normalize_target_event( return Some(targets.join(",")); } +fn normalize_instruction_name_filter( + value: std::option::Option, +) -> std::option::Option { + let value = match normalize_optional_string(value) { + Some(value) => value, + None => return None, + }; + let mut normalized = std::vec::Vec::new(); + for token in value.split(|character: char| { + return character == ',' || character == ';' || character.is_whitespace(); + }) { + let token = token.trim().to_ascii_lowercase(); + if token.is_empty() { + continue; + } + push_unique_string(&mut normalized, token.replace('-', "_")); + } + if normalized.is_empty() { + return None; + } + return Some(normalized.join(",")); +} + +fn normalize_discriminator_filter( + value: std::option::Option, +) -> std::option::Option { + let value = match normalize_optional_string(value) { + Some(value) => value, + None => return None, + }; + let mut normalized = std::vec::Vec::new(); + for token in value.split(|character: char| { + return character == ',' || character == ';' || character.is_whitespace(); + }) { + let mut token = token.trim().to_ascii_lowercase(); + if token.starts_with("0x") { + token = token[2..].to_string(); + } + if token.len() != 16 || !token.chars().all(|character| return character.is_ascii_hexdigit()) + { + continue; + } + push_unique_string(&mut normalized, token); + } + if normalized.is_empty() { + return None; + } + return Some(normalized.join(",")); +} + fn normalize_signature_source( value: std::option::Option, ) -> std::option::Option { @@ -974,6 +1038,8 @@ fn extract_candidates_from_transaction( target_program_id: &str, dex_code: std::option::Option, target_event: std::option::Option<&str>, + target_instruction_name: std::option::Option<&str>, + target_discriminator_hex: std::option::Option<&str>, ) -> OnchainCandidateExtraction { let mut candidates = std::vec::Vec::new(); let mut rejected_candidate_summary = std::vec::Vec::new(); @@ -1036,6 +1102,19 @@ fn extract_candidates_from_transaction( ); continue; } + if !candidate_matches_instruction_filters( + &candidate, + target_instruction_name, + target_discriminator_hex, + ) { + target_rejected_candidate_count += 1; + push_rejected_candidate_summary( + &mut rejected_candidate_summary, + &candidate, + "target_instruction_filter", + ); + continue; + } if candidates.iter().any(|existing| { return candidate_identity_key(existing) == candidate_identity_key(&candidate); }) { @@ -1144,6 +1223,9 @@ fn decode_raydium_clmm_candidate( inner_instruction_index: instruction.inner_instruction_index, instruction_name: Some("raydium_clmm.swap".to_string()), instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex( + instruction.data.as_deref(), + ), pool_address: Some(event.pool_state.clone()), token_a_mint: Some(event.base_mint), token_b_mint: Some(event.quote_mint), @@ -1176,6 +1258,9 @@ fn decode_raydium_clmm_candidate( inner_instruction_index: instruction.inner_instruction_index, instruction_name: Some("raydium_clmm.swap_v2".to_string()), instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex( + instruction.data.as_deref(), + ), pool_address: Some(event.pool_state.clone()), token_a_mint: Some(event.base_mint), token_b_mint: Some(event.quote_mint), @@ -1257,9 +1342,31 @@ fn decode_raydium_cpmm_candidate( event.quote_mint, )); }, + _ => return None, } } - return None; + let raw_data = match decode_onchain_instruction_data(instruction.data.as_deref()) { + Some(raw_data) => raw_data, + None => return None, + }; + let instruction_kind = classify_demo3_raydium_cpmm_instruction(raw_data.as_slice()); + if instruction_kind == Demo3RaydiumCpmmInstructionKind::Unknown + || instruction_kind == Demo3RaydiumCpmmInstructionKind::SwapBaseInput + || instruction_kind == Demo3RaydiumCpmmInstructionKind::SwapBaseOutput + { + return None; + } + return Some(build_raydium_cpmm_non_swap_candidate( + signature, + slot, + block_time, + failed, + program_id, + dex_code, + instruction, + logs, + instruction_kind, + )); } fn build_raydium_cpmm_candidate( @@ -1289,6 +1396,7 @@ fn build_raydium_cpmm_candidate( inner_instruction_index: instruction.inner_instruction_index, instruction_name: Some(instruction_name.to_string()), instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex(instruction.data.as_deref()), pool_address: Some(pool_address.clone()), token_a_mint: Some(token_a_mint), token_b_mint: Some(token_b_mint), @@ -1304,6 +1412,267 @@ fn build_raydium_cpmm_candidate( }; } +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum Demo3RaydiumCpmmInstructionKind { + Unknown, + ClosePermissionPda, + CollectCreatorFee, + CollectFundFee, + CollectProtocolFee, + CreateAmmConfig, + CreatePermissionPda, + Deposit, + Initialize, + InitializeWithPermission, + SwapBaseInput, + SwapBaseOutput, + UpdateAmmConfig, + UpdatePoolStatus, + Withdraw, +} + +fn build_raydium_cpmm_non_swap_candidate( + signature: &str, + slot: std::option::Option, + block_time: std::option::Option, + failed: bool, + program_id: &str, + dex_code: std::option::Option, + instruction: &OnchainInstructionCandidate, + logs: &[std::string::String], + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> crate::OnchainDexPairCandidateDto { + let pool_address = + demo3_raydium_cpmm_pool_account(instruction.accounts.as_slice(), instruction_kind); + let token_a_mint = + demo3_raydium_cpmm_token_a_mint(instruction.accounts.as_slice(), instruction_kind); + let token_b_mint = + demo3_raydium_cpmm_token_b_mint(instruction.accounts.as_slice(), instruction_kind); + let candidate_kind = demo3_raydium_cpmm_candidate_kind(instruction_kind).to_string(); + let instruction_name = demo3_raydium_cpmm_instruction_name(instruction_kind).to_string(); + let verified_pool_address = pool_address.clone(); + let backfill_hint = demo3_raydium_cpmm_backfill_hint( + instruction_kind, + candidate_kind.as_str(), + pool_address.as_deref(), + signature, + ); + return crate::OnchainDexPairCandidateDto { + signature: signature.to_string(), + slot, + block_time, + failed, + program_id: program_id.to_string(), + dex_code, + candidate_kind, + confidence: "high".to_string(), + instruction_index: instruction.instruction_index, + inner_instruction_index: instruction.inner_instruction_index, + instruction_name: Some(instruction_name), + instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex(instruction.data.as_deref()), + pool_address, + token_a_mint, + token_b_mint, + verified_pool_address, + observed_token_mints: std::vec::Vec::new(), + token_balance_deltas: std::vec::Vec::new(), + candidate_pool_accounts: std::vec::Vec::new(), + candidate_token_vault_accounts: std::vec::Vec::new(), + candidate_program_accounts: std::vec::Vec::new(), + account_samples: sample_strings(instruction.accounts.as_slice(), 12), + log_samples: sample_logs(logs, 8), + backfill_hint, + }; +} + +fn classify_demo3_raydium_cpmm_instruction(data: &[u8]) -> Demo3RaydiumCpmmInstructionKind { + if data.len() < 8 { + return Demo3RaydiumCpmmInstructionKind::Unknown; + } + let discriminator = &data[0..8]; + if discriminator == [156, 84, 32, 118, 69, 135, 70, 123] { + return Demo3RaydiumCpmmInstructionKind::ClosePermissionPda; + } + if discriminator == [20, 22, 86, 123, 198, 28, 219, 132] { + return Demo3RaydiumCpmmInstructionKind::CollectCreatorFee; + } + if discriminator == [167, 138, 78, 149, 223, 194, 6, 126] { + return Demo3RaydiumCpmmInstructionKind::CollectFundFee; + } + if discriminator == [136, 136, 252, 221, 194, 66, 126, 89] { + return Demo3RaydiumCpmmInstructionKind::CollectProtocolFee; + } + if discriminator == [137, 52, 237, 212, 215, 117, 108, 104] { + return Demo3RaydiumCpmmInstructionKind::CreateAmmConfig; + } + if discriminator == [135, 136, 2, 216, 137, 169, 181, 202] { + return Demo3RaydiumCpmmInstructionKind::CreatePermissionPda; + } + if discriminator == [242, 35, 198, 137, 82, 225, 242, 182] { + return Demo3RaydiumCpmmInstructionKind::Deposit; + } + if discriminator == [175, 175, 109, 31, 13, 152, 155, 237] { + return Demo3RaydiumCpmmInstructionKind::Initialize; + } + if discriminator == [63, 55, 254, 65, 49, 178, 89, 121] { + return Demo3RaydiumCpmmInstructionKind::InitializeWithPermission; + } + if discriminator == [143, 190, 90, 218, 196, 30, 51, 222] { + return Demo3RaydiumCpmmInstructionKind::SwapBaseInput; + } + if discriminator == [55, 217, 98, 86, 163, 74, 180, 173] { + return Demo3RaydiumCpmmInstructionKind::SwapBaseOutput; + } + if discriminator == [49, 60, 174, 136, 154, 28, 116, 200] { + return Demo3RaydiumCpmmInstructionKind::UpdateAmmConfig; + } + if discriminator == [130, 87, 108, 6, 46, 224, 117, 123] { + return Demo3RaydiumCpmmInstructionKind::UpdatePoolStatus; + } + if discriminator == [183, 18, 70, 156, 148, 109, 161, 34] { + return Demo3RaydiumCpmmInstructionKind::Withdraw; + } + return Demo3RaydiumCpmmInstructionKind::Unknown; +} + +fn demo3_raydium_cpmm_candidate_kind( + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> &'static str { + match instruction_kind { + Demo3RaydiumCpmmInstructionKind::ClosePermissionPda => return "pool_admin", + Demo3RaydiumCpmmInstructionKind::CollectCreatorFee => return "claim_fee", + Demo3RaydiumCpmmInstructionKind::CollectFundFee => return "claim_fee", + Demo3RaydiumCpmmInstructionKind::CollectProtocolFee => return "claim_fee", + Demo3RaydiumCpmmInstructionKind::CreateAmmConfig => return "pool_admin", + Demo3RaydiumCpmmInstructionKind::CreatePermissionPda => return "pool_admin", + Demo3RaydiumCpmmInstructionKind::Deposit => return "add_liquidity", + Demo3RaydiumCpmmInstructionKind::Initialize => return "create_pool", + Demo3RaydiumCpmmInstructionKind::InitializeWithPermission => return "create_pool", + Demo3RaydiumCpmmInstructionKind::UpdateAmmConfig => return "pool_admin", + Demo3RaydiumCpmmInstructionKind::UpdatePoolStatus => return "pool_admin", + Demo3RaydiumCpmmInstructionKind::Withdraw => return "remove_liquidity", + _ => return "unclassified_instruction", + } +} + +fn demo3_raydium_cpmm_instruction_name( + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> &'static str { + match instruction_kind { + Demo3RaydiumCpmmInstructionKind::ClosePermissionPda => { + return "raydium_cpmm.close_permission_pda"; + }, + Demo3RaydiumCpmmInstructionKind::CollectCreatorFee => { + return "raydium_cpmm.collect_creator_fee"; + }, + Demo3RaydiumCpmmInstructionKind::CollectFundFee => return "raydium_cpmm.collect_fund_fee", + Demo3RaydiumCpmmInstructionKind::CollectProtocolFee => { + return "raydium_cpmm.collect_protocol_fee"; + }, + Demo3RaydiumCpmmInstructionKind::CreateAmmConfig => return "raydium_cpmm.create_amm_config", + Demo3RaydiumCpmmInstructionKind::CreatePermissionPda => { + return "raydium_cpmm.create_permission_pda"; + }, + Demo3RaydiumCpmmInstructionKind::Deposit => return "raydium_cpmm.deposit", + Demo3RaydiumCpmmInstructionKind::Initialize => return "raydium_cpmm.initialize", + Demo3RaydiumCpmmInstructionKind::InitializeWithPermission => { + return "raydium_cpmm.initialize_with_permission"; + }, + Demo3RaydiumCpmmInstructionKind::UpdateAmmConfig => return "raydium_cpmm.update_amm_config", + Demo3RaydiumCpmmInstructionKind::UpdatePoolStatus => { + return "raydium_cpmm.update_pool_status"; + }, + Demo3RaydiumCpmmInstructionKind::Withdraw => return "raydium_cpmm.withdraw", + Demo3RaydiumCpmmInstructionKind::SwapBaseInput => return "raydium_cpmm.swap_base_input", + Demo3RaydiumCpmmInstructionKind::SwapBaseOutput => return "raydium_cpmm.swap_base_output", + Demo3RaydiumCpmmInstructionKind::Unknown => return "raydium_cpmm.unknown", + } +} + +fn demo3_raydium_cpmm_pool_account( + accounts: &[std::string::String], + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> std::option::Option { + let index = match instruction_kind { + Demo3RaydiumCpmmInstructionKind::CollectCreatorFee => Some(2usize), + Demo3RaydiumCpmmInstructionKind::CollectFundFee => Some(2usize), + Demo3RaydiumCpmmInstructionKind::CollectProtocolFee => Some(2usize), + Demo3RaydiumCpmmInstructionKind::Deposit => Some(2usize), + Demo3RaydiumCpmmInstructionKind::Initialize => Some(3usize), + Demo3RaydiumCpmmInstructionKind::InitializeWithPermission => Some(4usize), + Demo3RaydiumCpmmInstructionKind::UpdatePoolStatus => Some(1usize), + Demo3RaydiumCpmmInstructionKind::Withdraw => Some(2usize), + _ => None, + }; + let index = match index { + Some(index) => index, + None => return None, + }; + return demo3_account_at(accounts, index); +} + +fn demo3_raydium_cpmm_token_a_mint( + accounts: &[std::string::String], + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> std::option::Option { + let index = match instruction_kind { + Demo3RaydiumCpmmInstructionKind::CollectCreatorFee => Some(6usize), + Demo3RaydiumCpmmInstructionKind::CollectFundFee => Some(6usize), + Demo3RaydiumCpmmInstructionKind::CollectProtocolFee => Some(6usize), + Demo3RaydiumCpmmInstructionKind::Deposit => Some(10usize), + Demo3RaydiumCpmmInstructionKind::Initialize => Some(4usize), + Demo3RaydiumCpmmInstructionKind::InitializeWithPermission => Some(5usize), + Demo3RaydiumCpmmInstructionKind::Withdraw => Some(10usize), + _ => None, + }; + let index = match index { + Some(index) => index, + None => return None, + }; + return demo3_account_at(accounts, index); +} + +fn demo3_raydium_cpmm_token_b_mint( + accounts: &[std::string::String], + instruction_kind: Demo3RaydiumCpmmInstructionKind, +) -> std::option::Option { + let index = match instruction_kind { + Demo3RaydiumCpmmInstructionKind::CollectCreatorFee => Some(7usize), + Demo3RaydiumCpmmInstructionKind::CollectFundFee => Some(7usize), + Demo3RaydiumCpmmInstructionKind::CollectProtocolFee => Some(7usize), + Demo3RaydiumCpmmInstructionKind::Deposit => Some(11usize), + Demo3RaydiumCpmmInstructionKind::Initialize => Some(5usize), + Demo3RaydiumCpmmInstructionKind::InitializeWithPermission => Some(6usize), + Demo3RaydiumCpmmInstructionKind::Withdraw => Some(11usize), + _ => None, + }; + let index = match index { + Some(index) => index, + None => return None, + }; + return demo3_account_at(accounts, index); +} + +fn demo3_raydium_cpmm_backfill_hint( + instruction_kind: Demo3RaydiumCpmmInstructionKind, + candidate_kind: &str, + pool_address: std::option::Option<&str>, + signature: &str, +) -> std::string::String { + let instruction_name = demo3_raydium_cpmm_instruction_name(instruction_kind); + if let Some(pool_address) = pool_address { + return format!( + "Raydium CPMM {} candidate '{}'; backfill pool in Demo Pipeline 2: {} ; signature: {}", + candidate_kind, instruction_name, pool_address, signature + ); + } + return format!( + "Raydium CPMM {} candidate '{}'; inspect/backfill transaction signature: {}", + candidate_kind, instruction_name, signature + ); +} + fn decode_meteora_damm_v1_candidate( signature: &str, slot: std::option::Option, @@ -1345,6 +1714,7 @@ fn decode_meteora_damm_v1_candidate( inner_instruction_index: instruction.inner_instruction_index, instruction_name: Some(instruction_name), instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex(instruction.data.as_deref()), pool_address, token_a_mint, token_b_mint, @@ -1616,6 +1986,7 @@ fn build_heuristic_candidate( inner_instruction_index: instruction.inner_instruction_index, instruction_name, instruction_data_prefix: instruction_data_prefix(instruction.data.as_deref()), + instruction_discriminator_hex: instruction_discriminator_hex(instruction.data.as_deref()), pool_address: pool_address.clone(), token_a_mint, token_b_mint, @@ -2789,8 +3160,21 @@ fn target_event_prefers_instruction_local_classification( return false; } -fn target_event_keeps_mixed_swap_transactions(target_event: std::option::Option<&str>) -> bool { - return !split_target_event_filter(target_event).is_empty(); +fn target_event_keeps_mixed_swap_transactions( + target_event: std::option::Option<&str>, + target_instruction_name: std::option::Option<&str>, + target_discriminator_hex: std::option::Option<&str>, +) -> bool { + if !split_target_event_filter(target_event).is_empty() { + return true; + } + if !split_comma_filter(target_instruction_name).is_empty() { + return true; + } + if !split_comma_filter(target_discriminator_hex).is_empty() { + return true; + } + return false; } fn instruction_data_prefix( @@ -2813,6 +3197,23 @@ fn instruction_data_prefix( return Some(prefix); } +fn instruction_discriminator_hex( + data: std::option::Option<&str>, +) -> std::option::Option { + let decoded = match decode_onchain_instruction_data(data) { + Some(decoded) => decoded, + None => return None, + }; + if decoded.len() < 8 { + return None; + } + let mut text = std::string::String::new(); + for byte in &decoded[0..8] { + text.push_str(format!("{:02x}", byte).as_str()); + } + return Some(text); +} + fn text_matches_non_swap_target(lower: &str) -> bool { return text_matches_pool_admin(lower) || text_matches_claim_reward(lower) @@ -3016,6 +3417,77 @@ fn first_matching_target_event( return None; } +fn candidate_matches_instruction_filters( + candidate: &crate::OnchainDexPairCandidateDto, + target_instruction_name: std::option::Option<&str>, + target_discriminator_hex: std::option::Option<&str>, +) -> bool { + if !candidate_matches_instruction_name_filter(candidate, target_instruction_name) { + return false; + } + if !candidate_matches_discriminator_filter(candidate, target_discriminator_hex) { + return false; + } + return true; +} + +fn candidate_matches_instruction_name_filter( + candidate: &crate::OnchainDexPairCandidateDto, + target_instruction_name: std::option::Option<&str>, +) -> bool { + let targets = split_comma_filter(target_instruction_name); + if targets.is_empty() { + return true; + } + let instruction_name = match &candidate.instruction_name { + Some(instruction_name) => instruction_name.to_ascii_lowercase(), + None => return false, + }; + for target in targets { + if instruction_name == target || instruction_name.ends_with(format!(".{}", target).as_str()) + { + return true; + } + } + return false; +} + +fn candidate_matches_discriminator_filter( + candidate: &crate::OnchainDexPairCandidateDto, + target_discriminator_hex: std::option::Option<&str>, +) -> bool { + let targets = split_comma_filter(target_discriminator_hex); + if targets.is_empty() { + return true; + } + let discriminator_hex = match &candidate.instruction_discriminator_hex { + Some(discriminator_hex) => discriminator_hex.to_ascii_lowercase(), + None => return false, + }; + for target in targets { + if discriminator_hex == target { + return true; + } + } + return false; +} + +fn split_comma_filter(value: std::option::Option<&str>) -> std::vec::Vec { + let value = match value { + Some(value) => value, + None => return std::vec::Vec::new(), + }; + let mut output = std::vec::Vec::new(); + for token in value.split(',') { + let token = token.trim(); + if token.is_empty() { + continue; + } + push_unique_string(&mut output, token.to_string()); + } + return output; +} + fn candidate_matches_target_event( candidate: &crate::OnchainDexPairCandidateDto, target_event: std::option::Option<&str>, @@ -3027,10 +3499,10 @@ fn candidate_matches_single_target_event( candidate: &crate::OnchainDexPairCandidateDto, target_event: &str, ) -> bool { - if target_event == "unknown_non_swap" - || target_event == "audit_non_swap_like" - || target_event == "non_swap" - { + if target_event == "unknown_non_swap" { + return candidate_is_unknown_non_swap_candidate(candidate); + } + if target_event == "audit_non_swap_like" || target_event == "non_swap" { return candidate_is_non_swap_audit_candidate(candidate); } if target_event == "unclassified_instruction" { @@ -3180,6 +3652,24 @@ fn candidate_kind_is_explicit_surface(candidate_kind: &str) -> bool { || candidate_kind == "close_market"; } +fn candidate_is_unknown_non_swap_candidate(candidate: &crate::OnchainDexPairCandidateDto) -> bool { + if candidate.candidate_kind == "swap" || candidate_is_known_trade_like_surface(candidate) { + return false; + } + if candidate_kind_is_explicit_surface(candidate.candidate_kind.as_str()) { + return false; + } + if candidate.candidate_kind == "unclassified_instruction" + || candidate.candidate_kind == "program_activity" + || candidate.candidate_kind == "liquidity_or_position" + || candidate.candidate_kind == "non_swap_activity" + || candidate.candidate_kind == "upstream_git_instruction" + { + return true; + } + return candidate.instruction_data_prefix.is_some() && candidate.instruction_name.is_none(); +} + fn candidate_is_non_swap_audit_candidate(candidate: &crate::OnchainDexPairCandidateDto) -> bool { if candidate.candidate_kind == "swap" || candidate_is_known_trade_like_surface(candidate) { return false; @@ -3659,6 +4149,8 @@ mod tests { max_pages: 1, scan_order: None, target_event: None, + target_instruction_name: None, + target_discriminator_hex: None, exclude_swaps: false, include_failed: true, http_role: "history_backfill".to_string(), @@ -3689,6 +4181,8 @@ mod tests { max_pages: 1, scan_order: None, target_event: None, + target_instruction_name: None, + target_discriminator_hex: None, exclude_swaps: false, include_failed: true, http_role: "history_backfill".to_string(), @@ -3713,6 +4207,8 @@ mod tests { max_pages: 1, scan_order: None, target_event: None, + target_instruction_name: None, + target_discriminator_hex: None, exclude_swaps: false, include_failed: true, http_role: "history_backfill".to_string(), @@ -3762,11 +4258,13 @@ mod tests { } }); let extraction = super::extract_candidates_from_transaction( - "sig-openbook-v2-raw", + "sig-openbook_v2-raw", &transaction, crate::OPENBOOK_V2_PROGRAM_ID, Some("openbook_v2".to_string()), Some("order_place"), + None, + None, ); assert_eq!(extraction.extracted_candidate_count, 1); assert_eq!(extraction.target_rejected_candidate_count, 0); @@ -3833,6 +4331,7 @@ mod tests { inner_instruction_index: Some(2), instruction_name: None, instruction_data_prefix: Some("EVM9wLnauu9H41Gf".to_string()), + instruction_discriminator_hex: None, pool_address: None, token_a_mint: None, token_b_mint: None, @@ -3987,6 +4486,8 @@ mod tests { max_pages: 2, scan_order: Some("oldest_first".to_string()), target_event: Some("claim_fee,remove_liquidity".to_string()), + target_instruction_name: None, + target_discriminator_hex: None, exclude_swaps: true, include_failed: true, http_role: "history_backfill".to_string(), @@ -4036,6 +4537,7 @@ mod tests { inner_instruction_index: None, instruction_name: Some(instruction_name.to_string()), instruction_data_prefix: Some("prefix".to_string()), + instruction_discriminator_hex: None, pool_address: None, token_a_mint: None, token_b_mint: None, @@ -4076,7 +4578,41 @@ mod tests { fn target_filter_accepts_open_orders_close_candidates() { let candidate = make_candidate("open_orders_close", "CloseOpenOrdersAccount"); assert!(super::candidate_matches_target_event(&candidate, Some("open_orders_close"))); - assert!(super::candidate_matches_target_event(&candidate, Some("unknown_non_swap"))); + assert!(!super::candidate_matches_target_event(&candidate, Some("unknown_non_swap"))); + assert!(super::candidate_matches_target_event(&candidate, Some("audit_non_swap_like"))); assert!(!super::candidate_matches_target_event(&candidate, Some("close_market"))); } + #[test] + fn target_filter_rejects_known_surface_for_unknown_non_swap() { + let candidate = make_candidate("claim_fee", "CollectProtocolFee"); + assert!(!super::candidate_matches_target_event(&candidate, Some("unknown_non_swap"))); + assert!(super::candidate_matches_target_event(&candidate, Some("audit_non_swap_like"))); + } + + #[test] + fn target_filter_accepts_unclassified_instruction_for_unknown_non_swap() { + let candidate = make_candidate("unclassified_instruction", "UnknownInstruction"); + assert!(super::candidate_matches_target_event(&candidate, Some("unknown_non_swap"))); + } + + #[test] + fn target_instruction_filters_match_name_and_discriminator() { + let mut candidate = make_candidate("remove_liquidity", "raydium_cpmm.withdraw"); + candidate.instruction_discriminator_hex = Some("b712469c946da122".to_string()); + assert!(super::candidate_matches_instruction_filters( + &candidate, + Some("withdraw"), + Some("b712469c946da122") + )); + assert!(!super::candidate_matches_instruction_filters( + &candidate, + Some("deposit"), + Some("b712469c946da122") + )); + assert!(!super::candidate_matches_instruction_filters( + &candidate, + Some("withdraw"), + Some("f223c68952e1f2b6") + )); + } } diff --git a/kb_lib/src/pool_origin.rs b/kb_lib/src/pool_origin.rs index bb41c7d..67524d9 100644 --- a/kb_lib/src/pool_origin.rs +++ b/kb_lib/src/pool_origin.rs @@ -299,7 +299,7 @@ mod tests { "instructions": [ { "programId": crate::METEORA_DBC_PROGRAM_ID, - "program": "meteora-dbc", + "program": "meteora_dbc", "stackHeight": 1, "accounts": [ "DbcOriginPool111", diff --git a/kb_lib/src/token_backfill.rs b/kb_lib/src/token_backfill.rs index ad4acf7..4983fdc 100644 --- a/kb_lib/src/token_backfill.rs +++ b/kb_lib/src/token_backfill.rs @@ -288,6 +288,7 @@ impl TokenBackfillService { } } self.backfill_missing_token_metadata_best_effort(100).await; + self.refresh_event_coverage_best_effort().await; let summary_payload = serde_json::json!({ "tokenMint": result.token_mint, "mintSignatureCount": result.mint_signature_count, @@ -572,6 +573,26 @@ impl TokenBackfillService { if let Err(error) = transaction_classification_result { return Err(error); } + let instruction_observation_index = + crate::InstructionObservationIndexService::new(self.database.clone()); + let instruction_observation_result = + instruction_observation_index.refresh_signature(signature.as_str()).await; + match instruction_observation_result { + Ok(index_result) => { + tracing::debug!( + signature = %signature, + upserted_observation_count = index_result.upserted_observation_count, + "instruction observation index refreshed after signature replay" + ); + }, + Err(error) => { + tracing::warn!( + signature = %signature, + error = %error, + "instruction observation index refresh failed after signature replay" + ); + }, + } return Ok(TokenBackfillSignatureResult { resolved_transaction_count: 1, missing_transaction_count: 0, @@ -715,6 +736,7 @@ impl TokenBackfillService { } } self.backfill_missing_token_metadata_best_effort(100).await; + self.refresh_event_coverage_best_effort().await; let summary_payload = serde_json::json!({ "poolAddress": result.pool_address, "poolSignatureCount": result.pool_signature_count, @@ -785,6 +807,7 @@ impl TokenBackfillService { Err(error) => return Err(error), }; self.backfill_missing_token_metadata_best_effort(100).await; + self.refresh_event_coverage_best_effort().await; let result = crate::SignatureBackfillResult { signature: trimmed_signature.clone(), resolved_transaction_count: replay.resolved_transaction_count, @@ -918,6 +941,26 @@ impl TokenBackfillService { }, } } + + async fn refresh_event_coverage_best_effort(&self) { + let coverage_service = crate::DexEventCoverageService::new(self.database.clone()); + let refresh_result = coverage_service.refresh_local_counts(None).await; + match refresh_result { + Ok(refresh_result) => { + tracing::debug!( + upserted_entry_count = refresh_result.upserted_entry_count, + summary_count = refresh_result.summaries.len(), + "dex event coverage refreshed after historical replay" + ); + }, + Err(error) => { + tracing::warn!( + error = %error, + "dex event coverage refresh failed after historical replay" + ); + }, + } + } } fn token_backfill_should_retry_http_error(error: &crate::Error) -> bool { diff --git a/kb_lib/src/upstream_registry.rs b/kb_lib/src/upstream_registry.rs index be2e19f..401c60e 100644 --- a/kb_lib/src/upstream_registry.rs +++ b/kb_lib/src/upstream_registry.rs @@ -43,7 +43,7 @@ mod tests { fn service_search_preserves_normalized_request() { let service = crate::UpstreamRegistryService::new(); let request = crate::UpstreamRegistrySearchRequestDto { - decoder_code: Some("raydium-cpmm".to_string()), + decoder_code: Some("raydium_cpmm".to_string()), program_id: None, program_family: None, surface_kind: None, diff --git a/kb_lib/src/upstream_registry_generated.rs b/kb_lib/src/upstream_registry_generated.rs index 2304cdc..b568fff 100644 --- a/kb_lib/src/upstream_registry_generated.rs +++ b/kb_lib/src/upstream_registry_generated.rs @@ -87,14 +87,14 @@ const fn upstream_git_discriminator_entry( /// Static registry snapshot for 0.7.47 upstream Git discovery preparation. pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ upstream_git_program_entry( - "address-lookup-table", + "address_lookup_table", Some(crate::ADDRESS_LOOKUP_TABLE_PROGRAM_ID), "solana_core", "lookup_table", "decoders/address-lookup-table-decoder/src/lib.rs", ), upstream_git_program_entry( - "associated-token-account", + "associated_token_account", Some(crate::ASSOCIATED_TOKEN_PROGRAM_ID), "spl_associated_token_account", "token_account", @@ -108,8 +108,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/bonkswap-decoder/src/lib.rs", ), upstream_git_program_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", "decoders/boop-decoder/src/lib.rs", @@ -122,28 +122,28 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/bubblegum_decoder/src/lib.rs", ), upstream_git_program_entry( - "circle-message-transmitter-v2", + "circle_message_transmitter_v2", Some(crate::CIRCLE_MESSAGE_TRANSMITTER_V2_PROGRAM_ID), "circle", "bridge_messaging", "decoders/circle-message-transmitter-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "circle-token-messenger-v2", + "circle_token_messenger_v2", Some(crate::CIRCLE_TOKEN_MESSENGER_V2_PROGRAM_ID), "circle", "bridge_token", "decoders/circle-token-messenger-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", "decoders/dflow-aggregator-v4-decoder/src/lib.rs", ), upstream_git_program_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -171,133 +171,133 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/heaven-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-dca", + "jupiter_dca", Some(crate::JUPITER_DCA_PROGRAM_ID), "jupiter", "dca", "decoders/jupiter-dca-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", "decoders/jupiter-lend-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-limit-order-2", + "jupiter_limit_order_2", Some(crate::JUPITER_LIMIT_ORDER_2_PROGRAM_ID), "jupiter", "limit_order", "decoders/jupiter-limit-order-2-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-limit-order", + "jupiter_limit_order", Some(crate::JUPITER_LIMIT_ORDER_PROGRAM_ID), "jupiter", "limit_order", "decoders/jupiter-limit-order-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-perpetuals", + "jupiter_perpetuals", Some(crate::JUPITER_PERPETUALS_PROGRAM_ID), "jupiter", "perps", "decoders/jupiter-perpetuals-decoder/src/lib.rs", ), upstream_git_program_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", "decoders/jupiter-swap-decoder/src/lib.rs", ), upstream_git_program_entry( - "kamino-farms", + "kamino_farms", Some(crate::KAMINO_FARMS_PROGRAM_ID), "kamino", "farms", "decoders/kamino-farms-decoder/src/lib.rs", ), upstream_git_program_entry( - "kamino-lending", + "kamino_lending", Some(crate::KAMINO_LENDING_PROGRAM_ID), "kamino", "lending", "decoders/kamino-lending-decoder/src/lib.rs", ), upstream_git_program_entry( - "kamino-limit-order", + "kamino_limit_order", Some(crate::KAMINO_LIMIT_ORDER_PROGRAM_ID), "kamino", "limit_order", "decoders/kamino-limit-order-decoder/src/lib.rs", ), upstream_git_program_entry( - "kamino-vault", + "kamino_vault", Some(crate::KAMINO_VAULT_PROGRAM_ID), "kamino", "vault", "decoders/kamino-vault-decoder/src/lib.rs", ), upstream_git_program_entry( - "lifinity-amm-v2", + "lifinity_v2", Some(crate::LIFINITY_AMM_V2_PROGRAM_ID), "lifinity", "amm", "decoders/lifinity-amm-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", "decoders/marginfi-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "marinade-finance", + "marinade_finance", Some(crate::MARINADE_FINANCE_PROGRAM_ID), "marinade", "staking", "decoders/marinade-finance-decoder/src/lib.rs", ), upstream_git_program_entry( - "memo-program", + "memo_program", Some(crate::MEMO_PROGRAM_ID), "solana_core", "memo", "decoders/memo-program-decoder/src/lib.rs", ), upstream_git_program_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", "decoders/meteora-damm-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", "decoders/meteora-dbc-decoder/src/lib.rs", ), upstream_git_program_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", "decoders/meteora-dlmm-decoder/src/lib.rs", ), upstream_git_program_entry( - "meteora-pools", + "meteora_damm_v1", Some(crate::METEORA_DAMM_V1_PROGRAM_ID), "meteora", "amm", "decoders/meteora-pools-decoder/src/lib.rs", ), upstream_git_program_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -311,132 +311,132 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/moonshot-decoder/src/lib.rs", ), upstream_git_program_entry( - "mpl-core", + "mpl_core", Some(crate::MPL_CORE_PROGRAM_ID), "metaplex", "metadata", "decoders/mpl-core-decoder/src/lib.rs", ), upstream_git_program_entry( - "mpl-token-metadata", + "mpl_token_metadata", Some(crate::MPL_TOKEN_METADATA_PROGRAM_ID), "metaplex", "metadata", "decoders/mpl-token-metadata-decoder/src/lib.rs", ), upstream_git_program_entry( - "name-service", + "name_service", Some(crate::NAME_SERVICE_PROGRAM_ID), "solana_name_service", "name_service", "decoders/name-service-decoder/src/lib.rs", ), upstream_git_program_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", "decoders/okx-dex-decoder/src/lib.rs", ), upstream_git_alias_program_entry( - "onchain-labs-dex-v1", + "onchain_labs_dex_v1", "onchain_labs", "amm", "decoders/onchain-labs-dex-v1-decoder/src/lib.rs", ), upstream_git_program_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", "decoders/onchain-labs-dex-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", "decoders/openbook-v2-decoder/src/lib.rs", ), upstream_git_program_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", "decoders/orca-whirlpool-decoder/src/lib.rs", ), upstream_git_program_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", "decoders/pancake-swap-decoder/src/lib.rs", ), upstream_git_program_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", "decoders/phoenix-v1-decoder/src/lib.rs", ), upstream_git_program_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", "decoders/pump-fees-decoder/src/lib.rs", ), upstream_git_program_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", "decoders/pump-swap-decoder/src/lib.rs", ), upstream_git_program_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", "decoders/pumpfun-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", "decoders/raydium-amm-v4-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", "decoders/raydium-clmm-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", "decoders/raydium-cpmm-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", "decoders/raydium-launchpad-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", "decoders/raydium-liquidity-locking-decoder/src/lib.rs", ), upstream_git_program_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -450,28 +450,28 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/sharky-decoder/src/lib.rs", ), upstream_git_program_entry( - "solayer-restaking-program", + "solayer_restaking_program", Some(crate::SOLAYER_RESTAKING_PROGRAM_ID), "solayer", "restaking", "decoders/solayer-restaking-program-decoder/src/lib.rs", ), upstream_git_program_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", "decoders/stabble-stable-swap-decoder/src/lib.rs", ), upstream_git_program_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", "decoders/stabble-weighted-swap-decoder/src/lib.rs", ), upstream_git_program_entry( - "stake-program", + "stake_program", Some(crate::STAKE_PROGRAM_ID), "solana_core", "stake", @@ -485,21 +485,21 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/swig-decoder/src/lib.rs", ), upstream_git_program_entry( - "system-program", + "system_program", Some(crate::SYSTEM_PROGRAM_ID), "solana_core", "core", "decoders/system-program-decoder/src/lib.rs", ), upstream_git_program_entry( - "token-2022", + "token_2022", Some(crate::SPL_TOKEN_2022_PROGRAM_ID), "spl_token", "token", "decoders/token-2022-decoder/src/lib.rs", ), upstream_git_program_entry( - "token-program", + "token_program", Some(crate::SPL_TOKEN_PROGRAM_ID), "spl_token", "token", @@ -534,7 +534,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/zeta-decoder/src/lib.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -545,7 +545,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/add_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -556,7 +556,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/claim_partner_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -567,7 +567,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/claim_position_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -578,7 +578,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/claim_protocol_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -589,7 +589,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/claim_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -600,7 +600,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/close_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -611,7 +611,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/close_operator_account.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -622,7 +622,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/close_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -633,7 +633,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/close_token_badge.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -644,7 +644,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -655,7 +655,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/create_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -666,7 +666,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/create_dynamic_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -677,7 +677,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/create_operator_account.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -688,7 +688,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/create_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -699,7 +699,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/create_token_badge.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -710,7 +710,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/dummy_ix.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -721,7 +721,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/fund_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -732,7 +732,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/initialize_customizable_pool.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -743,7 +743,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/initialize_pool.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -754,7 +754,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/initialize_pool_with_dynamic_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -765,7 +765,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/initialize_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -776,7 +776,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/lock_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -787,7 +787,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/permanent_lock_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -798,7 +798,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/refresh_vesting.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -809,7 +809,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/remove_all_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -820,7 +820,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/remove_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -831,7 +831,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/set_pool_status.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -842,7 +842,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/split_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -853,7 +853,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/split_position2.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -864,7 +864,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -875,7 +875,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/swap2.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -886,7 +886,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/update_pool_fees.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -897,7 +897,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/update_reward_duration.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -908,7 +908,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/update_reward_funder.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -919,7 +919,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/instructions/withdraw_ineligible_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -930,7 +930,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_claim_partner_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -941,7 +941,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_claim_position_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -952,7 +952,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_claim_protocol_fee.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -963,7 +963,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_claim_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -974,7 +974,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_close_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -985,7 +985,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_close_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -996,7 +996,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_create_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1007,7 +1007,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_create_dynamic_config.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1018,7 +1018,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_create_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1029,7 +1029,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_create_token_badge.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1040,7 +1040,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_fund_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1051,7 +1051,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_initialize_pool.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1062,7 +1062,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_initialize_reward.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1073,7 +1073,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_liquidity_change.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1084,7 +1084,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_lock_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1095,7 +1095,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_permanent_lock_position.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1106,7 +1106,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_set_pool_status.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1117,7 +1117,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_split_position2.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1128,7 +1128,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_swap2.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1139,7 +1139,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_update_pool_fees.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1150,7 +1150,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_update_reward_duration.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1161,7 +1161,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-damm-v2-decoder/src/events/evt_update_reward_funder.rs", ), upstream_git_discriminator_entry( - "meteora-damm-v2", + "meteora_damm_v2", Some(crate::METEORA_DAMM_V2_PROGRAM_ID), "meteora", "amm", @@ -1381,8 +1381,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/bonkswap-decoder/src/instructions/withdraw_shares.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1392,8 +1392,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/add_operators.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1403,8 +1403,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/authority_transfer_cancelled_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1414,8 +1414,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/authority_transfer_completed_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1425,8 +1425,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/authority_transfer_initiated_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1436,8 +1436,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/bonding_curve_deployed_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1447,8 +1447,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/bonding_curve_deployed_fallback_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1458,8 +1458,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/bonding_curve_vault_closed_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1469,8 +1469,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/buy_token.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1480,8 +1480,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/cancel_authority_transfer.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1491,8 +1491,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/close_bonding_curve_vault.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1502,8 +1502,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/collect_meteora_trading_fees.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1513,8 +1513,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/collect_trading_fees.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1524,8 +1524,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/complete_authority_transfer.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1535,8 +1535,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/config_updated_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1546,8 +1546,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/create_meteora_pool.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1557,8 +1557,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/create_raydium_pool.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1568,8 +1568,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/create_raydium_random_pool.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1579,8 +1579,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/create_token.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1590,8 +1590,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/create_token_fallback.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1601,8 +1601,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/deploy_bonding_curve.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1612,8 +1612,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/deploy_bonding_curve_fallback.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1623,8 +1623,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/deposit_into_raydium.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1634,8 +1634,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/graduate.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1645,8 +1645,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1656,8 +1656,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/initiate_authority_transfer.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1667,8 +1667,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/liquidity_deposited_into_raydium_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1678,8 +1678,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/lock_raydium_liquidity.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1689,8 +1689,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/operators_added_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1700,8 +1700,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/operators_removed_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1711,8 +1711,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/paused_toggled_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1722,8 +1722,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/raydium_liquidity_locked_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1733,8 +1733,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/raydium_pool_created_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1744,8 +1744,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/raydium_random_pool_created_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1755,8 +1755,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/remove_operators.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1766,8 +1766,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/sell_token.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1777,8 +1777,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/split_trading_fees.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1788,8 +1788,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/swap_sol_for_tokens_on_raydium.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1799,8 +1799,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/swap_sol_for_tokens_on_raydium_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1810,8 +1810,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/swap_tokens_for_sol_on_raydium.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1821,8 +1821,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/swap_tokens_for_sol_on_raydium_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1832,8 +1832,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/toggle_paused.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1843,8 +1843,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/token_bought_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1854,8 +1854,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/token_created_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1865,8 +1865,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/token_created_fallback_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1876,8 +1876,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/token_graduated_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1887,8 +1887,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/token_sold_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1898,8 +1898,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/trading_fees_collected_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_EVENT, @@ -1909,8 +1909,8 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/trading_fees_split_event.rs", ), upstream_git_discriminator_entry( - "boop", - Some(crate::BOOP_PROGRAM_ID), + "boop_fun", + Some(crate::BOOP_FUN_PROGRAM_ID), "boop", "launch", crate::ENTRY_KIND_INSTRUCTION, @@ -1920,7 +1920,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/boop-decoder/src/instructions/update_config.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1931,7 +1931,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/close_order.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1942,7 +1942,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1953,7 +1953,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/create_referral_token_account_idempotent.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1964,7 +1964,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/fill_order.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1975,7 +1975,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/open_order.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1986,7 +1986,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -1997,7 +1997,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap2.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2008,7 +2008,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap2_with_destination.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2019,7 +2019,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap2_with_destination_native.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2030,7 +2030,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap_with_destination.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2041,7 +2041,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/swap_with_destination_native.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2052,7 +2052,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/transfer_fee.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2063,7 +2063,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/transfer_sol.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2074,7 +2074,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/transfer_to_sponsor.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2085,7 +2085,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/unwrap_sol.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2096,7 +2096,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/instructions/wrap_sol.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2107,7 +2107,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/events/fee_event.rs", ), upstream_git_discriminator_entry( - "dflow-aggregator-v4", + "dflow_aggregator_v4", Some(crate::DFLOW_AGGREGATOR_V4_PROGRAM_ID), "dflow", "aggregator", @@ -2118,7 +2118,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/dflow-aggregator-v4-decoder/src/events/swap_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2129,7 +2129,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/add_insurance_fund_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2140,7 +2140,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/add_perp_lp_shares.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2151,7 +2151,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/admin_disable_update_perp_bid_ask_twap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2162,7 +2162,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/begin_swap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2173,7 +2173,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/cancel_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2184,7 +2184,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/cancel_order_by_user_id.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2195,7 +2195,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/cancel_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2206,7 +2206,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/cancel_orders_by_ids.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2217,7 +2217,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/cancel_request_remove_insurance_fund_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2228,7 +2228,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/curve_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2239,7 +2239,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_initialized_perp_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2250,7 +2250,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_initialized_spot_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2261,7 +2261,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_prelaunch_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2272,7 +2272,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_signed_msg_user_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2283,7 +2283,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_user.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2294,7 +2294,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/delete_user_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2305,7 +2305,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2316,7 +2316,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/deposit_into_perp_market_fee_pool.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2327,7 +2327,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/deposit_into_spot_market_revenue_pool.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2338,7 +2338,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/deposit_into_spot_market_vault.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2349,7 +2349,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/deposit_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2360,7 +2360,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/disable_user_high_leverage_mode.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2371,7 +2371,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/enable_user_high_leverage_mode.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2382,7 +2382,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/end_swap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2393,7 +2393,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/fill_perp_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2404,7 +2404,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/fill_spot_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2415,7 +2415,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/force_cancel_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2426,7 +2426,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/force_delete_user.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2437,7 +2437,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/fuel_season_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2448,7 +2448,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/fuel_sweep_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2459,7 +2459,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/funding_payment_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2470,7 +2470,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/funding_rate_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2481,7 +2481,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/init_user_fuel.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2492,7 +2492,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2503,7 +2503,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_fuel_overflow.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2514,7 +2514,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_high_leverage_mode_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2525,7 +2525,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_insurance_fund_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2536,7 +2536,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_openbook_v2_fulfillment_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2547,7 +2547,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_perp_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2558,7 +2558,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_phoenix_fulfillment_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2569,7 +2569,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_prediction_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2580,7 +2580,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_prelaunch_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2591,7 +2591,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_protected_maker_mode_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2602,7 +2602,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_protocol_if_shares_transfer_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2613,7 +2613,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_pyth_lazer_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2624,7 +2624,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_pyth_pull_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2635,7 +2635,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_referrer_name.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2646,7 +2646,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_serum_fulfillment_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2657,7 +2657,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_signed_msg_user_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2668,7 +2668,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_spot_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2679,7 +2679,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_user.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2690,7 +2690,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/initialize_user_stats.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2701,7 +2701,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/insurance_fund_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2712,7 +2712,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/insurance_fund_stake_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2723,7 +2723,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_borrow_for_perp_pnl.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2734,7 +2734,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_perp.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2745,7 +2745,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_perp_pnl_for_deposit.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2756,7 +2756,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_perp_with_fill.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2767,7 +2767,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_spot.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2778,7 +2778,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_spot_with_swap_begin.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2789,7 +2789,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidate_spot_with_swap_end.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2800,7 +2800,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/liquidation_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2811,7 +2811,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/log_user_balances.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2822,7 +2822,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/lp_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2833,7 +2833,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/modify_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2844,7 +2844,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/modify_order_by_user_id.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2855,7 +2855,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/move_amm_price.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2866,7 +2866,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/new_user_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2877,7 +2877,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/openbook_v2_fulfillment_config_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2888,7 +2888,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/order_action_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2899,7 +2899,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/order_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2910,7 +2910,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/pause_spot_market_deposit_withdraw.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2921,7 +2921,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/phoenix_fulfillment_config_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2932,7 +2932,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_and_make_perp_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2943,7 +2943,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_and_make_signed_msg_perp_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2954,7 +2954,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_and_make_spot_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2965,7 +2965,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_and_take_perp_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2976,7 +2976,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_and_take_spot_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2987,7 +2987,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -2998,7 +2998,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_perp_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3009,7 +3009,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_signed_msg_taker_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3020,7 +3020,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/place_spot_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3031,7 +3031,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/post_multi_pyth_pull_oracle_updates_atomic.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3042,7 +3042,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/post_pyth_lazer_oracle_update.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3053,7 +3053,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/post_pyth_pull_oracle_update_atomic.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3064,7 +3064,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/recenter_perp_market_amm.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3075,7 +3075,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/reclaim_rent.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3086,7 +3086,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/remove_insurance_fund_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3097,7 +3097,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/remove_perp_lp_shares.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3108,7 +3108,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/remove_perp_lp_shares_in_expiring_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3119,7 +3119,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/repeg_amm_curve.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3130,7 +3130,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/request_remove_insurance_fund_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3141,7 +3141,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/reset_fuel_season.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3152,7 +3152,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/reset_perp_market_amm_oracle_twap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3163,7 +3163,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/resize_signed_msg_user_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3174,7 +3174,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/resolve_perp_bankruptcy.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3185,7 +3185,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/resolve_perp_pnl_deficit.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3196,7 +3196,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/resolve_spot_bankruptcy.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3207,7 +3207,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/revert_fill.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3218,7 +3218,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/set_user_status_to_being_liquidated.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3229,7 +3229,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_expired_market.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3240,7 +3240,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_expired_market_pools_to_revenue_pool.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3251,7 +3251,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_funding_payment.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3262,7 +3262,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_lp.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3273,7 +3273,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_multiple_pnls.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3284,7 +3284,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_pnl.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3295,7 +3295,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_pnl_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3306,7 +3306,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/settle_revenue_to_insurance_fund.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3317,7 +3317,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/signed_msg_order_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3328,7 +3328,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/spot_interest_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3339,7 +3339,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/spot_market_vault_deposit_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3350,7 +3350,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/swap_record_event.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3361,7 +3361,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/sweep_fuel.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3372,7 +3372,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/transfer_deposit.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3383,7 +3383,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/transfer_pools.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3394,7 +3394,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/transfer_protocol_if_shares.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3405,7 +3405,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/trigger_order.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3416,7 +3416,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_admin.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3427,7 +3427,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_amm_jit_intensity.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3438,7 +3438,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_amms.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3449,7 +3449,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_discount_mint.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3460,7 +3460,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_exchange_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3471,7 +3471,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_funding_rate.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3482,7 +3482,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_high_leverage_mode_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3493,7 +3493,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_initial_pct_to_liquidate.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3504,7 +3504,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_insurance_fund_unstaking_period.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3515,7 +3515,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_k.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3526,7 +3526,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_liquidation_duration.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3537,7 +3537,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_liquidation_margin_buffer_ratio.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3548,7 +3548,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_lp_cooldown_time.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3559,7 +3559,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_oracle_guard_rails.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3570,7 +3570,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_auction_duration.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3581,7 +3581,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_bid_ask_twap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3592,7 +3592,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_fee_structure.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3603,7 +3603,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_amm_oracle_twap.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3614,7 +3614,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_amm_summary_stats.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3625,7 +3625,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_base_spread.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3636,7 +3636,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_concentration_coef.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3647,7 +3647,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_contract_tier.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3658,7 +3658,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_curve_update_intensity.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3669,7 +3669,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_expiry.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3680,7 +3680,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_fee_adjustment.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3691,7 +3691,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_fuel.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3702,7 +3702,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_funding_period.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3713,7 +3713,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_high_leverage_margin_ratio.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3724,7 +3724,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_imf_factor.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3735,7 +3735,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_liquidation_fee.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3746,7 +3746,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_margin_ratio.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3757,7 +3757,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_max_fill_reserve_fraction.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3768,7 +3768,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_max_imbalances.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3779,7 +3779,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_max_open_interest.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3790,7 +3790,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_max_slippage_ratio.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3801,7 +3801,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_max_spread.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3812,7 +3812,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_min_order_size.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3823,7 +3823,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_name.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3834,7 +3834,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_number_of_users.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3845,7 +3845,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3856,7 +3856,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_paused_operations.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3867,7 +3867,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_per_lp_base.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3878,7 +3878,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3889,7 +3889,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_step_size_and_tick_size.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3900,7 +3900,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_target_base_asset_amount_per_lp.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3911,7 +3911,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_perp_market_unrealized_asset_weight.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3922,7 +3922,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_prelaunch_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3933,7 +3933,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_prelaunch_oracle_params.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3944,7 +3944,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_protected_maker_mode_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3955,7 +3955,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_protocol_if_shares_transfer_config.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3966,7 +3966,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_pyth_pull_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3977,7 +3977,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_serum_fulfillment_config_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3988,7 +3988,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_serum_vault.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -3999,7 +3999,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_auction_duration.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4010,7 +4010,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_fee_structure.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4021,7 +4021,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_asset_tier.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4032,7 +4032,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_borrow_rate.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4043,7 +4043,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_cumulative_interest.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4054,7 +4054,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_expiry.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4065,7 +4065,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_fee_adjustment.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4076,7 +4076,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_fuel.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4087,7 +4087,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_if_factor.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4098,7 +4098,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_if_paused_operations.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4109,7 +4109,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_liquidation_fee.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4120,7 +4120,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_margin_weights.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4131,7 +4131,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_max_token_borrows.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4142,7 +4142,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_max_token_deposits.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4153,7 +4153,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_min_order_size.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4164,7 +4164,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_name.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4175,7 +4175,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_oracle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4186,7 +4186,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_orders_enabled.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4197,7 +4197,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_paused_operations.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4208,7 +4208,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_pool_id.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4219,7 +4219,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_revenue_settle_period.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4230,7 +4230,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_scale_initial_asset_weight_start.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4241,7 +4241,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4252,7 +4252,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_spot_market_step_size_and_tick_size.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4263,7 +4263,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_state_max_initialize_user_fee.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4274,7 +4274,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_state_max_number_of_sub_accounts.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4285,7 +4285,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_state_settlement_duration.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4296,7 +4296,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_advanced_lp.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4307,7 +4307,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_custom_margin_ratio.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4318,7 +4318,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_delegate.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4329,7 +4329,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_fuel_bonus.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4340,7 +4340,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_gov_token_insurance_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4351,7 +4351,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_gov_token_insurance_stake_devnet.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4362,7 +4362,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_idle.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4373,7 +4373,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_margin_trading_enabled.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4384,7 +4384,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_name.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4395,7 +4395,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_open_orders_count.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4406,7 +4406,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_pool_id.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4417,7 +4417,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_protected_maker_orders.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4428,7 +4428,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_quote_asset_insurance_stake.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4439,7 +4439,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_reduce_only.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4450,7 +4450,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_user_stats_referrer_status.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4461,7 +4461,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_whitelist_mint.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4472,7 +4472,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/drift-v2-decoder/src/instructions/update_withdraw_guard_threshold.rs", ), upstream_git_discriminator_entry( - "drift-v2", + "drift_v2", Some(crate::DRIFT_V2_PROGRAM_ID), "drift", "perps", @@ -4956,7 +4956,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/heaven-decoder/src/instructions/user_defined_event.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -4967,7 +4967,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/change_status.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -4978,7 +4978,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/claim.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -4989,7 +4989,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/close_claim_account.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5000,7 +5000,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/collect_revenue.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5011,7 +5011,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5022,7 +5022,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/init_claim_account.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5033,7 +5033,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/init_liquidity.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5044,7 +5044,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/init_new_protocol.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5055,7 +5055,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/init_token_reserve.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5066,7 +5066,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/operate.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5077,7 +5077,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/pause_user.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5088,7 +5088,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/pre_operate.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5099,7 +5099,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/unpause_user.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5110,7 +5110,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_authority.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5121,7 +5121,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_auths.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5132,7 +5132,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_exchange_price.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5143,7 +5143,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_guardians.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5154,7 +5154,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_rate_data_v1.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5165,7 +5165,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_rate_data_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5176,7 +5176,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_revenue_collector.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5187,7 +5187,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_token_config.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5198,7 +5198,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_user_borrow_config.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5209,7 +5209,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_user_class.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5220,7 +5220,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_user_supply_config.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5231,7 +5231,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/instructions/update_user_withdrawal_limit.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5242,7 +5242,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_borrow_rate_cap.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5253,7 +5253,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_change_status.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5264,7 +5264,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_claim.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5275,7 +5275,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_collect_revenue.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5286,7 +5286,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_operate.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5297,7 +5297,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_pause_user.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5308,7 +5308,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_unpause_user.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5319,7 +5319,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_authority.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5330,7 +5330,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_auths.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5341,7 +5341,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_exchange_prices.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5352,7 +5352,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_guardians.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5363,7 +5363,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_rate_data_v1.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5374,7 +5374,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_rate_data_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5385,7 +5385,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_revenue_collector.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5396,7 +5396,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_token_configs.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5407,7 +5407,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_user_borrow_configs.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5418,7 +5418,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_user_class.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5429,7 +5429,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_user_supply_configs.rs", ), upstream_git_discriminator_entry( - "jupiter-lend", + "jupiter_lend", Some(crate::JUPITER_LEND_PROGRAM_ID), "jupiter", "lending", @@ -5440,7 +5440,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-lend-decoder/src/events/log_update_user_withdrawal_limit.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5451,7 +5451,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/claim.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5462,7 +5462,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/claim_token.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5473,7 +5473,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/close_token.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5484,7 +5484,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5495,7 +5495,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/create_token_account.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5506,7 +5506,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/create_token_ledger.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5517,7 +5517,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/exact_out_route.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5528,7 +5528,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/exact_out_route_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5539,7 +5539,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/route.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5550,7 +5550,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/route_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5561,7 +5561,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/route_with_token_ledger.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5572,7 +5572,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/set_token_ledger.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5583,7 +5583,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/shared_accounts_exact_out_route.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5594,7 +5594,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/shared_accounts_exact_out_route_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5605,7 +5605,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/shared_accounts_route.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5616,7 +5616,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/shared_accounts_route_v2.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5627,7 +5627,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/instructions/shared_accounts_route_with_token_ledger.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5638,7 +5638,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/events/best_swap_out_amount_violation.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5649,7 +5649,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/events/candidate_swap_results.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5660,7 +5660,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/events/fee_event.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5671,7 +5671,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/events/swap_event.rs", ), upstream_git_discriminator_entry( - "jupiter-swap", + "jupiter_swap", Some(crate::JUPITER_SWAP_PROGRAM_ID), "jupiter", "aggregator", @@ -5682,7 +5682,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/jupiter-swap-decoder/src/events/swaps_event.rs", ), upstream_git_discriminator_entry( - "lifinity-amm-v2", + "lifinity_v2", Some(crate::LIFINITY_AMM_V2_PROGRAM_ID), "lifinity", "amm", @@ -5693,7 +5693,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/lifinity-amm-v2-decoder/src/instructions/deposit_all_token_types.rs", ), upstream_git_discriminator_entry( - "lifinity-amm-v2", + "lifinity_v2", Some(crate::LIFINITY_AMM_V2_PROGRAM_ID), "lifinity", "amm", @@ -5704,7 +5704,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/lifinity-amm-v2-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "lifinity-amm-v2", + "lifinity_v2", Some(crate::LIFINITY_AMM_V2_PROGRAM_ID), "lifinity", "amm", @@ -5715,7 +5715,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/lifinity-amm-v2-decoder/src/instructions/withdraw_all_token_types.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5726,7 +5726,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_borrow.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5737,7 +5737,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_borrow_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5748,7 +5748,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_close_balance.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5759,7 +5759,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_deposit.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5770,7 +5770,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_deposit_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5781,7 +5781,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_end_flashloan.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5792,7 +5792,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_liquidate.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5803,7 +5803,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_liquidate_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5814,7 +5814,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_repay.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5825,7 +5825,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_repay_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5836,7 +5836,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_settle_emissions.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5847,7 +5847,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_start_flashloan.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5858,7 +5858,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_withdraw.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5869,7 +5869,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_withdraw_emissions.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5880,7 +5880,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_account_withdraw_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5891,7 +5891,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_accrue_bank_interest.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5902,7 +5902,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_add_bank.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5913,7 +5913,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_add_bank_with_seed.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5924,7 +5924,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_bank_accrue_interest_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5935,7 +5935,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_bank_collect_fees_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5946,7 +5946,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_bank_configure_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5957,7 +5957,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_bank_create_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5968,7 +5968,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_bank_handle_bankruptcy_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5979,7 +5979,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_collect_bank_fees.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -5990,7 +5990,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_configure_bank.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6001,7 +6001,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_handle_bankruptcy.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6012,7 +6012,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_setup_emissions.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6023,7 +6023,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/lending_pool_update_emissions_parameters.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6034,7 +6034,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_account_create_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6045,7 +6045,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_account_initialize.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6056,7 +6056,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_account_transfer_account_authority_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6067,7 +6067,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_group_configure.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6078,7 +6078,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_group_configure_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6089,7 +6089,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_group_create_event.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6100,7 +6100,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/marginfi_group_initialize.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6111,7 +6111,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/set_account_flag.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6122,7 +6122,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/set_new_account_authority.rs", ), upstream_git_discriminator_entry( - "marginfi-v2", + "marginfi_v2", Some(crate::MARGINFI_V2_PROGRAM_ID), "marginfi", "lending", @@ -6133,7 +6133,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/marginfi-v2-decoder/src/instructions/unset_account_flag.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6144,7 +6144,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/claim_creator_trading_fee.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6155,7 +6155,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/claim_protocol_fee.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6166,7 +6166,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/claim_trading_fee.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6177,7 +6177,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/close_claim_fee_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6188,7 +6188,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/create_claim_fee_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6199,7 +6199,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/create_config.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6210,7 +6210,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/create_locker.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6221,7 +6221,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/create_partner_metadata.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6232,7 +6232,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/create_virtual_pool_metadata.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6243,7 +6243,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/creator_withdraw_surplus.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6254,7 +6254,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_claim_creator_trading_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6265,7 +6265,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_claim_protocol_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6276,7 +6276,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_claim_trading_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6287,7 +6287,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_close_claim_fee_operator_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6298,7 +6298,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_create_claim_fee_operator_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6309,7 +6309,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_create_config_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6320,7 +6320,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_create_config_v2_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6331,7 +6331,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_create_damm_v2_migration_metadata_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6342,7 +6342,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_create_meteora_migration_metadata_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6353,7 +6353,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_creator_withdraw_surplus_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6364,7 +6364,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_curve_complete_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6375,7 +6375,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_initialize_pool_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6386,7 +6386,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_partner_metadata_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6397,7 +6397,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_partner_withdraw_migration_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6408,7 +6408,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_partner_withdraw_surplus_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6419,7 +6419,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_protocol_withdraw_surplus_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6430,7 +6430,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_swap2_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6441,7 +6441,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_swap_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6452,7 +6452,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_update_pool_creator_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6463,7 +6463,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_virtual_pool_metadata_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6474,7 +6474,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_withdraw_leftover_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6485,7 +6485,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/evt_withdraw_migration_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6496,7 +6496,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/initialize_virtual_pool_with_spl_token.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6507,7 +6507,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/initialize_virtual_pool_with_token2022.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6518,7 +6518,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migrate_meteora_damm.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6529,7 +6529,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migrate_meteora_damm_claim_lp_token.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6540,7 +6540,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migrate_meteora_damm_lock_lp_token.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6551,7 +6551,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migration_damm_v2.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6562,7 +6562,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migration_damm_v2_create_metadata.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6573,7 +6573,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/migration_meteora_damm_create_metadata.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6584,7 +6584,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/partner_withdraw_surplus.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6595,7 +6595,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/protocol_withdraw_surplus.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6606,7 +6606,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6617,7 +6617,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/swap2.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6628,7 +6628,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/transfer_pool_creator.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6639,7 +6639,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/withdraw_leftover.rs", ), upstream_git_discriminator_entry( - "meteora-dbc", + "meteora_dbc", Some(crate::METEORA_DBC_PROGRAM_ID), "meteora", "bonding_curve", @@ -6650,7 +6650,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dbc-decoder/src/instructions/withdraw_migration_fee.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6661,7 +6661,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6672,7 +6672,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6683,7 +6683,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_by_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6694,7 +6694,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_by_strategy2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6705,7 +6705,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_by_strategy_one_side.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6716,7 +6716,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_by_weight.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6727,7 +6727,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6738,7 +6738,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_one_side.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6749,7 +6749,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_one_side_precise.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6760,7 +6760,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/add_liquidity_one_side_precise2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6771,7 +6771,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_fee.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6782,7 +6782,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_fee2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6793,7 +6793,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6804,7 +6804,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_reward.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6815,7 +6815,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_reward2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6826,7 +6826,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/claim_reward_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6837,7 +6837,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_claim_protocol_fee_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6848,7 +6848,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_position.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6859,7 +6859,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_position2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6870,7 +6870,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_position_if_empty.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6881,7 +6881,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_preset_parameter.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6892,7 +6892,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/close_preset_parameter2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6903,7 +6903,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/composition_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6914,7 +6914,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/create_claim_protocol_fee_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6925,7 +6925,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/decrease_position_length_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6936,7 +6936,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/dynamic_fee_parameter_update_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6947,7 +6947,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/fee_parameter_update_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6958,7 +6958,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/fund_reward.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6969,7 +6969,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/fund_reward_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6980,7 +6980,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/go_to_a_bin.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -6991,7 +6991,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/go_to_a_bin_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7002,7 +7002,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/increase_observation_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7013,7 +7013,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/increase_oracle_length.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7024,7 +7024,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/increase_position_length_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7035,7 +7035,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_bin_array.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7046,7 +7046,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_bin_array_bitmap_extension.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7057,7 +7057,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_customizable_permissionless_lb_pair.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7068,7 +7068,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_customizable_permissionless_lb_pair2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7079,7 +7079,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_lb_pair.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7090,7 +7090,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_lb_pair2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7101,7 +7101,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_permission_lb_pair.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7112,7 +7112,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_position.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7123,7 +7123,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_position_by_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7134,7 +7134,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_position_pda.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7145,7 +7145,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_preset_parameter.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7156,7 +7156,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_preset_parameter2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7167,7 +7167,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_reward.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7178,7 +7178,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_reward_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7189,7 +7189,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/initialize_token_badge.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7200,7 +7200,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/lb_pair_create_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7211,7 +7211,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/migrate_bin_array.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7222,7 +7222,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/migrate_position.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7233,7 +7233,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/position_close_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7244,7 +7244,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/position_create_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7255,7 +7255,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_all_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7266,7 +7266,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_liquidity.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7277,7 +7277,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_liquidity2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7288,7 +7288,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_liquidity_by_range.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7299,7 +7299,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_liquidity_by_range2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7310,7 +7310,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/remove_liquidity_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7321,7 +7321,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/set_activation_point.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7332,7 +7332,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/set_pair_status.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7343,7 +7343,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/set_pair_status_permissionless.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7354,7 +7354,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/set_pre_activation_duration.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7365,7 +7365,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/set_pre_activation_swap_address.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7376,7 +7376,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7387,7 +7387,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7398,7 +7398,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7409,7 +7409,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap_exact_out.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7420,7 +7420,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap_exact_out2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7431,7 +7431,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap_with_price_impact.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7442,7 +7442,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/swap_with_price_impact2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7453,7 +7453,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_base_fee_parameters.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7464,7 +7464,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_dynamic_fee_parameters.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7475,7 +7475,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_fees_and_reward2.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7486,7 +7486,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_fees_and_rewards.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7497,7 +7497,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_position_lock_release_point_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7508,7 +7508,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_position_operator.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7519,7 +7519,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_position_operator_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7530,7 +7530,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_reward_duration.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7541,7 +7541,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_reward_duration_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7552,7 +7552,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_reward_funder.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7563,7 +7563,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/update_reward_funder_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7574,7 +7574,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/withdraw_ineligible_reward.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7585,7 +7585,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/withdraw_ineligible_reward_event.rs", ), upstream_git_discriminator_entry( - "meteora-dlmm", + "meteora_dlmm", Some(crate::METEORA_DLMM_PROGRAM_ID), "meteora", "dlmm", @@ -7596,7 +7596,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-dlmm-decoder/src/instructions/withdraw_protocol_fee.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7607,7 +7607,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/add_liquidity_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7618,7 +7618,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/add_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7629,7 +7629,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/claim_reward_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7640,7 +7640,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/collect_dust.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7651,7 +7651,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7662,7 +7662,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/deposit_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7673,7 +7673,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/enable_vault.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7684,7 +7684,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7695,7 +7695,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/initialize_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7706,7 +7706,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/performance_fee_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7717,7 +7717,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/remove_liquidity_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7728,7 +7728,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/remove_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7739,7 +7739,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/remove_strategy2.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7750,7 +7750,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/report_loss_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7761,7 +7761,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/set_operator.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7772,7 +7772,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/strategy_deposit_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7783,7 +7783,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/strategy_withdraw_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7794,7 +7794,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/total_amount_event.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7805,7 +7805,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7816,7 +7816,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/withdraw2.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7827,7 +7827,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/meteora-vault-decoder/src/instructions/withdraw_directly_from_strategy.rs", ), upstream_git_discriminator_entry( - "meteora-vault", + "meteora_vault", Some(crate::METEORA_VAULT_PROGRAM_ID), "meteora", "vault", @@ -7926,7 +7926,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/moonshot-decoder/src/instructions/trade_event.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7937,7 +7937,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_sol_from_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7948,7 +7948,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_sol_proxy_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7959,7 +7959,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_sol_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7970,7 +7970,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_sol_swap2.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7981,7 +7981,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_spl_from_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -7992,7 +7992,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_spl_proxy_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8003,7 +8003,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_spl_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8014,7 +8014,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/commission_spl_swap2.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8025,7 +8025,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/from_swap_log.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8036,7 +8036,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/proxy_swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8047,7 +8047,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8058,7 +8058,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/swap2.rs", ), upstream_git_discriminator_entry( - "okx-dex", + "okx_dex", Some(crate::OKX_DEX_PROGRAM_ID), "okx", "aggregator", @@ -8069,7 +8069,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/okx-dex-decoder/src/instructions/swap_event.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8080,7 +8080,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/claim.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8091,7 +8091,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8102,7 +8102,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/create_token_account.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8113,7 +8113,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/create_token_account_with_seed.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8124,7 +8124,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/proxy_swap.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8135,7 +8135,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8146,7 +8146,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap_tob.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8157,7 +8157,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap_tob_enhanced.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8168,7 +8168,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap_tob_with_receiver.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8179,7 +8179,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap_toc.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8190,7 +8190,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/swap_toc_v2.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8201,7 +8201,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/wrap_unwrap.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8212,7 +8212,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/instructions/wrap_unwrap_with_receiver.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8223,7 +8223,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/events/swap_cpi_event.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8234,7 +8234,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/events/swap_event.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8245,7 +8245,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/events/swap_to_c_with_fees_cpi_event_v2.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8256,7 +8256,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/events/swap_with_fees_cpi_event.rs", ), upstream_git_discriminator_entry( - "onchain-labs-dex-v2", + "onchain_labs_dex_v2", Some(crate::ONCHAIN_LABS_DEX_V2_PROGRAM_ID), "onchain_labs", "amm", @@ -8267,7 +8267,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/onchain-labs-dex-v2-decoder/src/events/swap_with_fees_cpi_event_enhanced.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8278,7 +8278,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/cancel_all_and_place_orders.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8289,7 +8289,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/cancel_all_orders.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8300,7 +8300,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/cancel_order.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8311,7 +8311,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/cancel_order_by_client_order_id.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8322,7 +8322,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/close_market.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8333,7 +8333,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/close_open_orders_account.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8344,7 +8344,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/close_open_orders_indexer.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8355,7 +8355,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/consume_events.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8366,7 +8366,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/consume_given_events.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8377,7 +8377,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/create_market.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8388,7 +8388,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/create_open_orders_account.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8399,7 +8399,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/create_open_orders_indexer.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8410,7 +8410,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8421,7 +8421,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/deposit_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8432,7 +8432,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/edit_order.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8443,7 +8443,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/edit_order_pegged.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8454,7 +8454,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/fill_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8465,7 +8465,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/market_meta_data_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8476,7 +8476,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/open_orders_position_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8487,7 +8487,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/place_order.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8498,7 +8498,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/place_order_pegged.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8509,7 +8509,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/place_orders.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8520,7 +8520,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/place_take_order.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8531,7 +8531,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/prune_orders.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8542,7 +8542,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/refill.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8553,7 +8553,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/set_delegate.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8564,7 +8564,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/set_delegate_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8575,7 +8575,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/set_market_expired.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8586,7 +8586,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/settle_funds.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8597,7 +8597,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/settle_funds_expired.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8608,7 +8608,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/settle_funds_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8619,7 +8619,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/stub_oracle_close.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8630,7 +8630,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/stub_oracle_create.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8641,7 +8641,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/stub_oracle_set.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8652,7 +8652,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/sweep_fees.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8663,7 +8663,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/sweep_fees_log_event.rs", ), upstream_git_discriminator_entry( - "openbook-v2", + "openbook_v2", Some(crate::OPENBOOK_V2_PROGRAM_ID), "openbook", "orderbook", @@ -8674,7 +8674,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/openbook-v2-decoder/src/instructions/total_order_fill_event.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8685,7 +8685,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/close_bundled_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8696,7 +8696,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/close_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8707,7 +8707,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/close_position_with_token_extensions.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8718,7 +8718,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_fees.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8729,7 +8729,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_fees_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8740,7 +8740,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_protocol_fees.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8751,7 +8751,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_protocol_fees_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8762,7 +8762,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_reward.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8773,7 +8773,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/collect_reward_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8784,7 +8784,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/decrease_liquidity.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8795,7 +8795,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/decrease_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8806,7 +8806,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/delete_position_bundle.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8817,7 +8817,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/delete_token_badge.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8828,7 +8828,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/increase_liquidity.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8839,7 +8839,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/increase_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8850,7 +8850,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_adaptive_fee_tier.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8861,7 +8861,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_config.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8872,7 +8872,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_config_extension.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8883,7 +8883,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_fee_tier.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8894,7 +8894,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_pool.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8905,7 +8905,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_pool_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8916,7 +8916,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_pool_with_adaptive_fee.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8927,7 +8927,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_position_bundle.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8938,7 +8938,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_position_bundle_with_metadata.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8949,7 +8949,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_reward.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8960,7 +8960,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_reward_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8971,7 +8971,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_tick_array.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8982,7 +8982,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/initialize_token_badge.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -8993,7 +8993,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/liquidity_decreased_event.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9004,7 +9004,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/liquidity_increased_event.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9015,7 +9015,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/lock_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9026,7 +9026,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/open_bundled_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9037,7 +9037,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/open_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9048,7 +9048,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/open_position_with_metadata.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9059,7 +9059,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/open_position_with_token_extensions.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9070,7 +9070,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/pool_initialized_event.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9081,7 +9081,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/reset_position_range.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9092,7 +9092,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_collect_protocol_fees_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9103,7 +9103,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_config_extension_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9114,7 +9114,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_default_base_fee_rate.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9125,7 +9125,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_default_fee_rate.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9136,7 +9136,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_default_protocol_fee_rate.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9147,7 +9147,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_delegated_fee_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9158,7 +9158,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_fee_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9169,7 +9169,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_fee_rate.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9180,7 +9180,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_fee_rate_by_delegated_fee_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9191,7 +9191,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_initialize_pool_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9202,7 +9202,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_preset_adaptive_fee_constants.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9213,7 +9213,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_protocol_fee_rate.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9224,7 +9224,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_reward_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9235,7 +9235,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_reward_authority_by_super_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9246,7 +9246,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_reward_emissions.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9257,7 +9257,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_reward_emissions_super_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9268,7 +9268,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_reward_emissions_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9279,7 +9279,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/set_token_badge_authority.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9290,7 +9290,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9301,7 +9301,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/swap_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9312,7 +9312,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/traded_event.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9323,7 +9323,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/transfer_locked_position.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9334,7 +9334,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/two_hop_swap.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9345,7 +9345,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/two_hop_swap_v2.rs", ), upstream_git_discriminator_entry( - "orca-whirlpool", + "orca_whirlpools", Some(crate::ORCA_WHIRLPOOLS_PROGRAM_ID), "orca", "clmm", @@ -9356,7 +9356,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/orca-whirlpool-decoder/src/instructions/update_fees_and_rewards.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9367,7 +9367,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/close_position.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9378,7 +9378,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/collect_fund_fee.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9389,7 +9389,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/collect_personal_fee_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9400,7 +9400,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/collect_protocol_fee.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9411,7 +9411,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/collect_protocol_fee_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9422,7 +9422,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/collect_remaining_rewards.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9433,7 +9433,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/config_change_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9444,7 +9444,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_amm_config.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9455,7 +9455,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_operation_account.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9466,7 +9466,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_permissionless_farm_switch.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9477,7 +9477,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_personal_position_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9488,7 +9488,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_pool.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9499,7 +9499,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/create_support_mint_associated.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9510,7 +9510,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/decrease_liquidity.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9521,7 +9521,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/decrease_liquidity_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9532,7 +9532,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/decrease_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9543,7 +9543,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/increase_liquidity.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9554,7 +9554,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/increase_liquidity_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9565,7 +9565,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/increase_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9576,7 +9576,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/initialize_reward.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9587,7 +9587,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/liquidity_calculate_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9598,7 +9598,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/liquidity_change_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9609,7 +9609,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/open_position.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9620,7 +9620,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/open_position_v2.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9631,7 +9631,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/open_position_with_token22_nft.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9642,7 +9642,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/pool_created_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9653,7 +9653,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/set_reward_params.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9664,7 +9664,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9675,7 +9675,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/swap_event.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9686,7 +9686,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/swap_router_base_in.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9697,7 +9697,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/swap_v2.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9708,7 +9708,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/toggle_permissionless_farm_switch.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9719,7 +9719,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/transfer_reward_owner.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9730,7 +9730,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/update_amm_config.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9741,7 +9741,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/update_operation_account.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9752,7 +9752,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/update_pool_status.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9763,7 +9763,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/update_reward_infos.rs", ), upstream_git_discriminator_entry( - "pancake-swap", + "pancake_swap", Some(crate::PANCAKE_SWAP_PROGRAM_ID), "pancake", "amm", @@ -9774,7 +9774,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pancake-swap-decoder/src/instructions/update_reward_infos_event.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9785,7 +9785,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_all_orders.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9796,7 +9796,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_all_orders_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9807,7 +9807,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_multiple_orders_by_id.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9818,7 +9818,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_multiple_orders_by_id_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9829,7 +9829,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_up_to.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9840,7 +9840,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/cancel_up_to_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9851,7 +9851,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/change_fee_recipient.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9862,7 +9862,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/change_market_status.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9873,7 +9873,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/change_seat_status.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9884,7 +9884,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/claim_authority.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9895,7 +9895,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/collect_fees.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9906,7 +9906,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/deposit_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9917,7 +9917,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/evict_seat.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9928,7 +9928,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/force_cancel_orders.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9939,7 +9939,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/initialize_market.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9950,7 +9950,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/log.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9961,7 +9961,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/name_successor.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9972,7 +9972,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/place_limit_order.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9983,7 +9983,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/place_limit_order_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -9994,7 +9994,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/place_multiple_post_only_orders.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10005,7 +10005,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/place_multiple_post_only_orders_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10016,7 +10016,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/reduce_order.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10027,7 +10027,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/reduce_order_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10038,7 +10038,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/request_seat.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10049,7 +10049,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/request_seat_authorized.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10060,7 +10060,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10071,7 +10071,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/swap_with_free_funds.rs", ), upstream_git_discriminator_entry( - "phoenix-v1", + "phoenix_v1", Some(crate::PHOENIX_V1_PROGRAM_ID), "phoenix", "orderbook", @@ -10082,7 +10082,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/phoenix-v1-decoder/src/instructions/withdraw_funds.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10093,7 +10093,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/claim_social_fee_pda.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10104,7 +10104,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10115,7 +10115,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/create_fee_sharing_config.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10126,7 +10126,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/create_social_fee_pda.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10137,7 +10137,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/get_fees.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10148,7 +10148,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/initialize_fee_config.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10159,7 +10159,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/initialize_fee_program_global.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10170,7 +10170,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/reset_fee_sharing_config.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10181,7 +10181,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/revoke_fee_sharing_authority.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10192,7 +10192,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/set_authority.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10203,7 +10203,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/set_claim_rate_limit.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10214,7 +10214,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/set_disable_flags.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10225,7 +10225,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/set_social_claim_authority.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10236,7 +10236,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/transfer_fee_sharing_authority.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10247,7 +10247,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/update_admin.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10258,7 +10258,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/update_fee_config.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10269,7 +10269,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/update_fee_shares.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10280,7 +10280,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/instructions/upsert_fee_tiers.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10291,7 +10291,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/create_fee_sharing_config_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10302,7 +10302,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/initialize_fee_config_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10313,7 +10313,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/initialize_fee_program_global_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10324,7 +10324,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/reset_fee_sharing_config_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10335,7 +10335,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/revoke_fee_sharing_authority_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10346,7 +10346,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/set_authority_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10357,7 +10357,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/set_claim_rate_limit_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10368,7 +10368,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/set_disable_flags_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10379,7 +10379,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/set_social_claim_authority_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10390,7 +10390,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/social_fee_pda_claimed.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10401,7 +10401,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/social_fee_pda_created.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10412,7 +10412,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/transfer_fee_sharing_authority_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10423,7 +10423,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/update_admin_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10434,7 +10434,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/update_fee_config_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10445,7 +10445,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/update_fee_shares_event.rs", ), upstream_git_discriminator_entry( - "pump-fees", + "pump_fees", Some(crate::PUMP_FEES_PROGRAM_ID), "pump", "fee_program", @@ -10456,7 +10456,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-fees-decoder/src/events/upsert_fee_tiers_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10467,7 +10467,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/admin_set_coin_creator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10478,7 +10478,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/admin_update_token_incentives.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10489,7 +10489,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/buy.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10500,7 +10500,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/buy_exact_quote_in.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10511,7 +10511,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/claim_cashback.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10522,7 +10522,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/claim_token_incentives.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10533,7 +10533,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/close_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10544,7 +10544,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/collect_coin_creator_fee.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10555,7 +10555,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10566,7 +10566,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/create_config.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10577,7 +10577,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/create_pool.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10588,7 +10588,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10599,7 +10599,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/disable.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10610,7 +10610,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/extend_account.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10621,7 +10621,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/init_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10632,7 +10632,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/migrate_pool_coin_creator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10643,7 +10643,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/sell.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10654,7 +10654,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/set_coin_creator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10665,7 +10665,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/set_reserved_fee_recipients.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10676,7 +10676,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/sync_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10687,7 +10687,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/toggle_cashback_enabled.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10698,7 +10698,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/toggle_mayhem_mode.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10709,7 +10709,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/transfer_creator_fees_to_pump.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10720,7 +10720,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/update_admin.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10731,7 +10731,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/update_fee_config.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10742,7 +10742,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10753,7 +10753,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/admin_set_coin_creator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10764,7 +10764,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/admin_update_token_incentives_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10775,7 +10775,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/buy_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10786,7 +10786,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/claim_cashback_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10797,7 +10797,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/claim_token_incentives_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10808,7 +10808,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/close_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10819,7 +10819,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/collect_coin_creator_fee_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10830,7 +10830,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/create_config_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10841,7 +10841,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/create_pool_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10852,7 +10852,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/deposit_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10863,7 +10863,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/disable_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10874,7 +10874,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/extend_account_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10885,7 +10885,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/init_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10896,7 +10896,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/migrate_pool_coin_creator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10907,7 +10907,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/reserved_fee_recipients_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10918,7 +10918,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/sell_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10929,7 +10929,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/set_bonding_curve_coin_creator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10940,7 +10940,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/set_metaplex_coin_creator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10951,7 +10951,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/sync_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10962,7 +10962,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/update_admin_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10973,7 +10973,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/update_fee_config_event.rs", ), upstream_git_discriminator_entry( - "pump-swap", + "pump_swap", Some(crate::PUMP_SWAP_PROGRAM_ID), "pump", "amm", @@ -10984,7 +10984,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pump-swap-decoder/src/events/withdraw_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -10995,7 +10995,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/admin_set_creator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11006,7 +11006,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/admin_set_idl_authority.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11017,7 +11017,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/admin_update_token_incentives.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11028,7 +11028,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/buy.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11039,7 +11039,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/buy_exact_sol_in.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11050,7 +11050,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/claim_cashback.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11061,7 +11061,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/claim_token_incentives.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11072,7 +11072,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/close_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11083,7 +11083,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/collect_creator_fee.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11094,7 +11094,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/cpi_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11105,7 +11105,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/create.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11116,7 +11116,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/create_v2.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11127,7 +11127,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/distribute_creator_fees.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11138,7 +11138,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/extend_account.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11149,7 +11149,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/get_minimum_distributable_fee.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11160,7 +11160,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/init_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11171,7 +11171,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11182,7 +11182,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/migrate.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11193,7 +11193,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/migrate_bonding_curve_creator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11204,7 +11204,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/sell.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11215,7 +11215,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/set_creator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11226,7 +11226,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/set_mayhem_virtual_params.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11237,7 +11237,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/set_metaplex_creator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11248,7 +11248,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/set_params.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11259,7 +11259,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/set_reserved_fee_recipients.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11270,7 +11270,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/sync_user_volume_accumulator.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11281,7 +11281,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/toggle_cashback_enabled.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11292,7 +11292,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/toggle_create_v2.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11303,7 +11303,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/toggle_mayhem_mode.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11314,7 +11314,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/instructions/update_global_authority.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11325,7 +11325,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/admin_set_creator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11336,7 +11336,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/admin_set_idl_authority_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11347,7 +11347,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/admin_update_token_incentives_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11358,7 +11358,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/claim_cashback_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11369,7 +11369,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/claim_token_incentives_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11380,7 +11380,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/close_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11391,7 +11391,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/collect_creator_fee_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11402,7 +11402,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/complete_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11413,7 +11413,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/complete_pump_amm_migration_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11424,7 +11424,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/create_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11435,7 +11435,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/distribute_creator_fees_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11446,7 +11446,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/extend_account_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11457,7 +11457,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/init_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11468,7 +11468,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/migrate_bonding_curve_creator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11479,7 +11479,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/minimum_distributable_fee_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11490,7 +11490,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/reserved_fee_recipients_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11501,7 +11501,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/set_creator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11512,7 +11512,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/set_metaplex_creator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11523,7 +11523,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/set_params_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11534,7 +11534,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/sync_user_volume_accumulator_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11545,7 +11545,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/trade_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11556,7 +11556,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/update_global_authority_event.rs", ), upstream_git_discriminator_entry( - "pumpfun", + "pump_fun", Some(crate::PUMP_FUN_PROGRAM_ID), "pump", "launch", @@ -11567,7 +11567,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/pumpfun-decoder/src/events/update_mayhem_virtual_params_event.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11578,7 +11578,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/admin_cancel_orders.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11589,7 +11589,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/create_config_account.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11600,7 +11600,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11611,7 +11611,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11622,7 +11622,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/initialize2.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11633,7 +11633,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/migrate_to_open_book.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11644,7 +11644,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/monitor_step.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11655,7 +11655,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/pre_initialize.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11666,7 +11666,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/set_params.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11677,7 +11677,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/simulate_info.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11688,7 +11688,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/swap_base_in.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11699,7 +11699,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/swap_base_in_v2.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11710,7 +11710,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/swap_base_out.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11721,7 +11721,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/swap_base_out_v2.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11732,7 +11732,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/update_config_account.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11743,7 +11743,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11754,7 +11754,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/withdraw_pnl.rs", ), upstream_git_discriminator_entry( - "raydium-amm-v4", + "raydium_amm_v4", Some(crate::RAYDIUM_AMM_V4_PROGRAM_ID), "raydium", "amm", @@ -11765,7 +11765,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-amm-v4-decoder/src/instructions/withdraw_srm.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11776,7 +11776,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/close_position.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11787,7 +11787,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/collect_fund_fee.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11798,7 +11798,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/collect_personal_fee_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11809,7 +11809,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/collect_protocol_fee.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11820,7 +11820,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/collect_protocol_fee_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11831,7 +11831,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/collect_remaining_rewards.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11842,7 +11842,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/config_change_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11853,7 +11853,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/create_amm_config.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11864,7 +11864,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/create_operation_account.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11875,7 +11875,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/create_personal_position_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11886,7 +11886,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/create_pool.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11897,7 +11897,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/decrease_liquidity.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11908,7 +11908,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/decrease_liquidity_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11919,7 +11919,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/decrease_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11930,7 +11930,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/increase_liquidity.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11941,7 +11941,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/increase_liquidity_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11952,7 +11952,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/increase_liquidity_v2.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11963,7 +11963,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/initialize_reward.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11974,7 +11974,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/liquidity_calculate_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11985,7 +11985,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/liquidity_change_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -11996,7 +11996,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/open_position.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12007,7 +12007,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/open_position_v2.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12018,7 +12018,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/open_position_with_token22_nft.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12029,7 +12029,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/pool_created_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12040,7 +12040,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/set_reward_params.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12051,7 +12051,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12062,7 +12062,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/swap_event.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12073,7 +12073,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/swap_router_base_in.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12084,7 +12084,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/swap_v2.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12095,7 +12095,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/transfer_reward_owner.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12106,7 +12106,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/update_amm_config.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12117,7 +12117,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/update_operation_account.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12128,7 +12128,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/update_pool_status.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12139,7 +12139,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/update_reward_infos.rs", ), upstream_git_discriminator_entry( - "raydium-clmm", + "raydium_clmm", Some(crate::RAYDIUM_CLMM_PROGRAM_ID), "raydium", "clmm", @@ -12150,7 +12150,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-clmm-decoder/src/instructions/update_reward_infos_event.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12161,7 +12161,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/close_permission_pda.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12172,7 +12172,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/collect_creator_fee.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12183,7 +12183,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/collect_fund_fee.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12194,7 +12194,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/collect_protocol_fee.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12205,7 +12205,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/create_amm_config.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12216,7 +12216,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/create_permission_pda.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12227,7 +12227,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12238,7 +12238,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12249,7 +12249,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/initialize_with_permission.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12260,7 +12260,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/lp_change_event.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12271,7 +12271,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/swap_base_input.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12282,7 +12282,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/swap_base_output.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12293,7 +12293,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/swap_event.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12304,7 +12304,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/update_amm_config.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12315,7 +12315,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/update_pool_status.rs", ), upstream_git_discriminator_entry( - "raydium-cpmm", + "raydium_cpmm", Some(crate::RAYDIUM_CPMM_PROGRAM_ID), "raydium", "amm", @@ -12326,7 +12326,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-cpmm-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12337,7 +12337,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/buy_exact_in.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12348,7 +12348,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/buy_exact_out.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12359,7 +12359,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/claim_creator_fee.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12370,7 +12370,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/claim_platform_fee.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12381,7 +12381,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/claim_platform_fee_from_vault.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12392,7 +12392,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/claim_vested_event.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12403,7 +12403,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/claim_vested_token.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12414,7 +12414,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/collect_fee.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12425,7 +12425,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/collect_migrate_fee.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12436,7 +12436,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/create_config.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12447,7 +12447,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/create_platform_config.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12458,7 +12458,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/create_vesting_account.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12469,7 +12469,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/create_vesting_event.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12480,7 +12480,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12491,7 +12491,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/initialize_v2.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12502,7 +12502,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/initialize_with_token_2022.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12513,7 +12513,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/migrate_to_amm.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12524,7 +12524,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/migrate_to_cpswap.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12535,7 +12535,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/pool_create_event.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12546,7 +12546,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/remove_platform_curve_param.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12557,7 +12557,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/sell_exact_in.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12568,7 +12568,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/sell_exact_out.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12579,7 +12579,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/trade_event.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12590,7 +12590,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/update_config.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12601,7 +12601,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/update_platform_config.rs", ), upstream_git_discriminator_entry( - "raydium-launchpad", + "raydium_launchlab", Some(crate::RAYDIUM_LAUNCHLAB_PROGRAM_ID), "raydium", "launch", @@ -12612,7 +12612,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-launchpad-decoder/src/instructions/update_platform_curve_param.rs", ), upstream_git_discriminator_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", @@ -12623,7 +12623,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-liquidity-locking-decoder/src/instructions/collect_clmm_fees_and_rewards.rs", ), upstream_git_discriminator_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", @@ -12634,7 +12634,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-liquidity-locking-decoder/src/instructions/collect_cp_fees.rs", ), upstream_git_discriminator_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", @@ -12645,7 +12645,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-liquidity-locking-decoder/src/instructions/lock_clmm_position.rs", ), upstream_git_discriminator_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", @@ -12656,7 +12656,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-liquidity-locking-decoder/src/instructions/lock_cp_liquidity.rs", ), upstream_git_discriminator_entry( - "raydium-liquidity-locking", + "raydium_liquidity_locking", Some(crate::RAYDIUM_LIQUIDITY_LOCKING_PROGRAM_ID), "raydium", "liquidity_locking", @@ -12667,7 +12667,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-liquidity-locking-decoder/src/instructions/settle_cp_fee_event.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12678,7 +12678,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12689,7 +12689,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12700,7 +12700,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/pre_initialize.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12711,7 +12711,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/swap_base_in.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12722,7 +12722,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/swap_base_out.rs", ), upstream_git_discriminator_entry( - "raydium-stable-swap", + "raydium_stable_swap", Some(crate::RAYDIUM_STABLE_SWAP_AMM_PROGRAM_ID), "raydium", "stable_swap", @@ -12733,7 +12733,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/raydium-stable-swap-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12744,7 +12744,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/accept_owner.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12755,7 +12755,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/approve_strategy.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12766,7 +12766,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/change_amp_factor.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12777,7 +12777,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/change_max_supply.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12788,7 +12788,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/change_swap_fee.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12799,7 +12799,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/create_strategy.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12810,7 +12810,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12821,7 +12821,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/exec_strategy.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12832,7 +12832,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12843,7 +12843,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/pause.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12854,7 +12854,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/pool_balance_updated_event.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12865,7 +12865,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/pool_updated_event.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12876,7 +12876,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/reject_owner.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12887,7 +12887,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/shutdown.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12898,7 +12898,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12909,7 +12909,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/swap_v2.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12920,7 +12920,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/transfer_owner.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12931,7 +12931,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/unpause.rs", ), upstream_git_discriminator_entry( - "stabble-stable-swap", + "stabble_stable_swap", Some(crate::STABBLE_STABLE_SWAP_PROGRAM_ID), "stabble", "stable_swap", @@ -12942,7 +12942,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-stable-swap-decoder/src/instructions/withdraw.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -12953,7 +12953,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/accept_owner.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -12964,7 +12964,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/change_max_supply.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -12975,7 +12975,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/change_swap_fee.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -12986,7 +12986,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/deposit.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -12997,7 +12997,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/initialize.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13008,7 +13008,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/pause.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13019,7 +13019,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/pool_balance_updated_event.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13030,7 +13030,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/pool_updated_event.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13041,7 +13041,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/reject_owner.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13052,7 +13052,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/shutdown.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13063,7 +13063,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/swap.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13074,7 +13074,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/swap_v2.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13085,7 +13085,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/transfer_owner.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", @@ -13096,7 +13096,7 @@ pub(crate) const UPSTREAM_REGISTRY_ENTRIES: &[crate::UpstreamRegistryEntry] = &[ "decoders/stabble-weighted-swap-decoder/src/instructions/unpause.rs", ), upstream_git_discriminator_entry( - "stabble-weighted-swap", + "stabble_weighted_swap", Some(crate::STABBLE_WEIGHTED_SWAP_PROGRAM_ID), "stabble", "weighted_swap", diff --git a/kb_lib/src/upstream_registry_match.rs b/kb_lib/src/upstream_registry_match.rs index 7827df1..d9a643b 100644 --- a/kb_lib/src/upstream_registry_match.rs +++ b/kb_lib/src/upstream_registry_match.rs @@ -280,7 +280,7 @@ mod tests { for (entry_name, discriminator_hex) in expected { let mut found = false; for entry in all_entries.as_slice() { - if entry.decoder_code == "openbook-v2" + if entry.decoder_code == "openbook_v2" && entry.program_id.as_deref() == Some(crate::OPENBOOK_V2_PROGRAM_ID) && entry.entry_kind == crate::ENTRY_KIND_INSTRUCTION && entry.entry_name == entry_name @@ -312,7 +312,7 @@ mod tests { Some(matched) => matched, None => panic!("OpenBook v2 place_take_order discriminator must match"), }; - assert_eq!(matched.decoder_code, "openbook-v2".to_string()); + assert_eq!(matched.decoder_code, "openbook_v2".to_string()); assert_eq!(matched.entry_name, "place_take_order".to_string()); assert_eq!(matched.discriminator_hex, Some("032c47031ac7cb55".to_string())); } @@ -320,65 +320,65 @@ mod tests { #[test] fn registry_contains_priority_family_program_seeds() { let expected_codes = [ - "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", + "meteora_damm_v2", + "meteora_dbc", + "meteora_dlmm", + "meteora_vault", + "raydium_amm_v4", + "raydium_clmm", + "raydium_cpmm", + "raydium_launchlab", + "raydium_liquidity_locking", + "raydium_stable_swap", + "orca_whirlpools", "fluxbeam", - "lifinity-amm-v2", - "phoenix-v1", - "openbook-v2", - "stabble-stable-swap", - "stabble-weighted-swap", + "lifinity_v2", + "phoenix_v1", + "openbook_v2", + "stabble_stable_swap", + "stabble_weighted_swap", "bonkswap", - "boop", + "boop_fun", "moonshot", "heaven", - "okx-dex", - "pancake-swap", + "okx_dex", + "pancake_swap", "vertigo", "virtuals", "wavebreak", - "onchain-labs-dex-v1", - "onchain-labs-dex-v2", - "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", + "onchain_labs_dex_v1", + "onchain_labs_dex_v2", + "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", - "system-program", - "token-program", - "token-2022", - "associated-token-account", - "address-lookup-table", - "memo-program", - "stake-program", - "mpl-token-metadata", - "mpl-core", + "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", + "name_service", + "marinade_finance", + "solayer_restaking_program", "swig", "sharky", - "circle-message-transmitter-v2", - "circle-token-messenger-v2", + "circle_message_transmitter_v2", + "circle_token_messenger_v2", ]; let all_entries = crate::upstream_registry_match::upstream_registry_all_entries(); for expected_code in expected_codes { @@ -527,7 +527,7 @@ mod tests { for expected_entry in expected_entries { let mut found = false; for entry in all_entries.as_slice() { - if entry.decoder_code == "meteora-damm-v2" + if entry.decoder_code == "meteora_damm_v2" && entry.entry_kind == crate::ENTRY_KIND_INSTRUCTION && entry.entry_name == expected_entry.0 && entry.discriminator_hex.as_deref() == Some(expected_entry.1) @@ -555,7 +555,7 @@ mod tests { for expected_entry in expected_entries { let mut found = false; for entry in all_entries.as_slice() { - if entry.decoder_code == "meteora-damm-v2" + if entry.decoder_code == "meteora_damm_v2" && entry.entry_kind == crate::ENTRY_KIND_EVENT && entry.entry_name == expected_entry.0 && entry.discriminator_hex.as_deref() == Some(expected_entry.1) @@ -581,9 +581,9 @@ mod tests { ); let matched = match matched { Some(matched) => matched, - None => panic!("missing meteora-damm-v2 add_liquidity registry match"), + None => panic!("missing meteora_damm_v2 add_liquidity registry match"), }; - assert_eq!(matched.decoder_code, "meteora-damm-v2"); + assert_eq!(matched.decoder_code, "meteora_damm_v2"); assert_eq!(matched.entry_name, "add_liquidity"); assert_eq!(matched.discriminator_hex.as_deref(), Some("b59d59438fb63448")); assert_eq!(matched.proof_status, crate::PROOF_STATUS_UPSTREAM_GIT_UNVERIFIED); @@ -599,9 +599,9 @@ mod tests { ); let matched = match matched { Some(matched) => matched, - None => panic!("missing phoenix-v1 swap registry match"), + None => panic!("missing phoenix_v1 swap registry match"), }; - assert_eq!(matched.decoder_code, "phoenix-v1"); + assert_eq!(matched.decoder_code, "phoenix_v1"); assert_eq!(matched.entry_name, "swap"); assert_eq!(matched.discriminator_hex.as_deref(), Some("00")); assert_eq!(matched.discriminator_len, Some(1)); @@ -621,7 +621,7 @@ mod tests { let result = crate::upstream_registry_match::upstream_registry_search(&request); assert!(result.entries.len() >= 2); for entry in result.entries.as_slice() { - assert_eq!(entry.decoder_code, "raydium-cpmm"); + assert_eq!(entry.decoder_code, "raydium_cpmm"); } }