sol-parser-sdk-python 0.5.7__py3-none-any.whl → 0.5.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sol_parser/dex_parsers.py CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import base64
10
11
  import struct
11
12
  from typing import Any, Dict, List, Optional
12
13
 
@@ -45,6 +46,11 @@ from .event_types import (
45
46
  MeteoraDammV2CreatePositionEvent, MeteoraDammV2ClosePositionEvent,
46
47
  MeteoraDammV2AddLiquidityEvent, MeteoraDammV2RemoveLiquidityEvent,
47
48
  MeteoraDammV2InitializePoolEvent,
49
+ MeteoraDammV2DynamicFeeParameters,
50
+ MeteoraDammV2UpdateDelegatePermissionEvent,
51
+ MeteoraDammV2WithdrawDeadLiquidityRewardEvent,
52
+ MeteoraDammV2CreateConfigEvent,
53
+ MeteoraDammV2CreateDynamicConfigEvent,
48
54
  MeteoraDbcCurveCompleteEvent, MeteoraDbcInitializePoolEvent, MeteoraDbcSwapEvent,
49
55
  RaydiumLaunchlabTradeEvent, RaydiumLaunchlabPoolCreateEvent,
50
56
  )
@@ -252,6 +258,8 @@ def parse_trade_from_data(data: bytes, meta: dict, is_created_buy: bool) -> DexE
252
258
  quote_amount = _optional_u64(data, tail)
253
259
  virtual_quote_reserves = _optional_u64(data, tail)
254
260
  real_quote_reserves = _optional_u64(data, tail)
261
+ holder_rewards_bps = _optional_u64(data, tail)
262
+ holder_rewards = _optional_u64(data, tail)
255
263
 
256
264
  event_data = PumpFunTradeEvent(
257
265
  metadata=_make_meta(meta),
@@ -288,6 +296,8 @@ def parse_trade_from_data(data: bytes, meta: dict, is_created_buy: bool) -> DexE
288
296
  quote_amount=quote_amount,
289
297
  virtual_quote_reserves=virtual_quote_reserves,
290
298
  real_quote_reserves=real_quote_reserves,
299
+ holder_rewards_bps=holder_rewards_bps,
300
+ holder_rewards=holder_rewards,
291
301
  is_cashback_coin=cb_bps > 0,
292
302
  bonding_curve=Z,
293
303
  associated_bonding_curve=Z,
@@ -343,6 +353,10 @@ def parse_create_from_data(data: bytes, meta: dict) -> DexEvent:
343
353
  quote_mint = _pub(data, o) if o + 32 <= len(data) else Z
344
354
  o += 32
345
355
  virtual_quote_reserves = _u64le(data, o) if o + 8 <= len(data) else 0
356
+ o += 8
357
+ creator_fee_bps = _u64le(data, o) if o + 8 <= len(data) else 0
358
+ o += 8
359
+ is_holder_reward = _bool(data, o) if o < len(data) else False
346
360
 
347
361
  return DexEvent(
348
362
  type=EventType.PUMP_FUN_CREATE,
@@ -365,6 +379,8 @@ def parse_create_from_data(data: bytes, meta: dict) -> DexEvent:
365
379
  is_cashback_enabled=ice,
366
380
  quote_mint=quote_mint,
367
381
  virtual_quote_reserves=virtual_quote_reserves,
382
+ creator_fee_bps=creator_fee_bps,
383
+ is_holder_reward=is_holder_reward,
368
384
  ),
369
385
  )
370
386
 
@@ -1309,6 +1325,27 @@ def parse_amm_swap_out_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
1309
1325
  )
1310
1326
 
1311
1327
 
1328
+ def parse_amm_ray_log_swap(log: str, meta: dict) -> Optional[DexEvent]:
1329
+ prefix = "ray_log: "
1330
+ start = log.find(prefix)
1331
+ if start < 0:
1332
+ return None
1333
+ try:
1334
+ data = base64.b64decode(log[start + len(prefix):].strip(), validate=True)
1335
+ except Exception:
1336
+ return None
1337
+ if len(data) != 57 or data[0] not in (3, 4):
1338
+ return None
1339
+ first = _u64le(data, 1)
1340
+ second = _u64le(data, 9)
1341
+ actual = _u64le(data, 49)
1342
+ if data[0] == 3:
1343
+ event = _amm_swap_event(meta, Z, Z, first, second, 0, actual)
1344
+ else:
1345
+ event = _amm_swap_event(meta, Z, Z, actual, 0, first, second)
1346
+ return DexEvent(type=EventType.RAYDIUM_AMM_V4_SWAP, data=event)
1347
+
1348
+
1312
1349
  def parse_amm_deposit_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
1313
1350
  if len(data) < 32 + 32 + 8 + 8 + 8:
1314
1351
  return None
@@ -1404,6 +1441,41 @@ def parse_amm_init2_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
1404
1441
  # --- Raydium CPMM ---
1405
1442
 
1406
1443
 
1444
+ def parse_cpmm_swap_event_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
1445
+ if len(data) < 32 + 6 * 8 + 1:
1446
+ return None
1447
+ o = 0
1448
+ pool = _pub(data, o)
1449
+ o += 32
1450
+ input_vault_before = _u64le(data, o)
1451
+ o += 8
1452
+ output_vault_before = _u64le(data, o)
1453
+ o += 8
1454
+ input_amount = _u64le(data, o)
1455
+ o += 8
1456
+ output_amount = _u64le(data, o)
1457
+ o += 8
1458
+ input_transfer_fee = _u64le(data, o)
1459
+ o += 8
1460
+ output_transfer_fee = _u64le(data, o)
1461
+ o += 8
1462
+ base_input = _bool(data, o)
1463
+ return DexEvent(
1464
+ type=EventType.RAYDIUM_CPMM_SWAP,
1465
+ data=RaydiumCpmmSwapEvent(
1466
+ metadata=_make_meta(meta),
1467
+ pool_id=pool,
1468
+ input_vault_before=input_vault_before,
1469
+ output_vault_before=output_vault_before,
1470
+ input_amount=input_amount,
1471
+ output_amount=output_amount,
1472
+ input_transfer_fee=input_transfer_fee,
1473
+ output_transfer_fee=output_transfer_fee,
1474
+ base_input=base_input,
1475
+ ),
1476
+ )
1477
+
1478
+
1407
1479
  def parse_cpmm_swap_in_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
1408
1480
  if len(data) < 32 + 32 + 8 + 8 + 8 + 1:
1409
1481
  return None
@@ -1811,7 +1883,7 @@ def parse_meteora_pools_set_pool_fees_from_data(data: bytes, meta: dict) -> Opti
1811
1883
  )
1812
1884
 
1813
1885
 
1814
- # --- Meteora DAMM (Swap / Swap2 only,与 Go/TS 一致) ---
1886
+ # --- Meteora DAMM (对齐 Rust/Node logs/meteora_damm) ---
1815
1887
 
1816
1888
  DAMM_SWAP = _d(27, 60, 21, 213, 138, 170, 187, 147)
1817
1889
  DAMM_SWAP2 = _d(189, 66, 51, 168, 38, 80, 117, 153)
@@ -1819,12 +1891,31 @@ DAMM_CREATE_POSITION = _d(156, 15, 119, 198, 29, 181, 221, 55)
1819
1891
  DAMM_CLOSE_POSITION = _d(20, 145, 144, 68, 143, 142, 214, 178)
1820
1892
  DAMM_ADD_LIQUIDITY = _d(175, 242, 8, 157, 30, 247, 185, 169)
1821
1893
  DAMM_REMOVE_LIQUIDITY = _d(87, 46, 88, 98, 175, 96, 34, 91)
1894
+ DAMM_LIQUIDITY_CHANGE = _d(197, 171, 78, 127, 224, 211, 87, 13)
1822
1895
  DAMM_INIT_POOL = _d(228, 50, 246, 85, 203, 66, 134, 37)
1896
+ DAMM_UPDATE_DELEGATE_PERMISSION = _d(66, 188, 75, 151, 150, 232, 87, 93)
1897
+ DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD = _d(228, 66, 150, 195, 42, 62, 163, 13)
1898
+ DAMM_CREATE_CONFIG = _d(131, 207, 180, 174, 180, 73, 165, 54)
1899
+ DAMM_CREATE_DYNAMIC_CONFIG = _d(231, 197, 13, 164, 248, 213, 133, 152)
1900
+ # Mainnet upgrade: trading_fee/partner_fee → claiming_fee/compounding_fee in EvtSwap2
1901
+ COMPOUNDING_FEE_LAYOUT_ACTIVATION_SLOT = 406_048_752
1823
1902
  DBC_SWAP = DAMM_SWAP
1824
1903
  DBC_INIT_POOL = DAMM_INIT_POOL
1825
1904
  DBC_CURVE_COMPLETE = _d(229, 231, 86, 84, 156, 134, 75, 24)
1826
1905
 
1827
1906
 
1907
+ def _uses_compounding_fee_layout(slot: int) -> bool:
1908
+ return slot == 0 or slot >= COMPOUNDING_FEE_LAYOUT_ACTIVATION_SLOT
1909
+
1910
+
1911
+ def _meta_slot(meta: dict) -> int:
1912
+ if isinstance(meta, EventMetadata):
1913
+ return int(meta.slot or 0)
1914
+ if isinstance(meta, dict):
1915
+ return int(meta.get("slot", 0) or 0)
1916
+ return 0
1917
+
1918
+
1828
1919
  def parse_meteora_damm_from_buf(buf: bytes, meta: dict) -> Optional[DexEvent]:
1829
1920
  if len(buf) < 8:
1830
1921
  return None
@@ -1842,8 +1933,18 @@ def parse_meteora_damm_from_buf(buf: bytes, meta: dict) -> Optional[DexEvent]:
1842
1933
  return _parse_damm_add_liquidity(data, meta)
1843
1934
  if d == DAMM_REMOVE_LIQUIDITY:
1844
1935
  return _parse_damm_remove_liquidity(data, meta)
1936
+ if d == DAMM_LIQUIDITY_CHANGE:
1937
+ return _parse_damm_liquidity_change(data, meta)
1845
1938
  if d == DAMM_INIT_POOL:
1846
1939
  return _parse_damm_initialize_pool(data, meta)
1940
+ if d == DAMM_UPDATE_DELEGATE_PERMISSION:
1941
+ return _parse_damm_update_delegate_permission(data, meta)
1942
+ if d == DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD:
1943
+ return _parse_damm_withdraw_dead_liquidity_reward(data, meta)
1944
+ if d == DAMM_CREATE_CONFIG:
1945
+ return _parse_damm_create_config(data, meta)
1946
+ if d == DAMM_CREATE_DYNAMIC_CONFIG:
1947
+ return _parse_damm_create_dynamic_config(data, meta)
1847
1948
  return None
1848
1949
 
1849
1950
 
@@ -2017,13 +2118,15 @@ def _parse_damm_swap(data: bytes, meta: dict) -> Optional[DexEvent]:
2017
2118
 
2018
2119
 
2019
2120
  def _parse_damm_swap2(data: bytes, meta: dict) -> Optional[DexEvent]:
2020
- if len(data) < 32 + 1 + 1 + 1 + 8 * 2 + 1 + 8 * 6 + 16 + 8 * 4 + 8 * 3:
2121
+ # Full 180-byte EvtSwap2 layout (Rust/Node parity)
2122
+ if len(data) < 180:
2021
2123
  return None
2022
2124
  o = 0
2023
2125
  pool = _pub(data, o)
2024
2126
  o += 32
2025
2127
  td = _u8(data, o)
2026
2128
  o += 1
2129
+ collect_fee_mode = _u8(data, o)
2027
2130
  o += 1
2028
2131
  hr = _bool(data, o)
2029
2132
  o += 1
@@ -2035,38 +2138,82 @@ def _parse_damm_swap2(data: bytes, meta: dict) -> Optional[DexEvent]:
2035
2138
  o += 1
2036
2139
  ifi = _u64le(data, o)
2037
2140
  o += 8
2038
- o += 16
2141
+ efi = _u64le(data, o)
2142
+ o += 8
2143
+ amount_left = _u64le(data, o)
2144
+ o += 8
2039
2145
  oa = _u64le(data, o)
2040
2146
  o += 8
2041
2147
  nsp = str(_u128le_int(data, o))
2042
2148
  o += 16
2043
- lpf = _u64le(data, o)
2149
+ claiming_or_trading = _u64le(data, o)
2044
2150
  o += 8
2045
2151
  pf = _u64le(data, o)
2046
2152
  o += 8
2153
+ compounding_or_partner = _u64le(data, o)
2154
+ o += 8
2047
2155
  rf = _u64le(data, o)
2048
2156
  o += 8
2157
+ itf_in = _u64le(data, o)
2049
2158
  o += 8
2159
+ itf_out = _u64le(data, o)
2160
+ o += 8
2161
+ etf_out = _u64le(data, o)
2050
2162
  o += 8
2051
2163
  ct = _u64le(data, o)
2052
- ai, mo = (a0, a1) if sm == 0 else (a1, a0)
2164
+ o += 8
2165
+ reserve_a = _u64le(data, o)
2166
+ o += 8
2167
+ reserve_b = _u64le(data, o)
2168
+
2169
+ if sm in (0, 1):
2170
+ ai, mo = a0, a1
2171
+ elif sm == 2:
2172
+ ai, mo = a1, a0
2173
+ else:
2174
+ return None
2175
+
2176
+ if _uses_compounding_fee_layout(_meta_slot(meta)):
2177
+ lpf = claiming_or_trading + compounding_or_partner
2178
+ partner_fee = compounding_or_partner
2179
+ claiming_fee = claiming_or_trading
2180
+ compounding_fee = compounding_or_partner
2181
+ else:
2182
+ lpf = claiming_or_trading
2183
+ partner_fee = compounding_or_partner
2184
+ claiming_fee = 0
2185
+ compounding_fee = 0
2186
+
2053
2187
  return DexEvent(
2054
2188
  type=EventType.METEORA_DAMM_V2_SWAP,
2055
2189
  data=MeteoraDammV2SwapEvent(
2056
2190
  metadata=_make_meta(meta),
2057
2191
  pool=pool,
2058
2192
  trade_direction=td,
2193
+ collect_fee_mode=collect_fee_mode,
2059
2194
  has_referral=hr,
2195
+ amount_0=a0,
2196
+ amount_1=a1,
2197
+ swap_mode=sm,
2060
2198
  amount_in=ai,
2061
2199
  minimum_amount_out=mo,
2062
2200
  output_amount=oa,
2063
2201
  next_sqrt_price=nsp,
2064
2202
  lp_fee=lpf,
2065
2203
  protocol_fee=pf,
2066
- partner_fee=0,
2204
+ partner_fee=partner_fee,
2067
2205
  referral_fee=rf,
2068
2206
  actual_amount_in=ifi,
2207
+ excluded_fee_input_amount=efi,
2208
+ amount_left=amount_left,
2209
+ claiming_fee=claiming_fee,
2210
+ compounding_fee=compounding_fee,
2211
+ included_transfer_fee_amount_in=itf_in,
2212
+ included_transfer_fee_amount_out=itf_out,
2213
+ excluded_transfer_fee_amount_out=etf_out,
2069
2214
  current_timestamp=ct,
2215
+ reserve_a_amount=reserve_a,
2216
+ reserve_b_amount=reserve_b,
2070
2217
  token_a_vault=Z,
2071
2218
  token_b_vault=Z,
2072
2219
  token_a_mint=Z,
@@ -2340,6 +2487,231 @@ def _parse_damm_remove_liquidity(data: bytes, meta: dict) -> Optional[DexEvent]:
2340
2487
  )
2341
2488
 
2342
2489
 
2490
+ def _parse_damm_liquidity_change(data: bytes, meta: dict) -> Optional[DexEvent]:
2491
+ """EvtLiquidityChange; change_type 0=add, 1=remove."""
2492
+ if len(data) < 177:
2493
+ return None
2494
+ pool = _pub(data, 0)
2495
+ position = _pub(data, 32)
2496
+ owner = _pub(data, 64)
2497
+ ta = _u64le(data, 96)
2498
+ tb = _u64le(data, 104)
2499
+ tota = _u64le(data, 112)
2500
+ totb = _u64le(data, 120)
2501
+ ra = _u64le(data, 128)
2502
+ rb = _u64le(data, 136)
2503
+ ld = str(_u128le_int(data, 144))
2504
+ tat = _u64le(data, 160)
2505
+ tbt = _u64le(data, 168)
2506
+ change_type = _u8(data, 176)
2507
+ md = _make_meta(meta)
2508
+ if change_type == 0:
2509
+ return DexEvent(
2510
+ type=EventType.METEORA_DAMM_V2_ADD_LIQUIDITY,
2511
+ data=MeteoraDammV2AddLiquidityEvent(
2512
+ metadata=md,
2513
+ pool=pool,
2514
+ position=position,
2515
+ owner=owner,
2516
+ liquidity_delta=ld,
2517
+ token_a_amount_threshold=tat,
2518
+ token_b_amount_threshold=tbt,
2519
+ token_a_amount=ta,
2520
+ token_b_amount=tb,
2521
+ total_amount_a=tota,
2522
+ total_amount_b=totb,
2523
+ reserve_a_amount=ra,
2524
+ reserve_b_amount=rb,
2525
+ ),
2526
+ )
2527
+ if change_type == 1:
2528
+ return DexEvent(
2529
+ type=EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY,
2530
+ data=MeteoraDammV2RemoveLiquidityEvent(
2531
+ metadata=md,
2532
+ pool=pool,
2533
+ position=position,
2534
+ owner=owner,
2535
+ liquidity_delta=ld,
2536
+ token_a_amount_threshold=tat,
2537
+ token_b_amount_threshold=tbt,
2538
+ token_a_amount=ta,
2539
+ token_b_amount=tb,
2540
+ total_amount_a=tota,
2541
+ total_amount_b=totb,
2542
+ reserve_a_amount=ra,
2543
+ reserve_b_amount=rb,
2544
+ ),
2545
+ )
2546
+ return None
2547
+
2548
+
2549
+ def _parse_damm_update_delegate_permission(data: bytes, meta: dict) -> Optional[DexEvent]:
2550
+ if len(data) < 32 + 32 + 4 + 1:
2551
+ return None
2552
+ o = 0
2553
+ position = _pub(data, o)
2554
+ o += 32
2555
+ owner = _pub(data, o)
2556
+ o += 32
2557
+ permission = _u32le(data, o)
2558
+ o += 4
2559
+ has_delegate = _bool(data, o)
2560
+ o += 1
2561
+ delegate = None
2562
+ if has_delegate:
2563
+ if o + 32 > len(data):
2564
+ return None
2565
+ delegate = _pub(data, o)
2566
+ return DexEvent(
2567
+ type=EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION,
2568
+ data=MeteoraDammV2UpdateDelegatePermissionEvent(
2569
+ metadata=_make_meta(meta),
2570
+ position=position,
2571
+ owner=owner,
2572
+ permission=permission,
2573
+ delegate=delegate,
2574
+ ),
2575
+ )
2576
+
2577
+
2578
+ def _parse_damm_withdraw_dead_liquidity_reward(data: bytes, meta: dict) -> Optional[DexEvent]:
2579
+ if len(data) < 32 + 32 + 8:
2580
+ return None
2581
+ o = 0
2582
+ pool = _pub(data, o)
2583
+ o += 32
2584
+ reward_mint = _pub(data, o)
2585
+ o += 32
2586
+ amount = _u64le(data, o)
2587
+ return DexEvent(
2588
+ type=EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD,
2589
+ data=MeteoraDammV2WithdrawDeadLiquidityRewardEvent(
2590
+ metadata=_make_meta(meta),
2591
+ pool=pool,
2592
+ reward_mint=reward_mint,
2593
+ amount=amount,
2594
+ ),
2595
+ )
2596
+
2597
+
2598
+ def _parse_damm_create_config_dynamic_fee(
2599
+ data: bytes, o: int
2600
+ ) -> Optional[tuple[MeteoraDammV2DynamicFeeParameters, int]]:
2601
+ if o + 32 > len(data):
2602
+ return None
2603
+ bs = _u16le(data, o)
2604
+ o += 2
2605
+ bu = str(_u128le_int(data, o))
2606
+ o += 16
2607
+ fp = _u16le(data, o)
2608
+ o += 2
2609
+ dp = _u16le(data, o)
2610
+ o += 2
2611
+ rf = _u16le(data, o)
2612
+ o += 2
2613
+ mva = _u32le(data, o)
2614
+ o += 4
2615
+ vfc = _u32le(data, o)
2616
+ o += 4
2617
+ return (
2618
+ MeteoraDammV2DynamicFeeParameters(
2619
+ bin_step=bs,
2620
+ bin_step_u128=bu,
2621
+ filter_period=fp,
2622
+ decay_period=dp,
2623
+ reduction_factor=rf,
2624
+ max_volatility_accumulator=mva,
2625
+ variable_fee_control=vfc,
2626
+ ),
2627
+ o,
2628
+ )
2629
+
2630
+
2631
+ def _parse_damm_create_config(data: bytes, meta: dict) -> Optional[DexEvent]:
2632
+ o = 0
2633
+ if len(data) < 27:
2634
+ return None
2635
+ base_fee_data = bytes(data[o : o + 27])
2636
+ o += 27
2637
+ if o + 2 + 1 + 1 > len(data):
2638
+ return None
2639
+ cfb = _u16le(data, o)
2640
+ o += 2
2641
+ pad = _u8(data, o)
2642
+ o += 1
2643
+ has_dyn = _bool(data, o)
2644
+ o += 1
2645
+ dyn = None
2646
+ if has_dyn:
2647
+ parsed = _parse_damm_create_config_dynamic_fee(data, o)
2648
+ if not parsed:
2649
+ return None
2650
+ dyn, o = parsed
2651
+ need = 32 + 32 + 1 + 16 + 16 + 1 + 8 + 32 + 16
2652
+ if o + need > len(data):
2653
+ return None
2654
+ vault = _pub(data, o)
2655
+ o += 32
2656
+ pca = _pub(data, o)
2657
+ o += 32
2658
+ act = _u8(data, o)
2659
+ o += 1
2660
+ smin = str(_u128le_int(data, o))
2661
+ o += 16
2662
+ smax = str(_u128le_int(data, o))
2663
+ o += 16
2664
+ cfm = _u8(data, o)
2665
+ o += 1
2666
+ index = _u64le(data, o)
2667
+ o += 8
2668
+ config = _pub(data, o)
2669
+ o += 32
2670
+ permission = str(_u128le_int(data, o))
2671
+ return DexEvent(
2672
+ type=EventType.METEORA_DAMM_V2_CREATE_CONFIG,
2673
+ data=MeteoraDammV2CreateConfigEvent(
2674
+ metadata=_make_meta(meta),
2675
+ base_fee_data=base_fee_data,
2676
+ compounding_fee_bps=cfb,
2677
+ padding=pad,
2678
+ dynamic_fee=dyn,
2679
+ vault_config_key=vault,
2680
+ pool_creator_authority=pca,
2681
+ activation_type=act,
2682
+ sqrt_min_price=smin,
2683
+ sqrt_max_price=smax,
2684
+ collect_fee_mode=cfm,
2685
+ index=index,
2686
+ config=config,
2687
+ permission=permission,
2688
+ ),
2689
+ )
2690
+
2691
+
2692
+ def _parse_damm_create_dynamic_config(data: bytes, meta: dict) -> Optional[DexEvent]:
2693
+ if len(data) < 32 + 32 + 8 + 16:
2694
+ return None
2695
+ o = 0
2696
+ config = _pub(data, o)
2697
+ o += 32
2698
+ pca = _pub(data, o)
2699
+ o += 32
2700
+ index = _u64le(data, o)
2701
+ o += 8
2702
+ permission = str(_u128le_int(data, o))
2703
+ return DexEvent(
2704
+ type=EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG,
2705
+ data=MeteoraDammV2CreateDynamicConfigEvent(
2706
+ metadata=_make_meta(meta),
2707
+ config=config,
2708
+ pool_creator_authority=pca,
2709
+ index=index,
2710
+ permission=permission,
2711
+ ),
2712
+ )
2713
+
2714
+
2343
2715
  # --- RaydiumLaunchlab ---
2344
2716
 
2345
2717
  DISC_RAYDIUM_LAUNCHLAB_TRADE = _d(189, 219, 127, 211, 78, 230, 97, 238)
@@ -2406,9 +2778,56 @@ def _parse_raydium_launchlab_pool_create(data: bytes, meta: dict) -> Optional[De
2406
2778
  # --- PumpSwap ---
2407
2779
 
2408
2780
 
2781
+ def _parse_pumpswap_trade_tail(data: bytes) -> Optional[Dict[str, Any]]:
2782
+ tail: Dict[str, Any] = {
2783
+ "cashback_fee_basis_points": 0,
2784
+ "cashback": 0,
2785
+ "buyback_fee_basis_points": 0,
2786
+ "buyback_fee": 0,
2787
+ "virtual_quote_reserves": 0,
2788
+ "can_boost": False,
2789
+ "base_supply": 0,
2790
+ "holder_rewards_bps": 0,
2791
+ "holder_rewards": 0,
2792
+ }
2793
+ if not data:
2794
+ return tail
2795
+ if len(data) < 16:
2796
+ return None
2797
+
2798
+ tail["cashback_fee_basis_points"] = _u64le(data, 0)
2799
+ tail["cashback"] = _u64le(data, 8)
2800
+ if len(data) == 16:
2801
+ return tail
2802
+ if len(data) < 32:
2803
+ return None
2804
+
2805
+ tail["buyback_fee_basis_points"] = _u64le(data, 16)
2806
+ tail["buyback_fee"] = _u64le(data, 24)
2807
+ if len(data) == 32:
2808
+ return tail
2809
+ if len(data) < 57:
2810
+ return None
2811
+
2812
+ tail["virtual_quote_reserves"] = int.from_bytes(data[32:48], "little", signed=True)
2813
+ if data[48] not in (0, 1):
2814
+ return None
2815
+ tail["can_boost"] = data[48] == 1
2816
+ tail["base_supply"] = _u64le(data, 49)
2817
+ if len(data) != 57 and len(data) < 73:
2818
+ return None
2819
+ if len(data) >= 73:
2820
+ tail["holder_rewards_bps"] = _u64le(data, 57)
2821
+ tail["holder_rewards"] = _u64le(data, 65)
2822
+ return tail
2823
+
2824
+
2409
2825
  def parse_ps_buy_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2410
- min_len = 16 * 8 + 7 * 32 + 1 + 5 * 8 + 4
2411
- if len(data) < min_len:
2826
+ legacy_len = 16 * 8 + 7 * 32 + 1 + 4 * 8
2827
+ min_required_len = legacy_len + 8 + 4
2828
+ if len(data) != legacy_len and len(data) < min_required_len:
2829
+ return None
2830
+ if data[352] not in (0, 1):
2412
2831
  return None
2413
2832
  o = 0
2414
2833
 
@@ -2457,36 +2876,36 @@ def parse_ps_buy_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2457
2876
  "coin_creator_fee_basis_points": rd(),
2458
2877
  "coin_creator_fee": rd(),
2459
2878
  }
2460
- tv = _bool(data, o)
2879
+ tv = data[o] == 1
2461
2880
  o += 1
2462
2881
  ev["track_volume"] = tv
2463
2882
  ev["total_unclaimed_tokens"] = rd()
2464
2883
  ev["total_claimed_tokens"] = rd()
2465
2884
  ev["current_sol_volume"] = rd()
2466
2885
  ev["last_update_timestamp"] = ri()
2467
- ev["min_base_amount_out"] = rd()
2468
- ix = ""
2469
- if o + 4 <= len(data):
2470
- ln = _u32le(data, o)
2886
+ ev["min_base_amount_out"] = 0
2887
+ ev["ix_name"] = ""
2888
+ tail = _parse_pumpswap_trade_tail(b"")
2889
+ if len(data) != legacy_len:
2890
+ ev["min_base_amount_out"] = rd()
2891
+ if o + 4 > len(data):
2892
+ return None
2893
+ name_len = _u32le(data, o)
2471
2894
  o += 4
2472
- if o + ln <= len(data):
2473
- ix = data[o : o + ln].decode("utf-8", errors="replace")
2474
- ev["ix_name"] = ix
2475
- # Mayhem mode and cashback fields
2476
- mm = False
2477
- if o < len(data):
2478
- mm = _bool(data, o)
2479
- o += 1
2480
- cb_bps = 0
2481
- cb = 0
2482
- if o + 16 <= len(data):
2483
- cb_bps = _u64le(data, o)
2484
- o += 8
2485
- cb = _u64le(data, o)
2486
- ev["mayhem_mode"] = mm
2487
- ev["cashback_fee_basis_points"] = cb_bps
2488
- ev["cashback"] = cb
2489
- ev["is_cashback_coin"] = cb_bps > 0
2895
+ name_end = o + name_len
2896
+ if name_end > len(data):
2897
+ return None
2898
+ try:
2899
+ ev["ix_name"] = data[o:name_end].decode("utf-8")
2900
+ except UnicodeDecodeError:
2901
+ return None
2902
+ o = name_end
2903
+ tail = _parse_pumpswap_trade_tail(data[o:])
2904
+ if tail is None:
2905
+ return None
2906
+ assert tail is not None
2907
+ ev.update(tail)
2908
+ ev["is_cashback_coin"] = tail["cashback_fee_basis_points"] > 0
2490
2909
  md = ev.pop("metadata", meta)
2491
2910
  return DexEvent(
2492
2911
  type=EventType.PUMP_SWAP_BUY,
@@ -2495,9 +2914,12 @@ def parse_ps_buy_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2495
2914
 
2496
2915
 
2497
2916
  def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2498
- req = 13 * 8 + 7 * 32
2917
+ req = 14 * 8 + 7 * 32 + 2 * 8
2499
2918
  if len(data) < req:
2500
2919
  return None
2920
+ tail = _parse_pumpswap_trade_tail(data[req:])
2921
+ if tail is None:
2922
+ return None
2501
2923
  o = 0
2502
2924
 
2503
2925
  def rd() -> int:
@@ -2544,12 +2966,7 @@ def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2544
2966
  "coin_creator_fee_basis_points": rd(),
2545
2967
  "coin_creator_fee": rd(),
2546
2968
  }
2547
- cash_bps, cash = 0, 0
2548
- if len(data) >= 368:
2549
- cash_bps = _u64le(data, 352)
2550
- cash = _u64le(data, 360)
2551
- ev["cashback_fee_basis_points"] = cash_bps
2552
- ev["cashback"] = cash
2969
+ ev.update(tail)
2553
2970
  md = ev.pop("metadata", meta)
2554
2971
  return DexEvent(
2555
2972
  type=EventType.PUMP_SWAP_SELL,
@@ -2558,9 +2975,11 @@ def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2558
2975
 
2559
2976
 
2560
2977
  def parse_ps_create_pool_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2561
- req = 8 + 2 + 32 * 6 + 2 + 8 * 7 + 1
2978
+ req = 326
2562
2979
  if len(data) < req:
2563
2980
  return None
2981
+ if len(data) != req and len(data) < 335:
2982
+ return None
2564
2983
  o = 0
2565
2984
  ts = _i64le(data, o)
2566
2985
  o += 8
@@ -2618,6 +3037,9 @@ def parse_ps_create_pool_from_data(data: bytes, meta: dict) -> Optional[DexEvent
2618
3037
  ev["user_quote_token_account"] = uqa
2619
3038
  ev["coin_creator"] = cc
2620
3039
  ev["is_mayhem_mode"] = len(data) > 325 and _bool(data, 325)
3040
+ ev["creator_fee_bps"] = _u64le(data, 326) if len(data) >= 334 else 0
3041
+ ev["can_edit_creator_fee"] = len(data) > 334 and _bool(data, 334)
3042
+ ev["is_holder_reward"] = len(data) > 335 and _bool(data, 335)
2621
3043
  md = ev.pop("metadata", meta)
2622
3044
  return DexEvent(
2623
3045
  type=EventType.PUMP_SWAP_CREATE_POOL,
@@ -2721,14 +3143,24 @@ def parse_ps_remove_liq_from_data(data: bytes, meta: dict) -> Optional[DexEvent]
2721
3143
 
2722
3144
  # --- Meteora DLMM ---
2723
3145
 
2724
- DLMM_SWAP = _d(143, 190, 90, 218, 196, 30, 51, 222)
2725
- DLMM_ADD_LIQ = _d(181, 157, 89, 67, 143, 182, 52, 72)
2726
- DLMM_REMOVE_LIQ = _d(80, 85, 209, 72, 24, 206, 35, 178)
2727
- DLMM_INIT_POOL = _d(95, 180, 10, 172, 84, 174, 232, 40)
3146
+ DLMM_SWAP = _d(81, 108, 227, 190, 205, 208, 10, 196)
3147
+ DLMM_SWAP2 = _d(46, 116, 82, 215, 148, 27, 84, 77)
3148
+ DLMM_ADD_LIQ = _d(31, 94, 125, 90, 227, 52, 61, 186)
3149
+ DLMM_REMOVE_LIQ = _d(116, 244, 97, 232, 103, 31, 152, 58)
3150
+ DLMM_INIT_POOL = _d(185, 74, 252, 125, 27, 215, 188, 111)
2728
3151
  DLMM_INIT_BIN = _d(11, 18, 155, 194, 33, 115, 238, 119)
2729
- DLMM_CREATE_POS = _d(123, 233, 11, 43, 146, 180, 97, 119)
2730
- DLMM_CLOSE_POS = _d(94, 168, 102, 45, 59, 122, 137, 54)
2731
- DLMM_CLAIM_FEE = _d(152, 70, 208, 111, 104, 91, 44, 1)
3152
+ DLMM_CREATE_POS = _d(144, 142, 252, 84, 157, 53, 37, 121)
3153
+ DLMM_CLOSE_POS = _d(255, 196, 16, 107, 28, 202, 53, 128)
3154
+ DLMM_CLAIM_FEE = _d(75, 122, 154, 48, 140, 74, 123, 163)
3155
+ DLMM_CLAIM_FEE2 = _d(232, 171, 242, 97, 58, 77, 35, 45)
3156
+
3157
+ DLMM_LEGACY_SWAP = _d(143, 190, 90, 218, 196, 30, 51, 222)
3158
+ DLMM_LEGACY_ADD_LIQ = _d(181, 157, 89, 67, 143, 182, 52, 72)
3159
+ DLMM_LEGACY_REMOVE_LIQ = _d(80, 85, 209, 72, 24, 206, 35, 178)
3160
+ DLMM_LEGACY_INIT_POOL = _d(95, 180, 10, 172, 84, 174, 232, 40)
3161
+ DLMM_LEGACY_CREATE_POS = _d(123, 233, 11, 43, 146, 180, 97, 119)
3162
+ DLMM_LEGACY_CLOSE_POS = _d(94, 168, 102, 45, 59, 122, 137, 54)
3163
+ DLMM_LEGACY_CLAIM_FEE = _d(152, 70, 208, 111, 104, 91, 44, 1)
2732
3164
 
2733
3165
 
2734
3166
  def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
@@ -2736,7 +3168,11 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2736
3168
  return None
2737
3169
  d = _disc8(buf[:8])
2738
3170
  data = buf[8:]
2739
- if d == DLMM_SWAP:
3171
+ return parse_dlmm_event_from_data(d, data, meta)
3172
+
3173
+
3174
+ def parse_dlmm_event_from_data(d: int, data: bytes, meta: dict) -> Optional[DexEvent]:
3175
+ if d in (DLMM_SWAP, DLMM_LEGACY_SWAP):
2740
3176
  if len(data) < 32 + 32 + 4 + 4 + 8 + 8 + 1 + 8 + 8 + 16 + 8:
2741
3177
  return None
2742
3178
  o = 0
@@ -2778,7 +3214,51 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2778
3214
  host_fee=hf,
2779
3215
  ),
2780
3216
  )
2781
- if d == DLMM_ADD_LIQ:
3217
+ if d == DLMM_SWAP2:
3218
+ if len(data) < 32 + 32 + 4 + 4 + 1 + 16 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 1 + 1:
3219
+ return None
3220
+ o = 0
3221
+ pool = _pub(data, o)
3222
+ o += 32
3223
+ frm = _pub(data, o)
3224
+ o += 32
3225
+ sb = _i32le(data, o)
3226
+ o += 4
3227
+ eb = _i32le(data, o)
3228
+ o += 4
3229
+ sy = _bool(data, o)
3230
+ o += 1
3231
+ fbps = str(_u128le_int(data, o))
3232
+ o += 16
3233
+ ai = _u64le(data, o)
3234
+ o += 8
3235
+ o += 8
3236
+ ao = _u64le(data, o)
3237
+ o += 8
3238
+ fee = _u64le(data, o)
3239
+ o += 8
3240
+ pf = _u64le(data, o)
3241
+ o += 8
3242
+ o += 8
3243
+ hf = _u64le(data, o)
3244
+ return DexEvent(
3245
+ type=EventType.METEORA_DLMM_SWAP,
3246
+ data=MeteoraDlmmSwapEvent(
3247
+ metadata=_make_meta(meta),
3248
+ pool=pool,
3249
+ from_addr=frm,
3250
+ start_bin_id=sb,
3251
+ end_bin_id=eb,
3252
+ amount_in=ai,
3253
+ amount_out=ao,
3254
+ swap_for_y=sy,
3255
+ fee=fee,
3256
+ protocol_fee=pf,
3257
+ fee_bps=fbps,
3258
+ host_fee=hf,
3259
+ ),
3260
+ )
3261
+ if d in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
2782
3262
  if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
2783
3263
  return None
2784
3264
  o = 0
@@ -2804,7 +3284,7 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2804
3284
  active_bin_id=ab,
2805
3285
  ),
2806
3286
  )
2807
- if d == DLMM_REMOVE_LIQ:
3287
+ if d in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
2808
3288
  if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
2809
3289
  return None
2810
3290
  o = 0
@@ -2831,6 +3311,23 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2831
3311
  ),
2832
3312
  )
2833
3313
  if d == DLMM_INIT_POOL:
3314
+ if len(data) < 32 + 2 + 32 + 32:
3315
+ return None
3316
+ o = 0
3317
+ pool = _pub(data, o)
3318
+ o += 32
3319
+ bs = _u16le(data, o)
3320
+ return DexEvent(
3321
+ type=EventType.METEORA_DLMM_INITIALIZE_POOL,
3322
+ data=MeteoraDlmmInitializePoolEvent(
3323
+ metadata=_make_meta(meta),
3324
+ pool=pool,
3325
+ creator=Z,
3326
+ active_bin_id=0,
3327
+ bin_step=bs,
3328
+ ),
3329
+ )
3330
+ if d == DLMM_LEGACY_INIT_POOL:
2834
3331
  if len(data) < 32 + 32 + 4 + 2:
2835
3332
  return None
2836
3333
  o = 0
@@ -2870,6 +3367,26 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2870
3367
  ),
2871
3368
  )
2872
3369
  if d == DLMM_CREATE_POS:
3370
+ if len(data) < 32 + 32 + 32:
3371
+ return None
3372
+ o = 0
3373
+ pool = _pub(data, o)
3374
+ o += 32
3375
+ pos = _pub(data, o)
3376
+ o += 32
3377
+ owner = _pub(data, o)
3378
+ return DexEvent(
3379
+ type=EventType.METEORA_DLMM_CREATE_POSITION,
3380
+ data=MeteoraDlmmCreatePositionEvent(
3381
+ metadata=_make_meta(meta),
3382
+ pool=pool,
3383
+ position=pos,
3384
+ owner=owner,
3385
+ lower_bin_id=0,
3386
+ width=0,
3387
+ ),
3388
+ )
3389
+ if d == DLMM_LEGACY_CREATE_POS:
2873
3390
  if len(data) < 32 + 32 + 32 + 4 + 4:
2874
3391
  return None
2875
3392
  o = 0
@@ -2894,6 +3411,22 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2894
3411
  ),
2895
3412
  )
2896
3413
  if d == DLMM_CLOSE_POS:
3414
+ if len(data) < 32 + 32:
3415
+ return None
3416
+ o = 0
3417
+ pos = _pub(data, o)
3418
+ o += 32
3419
+ owner = _pub(data, o)
3420
+ return DexEvent(
3421
+ type=EventType.METEORA_DLMM_CLOSE_POSITION,
3422
+ data=MeteoraDlmmClosePositionEvent(
3423
+ metadata=_make_meta(meta),
3424
+ pool=Z,
3425
+ position=pos,
3426
+ owner=owner,
3427
+ ),
3428
+ )
3429
+ if d == DLMM_LEGACY_CLOSE_POS:
2897
3430
  if len(data) < 32 + 32 + 32:
2898
3431
  return None
2899
3432
  o = 0
@@ -2911,7 +3444,7 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2911
3444
  owner=owner,
2912
3445
  ),
2913
3446
  )
2914
- if d == DLMM_CLAIM_FEE:
3447
+ if d in (DLMM_CLAIM_FEE, DLMM_LEGACY_CLAIM_FEE):
2915
3448
  if len(data) < 32 + 32 + 32 + 8 + 8:
2916
3449
  return None
2917
3450
  o = 0
@@ -2935,6 +3468,30 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2935
3468
  fee_y=fy,
2936
3469
  ),
2937
3470
  )
3471
+ if d == DLMM_CLAIM_FEE2:
3472
+ if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
3473
+ return None
3474
+ o = 0
3475
+ pool = _pub(data, o)
3476
+ o += 32
3477
+ pos = _pub(data, o)
3478
+ o += 32
3479
+ owner = _pub(data, o)
3480
+ o += 32
3481
+ fx = _u64le(data, o)
3482
+ o += 8
3483
+ fy = _u64le(data, o)
3484
+ return DexEvent(
3485
+ type=EventType.METEORA_DLMM_CLAIM_FEE,
3486
+ data=MeteoraDlmmClaimFeeEvent(
3487
+ metadata=_make_meta(meta),
3488
+ pool=pool,
3489
+ position=pos,
3490
+ owner=owner,
3491
+ fee_x=fx,
3492
+ fee_y=fy,
3493
+ ),
3494
+ )
2938
3495
  return None
2939
3496
 
2940
3497
 
@@ -2997,11 +3554,16 @@ _LOG_DISCRIMINATOR_EVENT_TYPES = {
2997
3554
  _d(245, 26, 198, 164, 88, 18, 75, 9): EventType.METEORA_POOLS_SET_POOL_FEES,
2998
3555
  DAMM_SWAP: EventType.METEORA_DAMM_V2_SWAP,
2999
3556
  DAMM_SWAP2: EventType.METEORA_DAMM_V2_SWAP,
3000
- _d(175, 242, 8, 157, 30, 247, 185, 169): EventType.METEORA_DAMM_V2_ADD_LIQUIDITY,
3001
- _d(87, 46, 88, 98, 175, 96, 34, 91): EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY,
3002
- _d(228, 50, 246, 85, 203, 66, 134, 37): EventType.METEORA_DAMM_V2_INITIALIZE_POOL,
3003
- _d(156, 15, 119, 198, 29, 181, 221, 55): EventType.METEORA_DAMM_V2_CREATE_POSITION,
3004
- _d(20, 145, 144, 68, 143, 142, 214, 178): EventType.METEORA_DAMM_V2_CLOSE_POSITION,
3557
+ DAMM_ADD_LIQUIDITY: EventType.METEORA_DAMM_V2_ADD_LIQUIDITY,
3558
+ DAMM_REMOVE_LIQUIDITY: EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY,
3559
+ DAMM_LIQUIDITY_CHANGE: EventType.METEORA_DAMM_V2_ADD_LIQUIDITY, # routed by change_type in parser
3560
+ DAMM_INIT_POOL: EventType.METEORA_DAMM_V2_INITIALIZE_POOL,
3561
+ DAMM_CREATE_POSITION: EventType.METEORA_DAMM_V2_CREATE_POSITION,
3562
+ DAMM_CLOSE_POSITION: EventType.METEORA_DAMM_V2_CLOSE_POSITION,
3563
+ DAMM_UPDATE_DELEGATE_PERMISSION: EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION,
3564
+ DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD: EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD,
3565
+ DAMM_CREATE_CONFIG: EventType.METEORA_DAMM_V2_CREATE_CONFIG,
3566
+ DAMM_CREATE_DYNAMIC_CONFIG: EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG,
3005
3567
  DISC_RAYDIUM_LAUNCHLAB_POOL_CREATE: EventType.RAYDIUM_LAUNCHLAB_POOL_CREATE,
3006
3568
  DLMM_ADD_LIQ: EventType.METEORA_DLMM_ADD_LIQUIDITY,
3007
3569
  DLMM_REMOVE_LIQ: EventType.METEORA_DLMM_REMOVE_LIQUIDITY,
@@ -3091,6 +3653,7 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3091
3653
  return mapping.get(disc)
3092
3654
  if program_id == RAYDIUM_CPMM_PROGRAM_ID:
3093
3655
  mapping = {
3656
+ _d(64, 198, 205, 232, 38, 8, 113, 226): EventType.RAYDIUM_CPMM_SWAP,
3094
3657
  _d(143, 190, 90, 218, 196, 30, 51, 222): EventType.RAYDIUM_CPMM_SWAP,
3095
3658
  _d(55, 217, 98, 86, 163, 74, 180, 173): EventType.RAYDIUM_CPMM_SWAP,
3096
3659
  _d(233, 146, 209, 142, 207, 104, 64, 188): EventType.RAYDIUM_CPMM_INITIALIZE,
@@ -3133,12 +3696,22 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3133
3696
  return EventType.METEORA_DAMM_V2_ADD_LIQUIDITY
3134
3697
  if disc == DAMM_REMOVE_LIQUIDITY:
3135
3698
  return EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY
3699
+ if disc == DAMM_LIQUIDITY_CHANGE:
3700
+ return EventType.METEORA_DAMM_V2_ADD_LIQUIDITY
3136
3701
  if disc == DAMM_INIT_POOL:
3137
3702
  return EventType.METEORA_DAMM_V2_INITIALIZE_POOL
3138
3703
  if disc == DAMM_CREATE_POSITION:
3139
3704
  return EventType.METEORA_DAMM_V2_CREATE_POSITION
3140
3705
  if disc == DAMM_CLOSE_POSITION:
3141
3706
  return EventType.METEORA_DAMM_V2_CLOSE_POSITION
3707
+ if disc == DAMM_UPDATE_DELEGATE_PERMISSION:
3708
+ return EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION
3709
+ if disc == DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD:
3710
+ return EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD
3711
+ if disc == DAMM_CREATE_CONFIG:
3712
+ return EventType.METEORA_DAMM_V2_CREATE_CONFIG
3713
+ if disc == DAMM_CREATE_DYNAMIC_CONFIG:
3714
+ return EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG
3142
3715
  return None
3143
3716
  if program_id == METEORA_DBC_PROGRAM_ID:
3144
3717
  if disc == DBC_SWAP:
@@ -3149,21 +3722,21 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3149
3722
  return EventType.METEORA_DBC_CURVE_COMPLETE
3150
3723
  return None
3151
3724
  if program_id == METEORA_DLMM_PROGRAM_ID:
3152
- if disc == DLMM_SWAP:
3725
+ if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
3153
3726
  return EventType.METEORA_DLMM_SWAP
3154
- if disc == DLMM_ADD_LIQ:
3727
+ if disc in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
3155
3728
  return EventType.METEORA_DLMM_ADD_LIQUIDITY
3156
- if disc == DLMM_REMOVE_LIQ:
3729
+ if disc in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
3157
3730
  return EventType.METEORA_DLMM_REMOVE_LIQUIDITY
3158
- if disc == DLMM_INIT_POOL:
3731
+ if disc in (DLMM_INIT_POOL, DLMM_LEGACY_INIT_POOL):
3159
3732
  return EventType.METEORA_DLMM_INITIALIZE_POOL
3160
3733
  if disc == DLMM_INIT_BIN:
3161
3734
  return EventType.METEORA_DLMM_INITIALIZE_BIN_ARRAY
3162
- if disc == DLMM_CREATE_POS:
3735
+ if disc in (DLMM_CREATE_POS, DLMM_LEGACY_CREATE_POS):
3163
3736
  return EventType.METEORA_DLMM_CREATE_POSITION
3164
- if disc == DLMM_CLOSE_POS:
3737
+ if disc in (DLMM_CLOSE_POS, DLMM_LEGACY_CLOSE_POS):
3165
3738
  return EventType.METEORA_DLMM_CLOSE_POSITION
3166
- if disc == DLMM_CLAIM_FEE:
3739
+ if disc in (DLMM_CLAIM_FEE, DLMM_CLAIM_FEE2, DLMM_LEGACY_CLAIM_FEE):
3167
3740
  return EventType.METEORA_DLMM_CLAIM_FEE
3168
3741
  return None
3169
3742
  return event_type_for_discriminator(disc)
@@ -3194,7 +3767,7 @@ def filter_allows_unscoped_discriminator(event_type_filter: Any, disc: int) -> b
3194
3767
  return filter_wants_pumpfun_trade(event_type_filter) or filter_wants_raydium_launchlab_trade(
3195
3768
  event_type_filter
3196
3769
  )
3197
- if disc == DLMM_SWAP:
3770
+ if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
3198
3771
  return event_type_filter.should_include(EventType.RAYDIUM_CPMM_SWAP) or event_type_filter.should_include(
3199
3772
  EventType.METEORA_DLMM_SWAP
3200
3773
  )
@@ -3441,6 +4014,8 @@ def dispatch_program_data(
3441
4014
  return parse_clmm_collect_protocol_from_data(data, meta)
3442
4015
  return None
3443
4016
  if program_id == RAYDIUM_CPMM_PROGRAM_ID:
4017
+ if disc == _d(64, 198, 205, 232, 38, 8, 113, 226):
4018
+ return parse_cpmm_swap_event_from_data(data, meta)
3444
4019
  if disc == _d(143, 190, 90, 218, 196, 30, 51, 222):
3445
4020
  return parse_cpmm_swap_in_from_data(data, meta)
3446
4021
  if disc == _d(55, 217, 98, 86, 163, 74, 180, 173):
@@ -3610,11 +4185,16 @@ def dispatch_program_data(
3610
4185
  if disc in (
3611
4186
  DAMM_SWAP,
3612
4187
  DAMM_SWAP2,
3613
- _d(175, 242, 8, 157, 30, 247, 185, 169),
3614
- _d(87, 46, 88, 98, 175, 96, 34, 91),
3615
- _d(228, 50, 246, 85, 203, 66, 134, 37),
3616
- _d(156, 15, 119, 198, 29, 181, 221, 55),
3617
- _d(20, 145, 144, 68, 143, 142, 214, 178),
4188
+ DAMM_ADD_LIQUIDITY,
4189
+ DAMM_REMOVE_LIQUIDITY,
4190
+ DAMM_LIQUIDITY_CHANGE,
4191
+ DAMM_INIT_POOL,
4192
+ DAMM_CREATE_POSITION,
4193
+ DAMM_CLOSE_POSITION,
4194
+ DAMM_UPDATE_DELEGATE_PERMISSION,
4195
+ DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD,
4196
+ DAMM_CREATE_CONFIG,
4197
+ DAMM_CREATE_DYNAMIC_CONFIG,
3618
4198
  ):
3619
4199
  return parse_meteora_damm_from_buf(buf, meta)
3620
4200
  raydium_launchlab = parse_raydium_launchlab_from_discriminator(disc, data, meta)