sol-parser-sdk-python 0.5.7__py3-none-any.whl → 0.5.9__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)
@@ -2355,7 +2727,7 @@ def parse_raydium_launchlab_from_discriminator(disc: int, data: bytes, meta: dic
2355
2727
 
2356
2728
 
2357
2729
  def _parse_raydium_launchlab_trade(data: bytes, meta: dict) -> Optional[DexEvent]:
2358
- if len(data) < 139:
2730
+ if len(data) != 139 or data[136] > 1 or data[137] > 2 or data[138] > 1:
2359
2731
  return None
2360
2732
  pool = _pub(data, 0)
2361
2733
  ai = _u64le(data, 88)
@@ -2374,6 +2746,19 @@ def _parse_raydium_launchlab_trade(data: bytes, meta: dict) -> Optional[DexEvent
2374
2746
  is_buy=is_buy,
2375
2747
  trade_direction=d,
2376
2748
  exact_in=ex_in,
2749
+ pool_status=("Fund","Migrate","Trade")[data[137]],
2750
+ total_base_sell=_u64le(data,32),
2751
+ virtual_base=_u64le(data,40),
2752
+ virtual_quote=_u64le(data,48),
2753
+ real_base_before=_u64le(data,56),
2754
+ real_quote_before=_u64le(data,64),
2755
+ real_base_after=_u64le(data,72),
2756
+ real_quote_after=_u64le(data,80),
2757
+ protocol_fee=_u64le(data,104),
2758
+ platform_fee=_u64le(data,112),
2759
+ creator_fee=_u64le(data,120),
2760
+ share_fee=_u64le(data,128),
2761
+
2377
2762
  ),
2378
2763
  )
2379
2764
 
@@ -2406,9 +2791,56 @@ def _parse_raydium_launchlab_pool_create(data: bytes, meta: dict) -> Optional[De
2406
2791
  # --- PumpSwap ---
2407
2792
 
2408
2793
 
2794
+ def _parse_pumpswap_trade_tail(data: bytes) -> Optional[Dict[str, Any]]:
2795
+ tail: Dict[str, Any] = {
2796
+ "cashback_fee_basis_points": 0,
2797
+ "cashback": 0,
2798
+ "buyback_fee_basis_points": 0,
2799
+ "buyback_fee": 0,
2800
+ "virtual_quote_reserves": 0,
2801
+ "can_boost": False,
2802
+ "base_supply": 0,
2803
+ "holder_rewards_bps": 0,
2804
+ "holder_rewards": 0,
2805
+ }
2806
+ if not data:
2807
+ return tail
2808
+ if len(data) < 16:
2809
+ return None
2810
+
2811
+ tail["cashback_fee_basis_points"] = _u64le(data, 0)
2812
+ tail["cashback"] = _u64le(data, 8)
2813
+ if len(data) == 16:
2814
+ return tail
2815
+ if len(data) < 32:
2816
+ return None
2817
+
2818
+ tail["buyback_fee_basis_points"] = _u64le(data, 16)
2819
+ tail["buyback_fee"] = _u64le(data, 24)
2820
+ if len(data) == 32:
2821
+ return tail
2822
+ if len(data) < 57:
2823
+ return None
2824
+
2825
+ tail["virtual_quote_reserves"] = int.from_bytes(data[32:48], "little", signed=True)
2826
+ if data[48] not in (0, 1):
2827
+ return None
2828
+ tail["can_boost"] = data[48] == 1
2829
+ tail["base_supply"] = _u64le(data, 49)
2830
+ if len(data) != 57 and len(data) < 73:
2831
+ return None
2832
+ if len(data) >= 73:
2833
+ tail["holder_rewards_bps"] = _u64le(data, 57)
2834
+ tail["holder_rewards"] = _u64le(data, 65)
2835
+ return tail
2836
+
2837
+
2409
2838
  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:
2839
+ legacy_len = 16 * 8 + 7 * 32 + 1 + 4 * 8
2840
+ min_required_len = legacy_len + 8 + 4
2841
+ if len(data) != legacy_len and len(data) < min_required_len:
2842
+ return None
2843
+ if data[352] not in (0, 1):
2412
2844
  return None
2413
2845
  o = 0
2414
2846
 
@@ -2457,36 +2889,36 @@ def parse_ps_buy_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2457
2889
  "coin_creator_fee_basis_points": rd(),
2458
2890
  "coin_creator_fee": rd(),
2459
2891
  }
2460
- tv = _bool(data, o)
2892
+ tv = data[o] == 1
2461
2893
  o += 1
2462
2894
  ev["track_volume"] = tv
2463
2895
  ev["total_unclaimed_tokens"] = rd()
2464
2896
  ev["total_claimed_tokens"] = rd()
2465
2897
  ev["current_sol_volume"] = rd()
2466
2898
  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)
2899
+ ev["min_base_amount_out"] = 0
2900
+ ev["ix_name"] = ""
2901
+ tail = _parse_pumpswap_trade_tail(b"")
2902
+ if len(data) != legacy_len:
2903
+ ev["min_base_amount_out"] = rd()
2904
+ if o + 4 > len(data):
2905
+ return None
2906
+ name_len = _u32le(data, o)
2471
2907
  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
2908
+ name_end = o + name_len
2909
+ if name_end > len(data):
2910
+ return None
2911
+ try:
2912
+ ev["ix_name"] = data[o:name_end].decode("utf-8")
2913
+ except UnicodeDecodeError:
2914
+ return None
2915
+ o = name_end
2916
+ tail = _parse_pumpswap_trade_tail(data[o:])
2917
+ if tail is None:
2918
+ return None
2919
+ assert tail is not None
2920
+ ev.update(tail)
2921
+ ev["is_cashback_coin"] = tail["cashback_fee_basis_points"] > 0
2490
2922
  md = ev.pop("metadata", meta)
2491
2923
  return DexEvent(
2492
2924
  type=EventType.PUMP_SWAP_BUY,
@@ -2495,9 +2927,12 @@ def parse_ps_buy_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2495
2927
 
2496
2928
 
2497
2929
  def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2498
- req = 13 * 8 + 7 * 32
2930
+ req = 14 * 8 + 7 * 32 + 2 * 8
2499
2931
  if len(data) < req:
2500
2932
  return None
2933
+ tail = _parse_pumpswap_trade_tail(data[req:])
2934
+ if tail is None:
2935
+ return None
2501
2936
  o = 0
2502
2937
 
2503
2938
  def rd() -> int:
@@ -2544,12 +2979,7 @@ def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2544
2979
  "coin_creator_fee_basis_points": rd(),
2545
2980
  "coin_creator_fee": rd(),
2546
2981
  }
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
2982
+ ev.update(tail)
2553
2983
  md = ev.pop("metadata", meta)
2554
2984
  return DexEvent(
2555
2985
  type=EventType.PUMP_SWAP_SELL,
@@ -2558,9 +2988,11 @@ def parse_ps_sell_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2558
2988
 
2559
2989
 
2560
2990
  def parse_ps_create_pool_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
2561
- req = 8 + 2 + 32 * 6 + 2 + 8 * 7 + 1
2991
+ req = 326
2562
2992
  if len(data) < req:
2563
2993
  return None
2994
+ if len(data) != req and len(data) < 335:
2995
+ return None
2564
2996
  o = 0
2565
2997
  ts = _i64le(data, o)
2566
2998
  o += 8
@@ -2618,6 +3050,9 @@ def parse_ps_create_pool_from_data(data: bytes, meta: dict) -> Optional[DexEvent
2618
3050
  ev["user_quote_token_account"] = uqa
2619
3051
  ev["coin_creator"] = cc
2620
3052
  ev["is_mayhem_mode"] = len(data) > 325 and _bool(data, 325)
3053
+ ev["creator_fee_bps"] = _u64le(data, 326) if len(data) >= 334 else 0
3054
+ ev["can_edit_creator_fee"] = len(data) > 334 and _bool(data, 334)
3055
+ ev["is_holder_reward"] = len(data) > 335 and _bool(data, 335)
2621
3056
  md = ev.pop("metadata", meta)
2622
3057
  return DexEvent(
2623
3058
  type=EventType.PUMP_SWAP_CREATE_POOL,
@@ -2721,14 +3156,24 @@ def parse_ps_remove_liq_from_data(data: bytes, meta: dict) -> Optional[DexEvent]
2721
3156
 
2722
3157
  # --- Meteora DLMM ---
2723
3158
 
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)
3159
+ DLMM_SWAP = _d(81, 108, 227, 190, 205, 208, 10, 196)
3160
+ DLMM_SWAP2 = _d(46, 116, 82, 215, 148, 27, 84, 77)
3161
+ DLMM_ADD_LIQ = _d(31, 94, 125, 90, 227, 52, 61, 186)
3162
+ DLMM_REMOVE_LIQ = _d(116, 244, 97, 232, 103, 31, 152, 58)
3163
+ DLMM_INIT_POOL = _d(185, 74, 252, 125, 27, 215, 188, 111)
2728
3164
  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)
3165
+ DLMM_CREATE_POS = _d(144, 142, 252, 84, 157, 53, 37, 121)
3166
+ DLMM_CLOSE_POS = _d(255, 196, 16, 107, 28, 202, 53, 128)
3167
+ DLMM_CLAIM_FEE = _d(75, 122, 154, 48, 140, 74, 123, 163)
3168
+ DLMM_CLAIM_FEE2 = _d(232, 171, 242, 97, 58, 77, 35, 45)
3169
+
3170
+ DLMM_LEGACY_SWAP = _d(143, 190, 90, 218, 196, 30, 51, 222)
3171
+ DLMM_LEGACY_ADD_LIQ = _d(181, 157, 89, 67, 143, 182, 52, 72)
3172
+ DLMM_LEGACY_REMOVE_LIQ = _d(80, 85, 209, 72, 24, 206, 35, 178)
3173
+ DLMM_LEGACY_INIT_POOL = _d(95, 180, 10, 172, 84, 174, 232, 40)
3174
+ DLMM_LEGACY_CREATE_POS = _d(123, 233, 11, 43, 146, 180, 97, 119)
3175
+ DLMM_LEGACY_CLOSE_POS = _d(94, 168, 102, 45, 59, 122, 137, 54)
3176
+ DLMM_LEGACY_CLAIM_FEE = _d(152, 70, 208, 111, 104, 91, 44, 1)
2732
3177
 
2733
3178
 
2734
3179
  def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
@@ -2736,7 +3181,11 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2736
3181
  return None
2737
3182
  d = _disc8(buf[:8])
2738
3183
  data = buf[8:]
2739
- if d == DLMM_SWAP:
3184
+ return parse_dlmm_event_from_data(d, data, meta)
3185
+
3186
+
3187
+ def parse_dlmm_event_from_data(d: int, data: bytes, meta: dict) -> Optional[DexEvent]:
3188
+ if d in (DLMM_SWAP, DLMM_LEGACY_SWAP):
2740
3189
  if len(data) < 32 + 32 + 4 + 4 + 8 + 8 + 1 + 8 + 8 + 16 + 8:
2741
3190
  return None
2742
3191
  o = 0
@@ -2778,7 +3227,51 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2778
3227
  host_fee=hf,
2779
3228
  ),
2780
3229
  )
2781
- if d == DLMM_ADD_LIQ:
3230
+ if d == DLMM_SWAP2:
3231
+ if len(data) < 32 + 32 + 4 + 4 + 1 + 16 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 1 + 1:
3232
+ return None
3233
+ o = 0
3234
+ pool = _pub(data, o)
3235
+ o += 32
3236
+ frm = _pub(data, o)
3237
+ o += 32
3238
+ sb = _i32le(data, o)
3239
+ o += 4
3240
+ eb = _i32le(data, o)
3241
+ o += 4
3242
+ sy = _bool(data, o)
3243
+ o += 1
3244
+ fbps = str(_u128le_int(data, o))
3245
+ o += 16
3246
+ ai = _u64le(data, o)
3247
+ o += 8
3248
+ o += 8
3249
+ ao = _u64le(data, o)
3250
+ o += 8
3251
+ fee = _u64le(data, o)
3252
+ o += 8
3253
+ pf = _u64le(data, o)
3254
+ o += 8
3255
+ o += 8
3256
+ hf = _u64le(data, o)
3257
+ return DexEvent(
3258
+ type=EventType.METEORA_DLMM_SWAP,
3259
+ data=MeteoraDlmmSwapEvent(
3260
+ metadata=_make_meta(meta),
3261
+ pool=pool,
3262
+ from_addr=frm,
3263
+ start_bin_id=sb,
3264
+ end_bin_id=eb,
3265
+ amount_in=ai,
3266
+ amount_out=ao,
3267
+ swap_for_y=sy,
3268
+ fee=fee,
3269
+ protocol_fee=pf,
3270
+ fee_bps=fbps,
3271
+ host_fee=hf,
3272
+ ),
3273
+ )
3274
+ if d in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
2782
3275
  if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
2783
3276
  return None
2784
3277
  o = 0
@@ -2804,7 +3297,7 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2804
3297
  active_bin_id=ab,
2805
3298
  ),
2806
3299
  )
2807
- if d == DLMM_REMOVE_LIQ:
3300
+ if d in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
2808
3301
  if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
2809
3302
  return None
2810
3303
  o = 0
@@ -2831,6 +3324,23 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2831
3324
  ),
2832
3325
  )
2833
3326
  if d == DLMM_INIT_POOL:
3327
+ if len(data) < 32 + 2 + 32 + 32:
3328
+ return None
3329
+ o = 0
3330
+ pool = _pub(data, o)
3331
+ o += 32
3332
+ bs = _u16le(data, o)
3333
+ return DexEvent(
3334
+ type=EventType.METEORA_DLMM_INITIALIZE_POOL,
3335
+ data=MeteoraDlmmInitializePoolEvent(
3336
+ metadata=_make_meta(meta),
3337
+ pool=pool,
3338
+ creator=Z,
3339
+ active_bin_id=0,
3340
+ bin_step=bs,
3341
+ ),
3342
+ )
3343
+ if d == DLMM_LEGACY_INIT_POOL:
2834
3344
  if len(data) < 32 + 32 + 4 + 2:
2835
3345
  return None
2836
3346
  o = 0
@@ -2870,6 +3380,26 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2870
3380
  ),
2871
3381
  )
2872
3382
  if d == DLMM_CREATE_POS:
3383
+ if len(data) < 32 + 32 + 32:
3384
+ return None
3385
+ o = 0
3386
+ pool = _pub(data, o)
3387
+ o += 32
3388
+ pos = _pub(data, o)
3389
+ o += 32
3390
+ owner = _pub(data, o)
3391
+ return DexEvent(
3392
+ type=EventType.METEORA_DLMM_CREATE_POSITION,
3393
+ data=MeteoraDlmmCreatePositionEvent(
3394
+ metadata=_make_meta(meta),
3395
+ pool=pool,
3396
+ position=pos,
3397
+ owner=owner,
3398
+ lower_bin_id=0,
3399
+ width=0,
3400
+ ),
3401
+ )
3402
+ if d == DLMM_LEGACY_CREATE_POS:
2873
3403
  if len(data) < 32 + 32 + 32 + 4 + 4:
2874
3404
  return None
2875
3405
  o = 0
@@ -2894,6 +3424,22 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2894
3424
  ),
2895
3425
  )
2896
3426
  if d == DLMM_CLOSE_POS:
3427
+ if len(data) < 32 + 32:
3428
+ return None
3429
+ o = 0
3430
+ pos = _pub(data, o)
3431
+ o += 32
3432
+ owner = _pub(data, o)
3433
+ return DexEvent(
3434
+ type=EventType.METEORA_DLMM_CLOSE_POSITION,
3435
+ data=MeteoraDlmmClosePositionEvent(
3436
+ metadata=_make_meta(meta),
3437
+ pool=Z,
3438
+ position=pos,
3439
+ owner=owner,
3440
+ ),
3441
+ )
3442
+ if d == DLMM_LEGACY_CLOSE_POS:
2897
3443
  if len(data) < 32 + 32 + 32:
2898
3444
  return None
2899
3445
  o = 0
@@ -2911,7 +3457,7 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2911
3457
  owner=owner,
2912
3458
  ),
2913
3459
  )
2914
- if d == DLMM_CLAIM_FEE:
3460
+ if d in (DLMM_CLAIM_FEE, DLMM_LEGACY_CLAIM_FEE):
2915
3461
  if len(data) < 32 + 32 + 32 + 8 + 8:
2916
3462
  return None
2917
3463
  o = 0
@@ -2935,6 +3481,30 @@ def parse_dlmm_from_program_data(buf: bytes, meta: dict) -> Optional[DexEvent]:
2935
3481
  fee_y=fy,
2936
3482
  ),
2937
3483
  )
3484
+ if d == DLMM_CLAIM_FEE2:
3485
+ if len(data) < 32 + 32 + 32 + 8 + 8 + 4:
3486
+ return None
3487
+ o = 0
3488
+ pool = _pub(data, o)
3489
+ o += 32
3490
+ pos = _pub(data, o)
3491
+ o += 32
3492
+ owner = _pub(data, o)
3493
+ o += 32
3494
+ fx = _u64le(data, o)
3495
+ o += 8
3496
+ fy = _u64le(data, o)
3497
+ return DexEvent(
3498
+ type=EventType.METEORA_DLMM_CLAIM_FEE,
3499
+ data=MeteoraDlmmClaimFeeEvent(
3500
+ metadata=_make_meta(meta),
3501
+ pool=pool,
3502
+ position=pos,
3503
+ owner=owner,
3504
+ fee_x=fx,
3505
+ fee_y=fy,
3506
+ ),
3507
+ )
2938
3508
  return None
2939
3509
 
2940
3510
 
@@ -2997,11 +3567,16 @@ _LOG_DISCRIMINATOR_EVENT_TYPES = {
2997
3567
  _d(245, 26, 198, 164, 88, 18, 75, 9): EventType.METEORA_POOLS_SET_POOL_FEES,
2998
3568
  DAMM_SWAP: EventType.METEORA_DAMM_V2_SWAP,
2999
3569
  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,
3570
+ DAMM_ADD_LIQUIDITY: EventType.METEORA_DAMM_V2_ADD_LIQUIDITY,
3571
+ DAMM_REMOVE_LIQUIDITY: EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY,
3572
+ DAMM_LIQUIDITY_CHANGE: EventType.METEORA_DAMM_V2_ADD_LIQUIDITY, # routed by change_type in parser
3573
+ DAMM_INIT_POOL: EventType.METEORA_DAMM_V2_INITIALIZE_POOL,
3574
+ DAMM_CREATE_POSITION: EventType.METEORA_DAMM_V2_CREATE_POSITION,
3575
+ DAMM_CLOSE_POSITION: EventType.METEORA_DAMM_V2_CLOSE_POSITION,
3576
+ DAMM_UPDATE_DELEGATE_PERMISSION: EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION,
3577
+ DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD: EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD,
3578
+ DAMM_CREATE_CONFIG: EventType.METEORA_DAMM_V2_CREATE_CONFIG,
3579
+ DAMM_CREATE_DYNAMIC_CONFIG: EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG,
3005
3580
  DISC_RAYDIUM_LAUNCHLAB_POOL_CREATE: EventType.RAYDIUM_LAUNCHLAB_POOL_CREATE,
3006
3581
  DLMM_ADD_LIQ: EventType.METEORA_DLMM_ADD_LIQUIDITY,
3007
3582
  DLMM_REMOVE_LIQ: EventType.METEORA_DLMM_REMOVE_LIQUIDITY,
@@ -3091,6 +3666,7 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3091
3666
  return mapping.get(disc)
3092
3667
  if program_id == RAYDIUM_CPMM_PROGRAM_ID:
3093
3668
  mapping = {
3669
+ _d(64, 198, 205, 232, 38, 8, 113, 226): EventType.RAYDIUM_CPMM_SWAP,
3094
3670
  _d(143, 190, 90, 218, 196, 30, 51, 222): EventType.RAYDIUM_CPMM_SWAP,
3095
3671
  _d(55, 217, 98, 86, 163, 74, 180, 173): EventType.RAYDIUM_CPMM_SWAP,
3096
3672
  _d(233, 146, 209, 142, 207, 104, 64, 188): EventType.RAYDIUM_CPMM_INITIALIZE,
@@ -3133,12 +3709,22 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3133
3709
  return EventType.METEORA_DAMM_V2_ADD_LIQUIDITY
3134
3710
  if disc == DAMM_REMOVE_LIQUIDITY:
3135
3711
  return EventType.METEORA_DAMM_V2_REMOVE_LIQUIDITY
3712
+ if disc == DAMM_LIQUIDITY_CHANGE:
3713
+ return EventType.METEORA_DAMM_V2_ADD_LIQUIDITY
3136
3714
  if disc == DAMM_INIT_POOL:
3137
3715
  return EventType.METEORA_DAMM_V2_INITIALIZE_POOL
3138
3716
  if disc == DAMM_CREATE_POSITION:
3139
3717
  return EventType.METEORA_DAMM_V2_CREATE_POSITION
3140
3718
  if disc == DAMM_CLOSE_POSITION:
3141
3719
  return EventType.METEORA_DAMM_V2_CLOSE_POSITION
3720
+ if disc == DAMM_UPDATE_DELEGATE_PERMISSION:
3721
+ return EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION
3722
+ if disc == DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD:
3723
+ return EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD
3724
+ if disc == DAMM_CREATE_CONFIG:
3725
+ return EventType.METEORA_DAMM_V2_CREATE_CONFIG
3726
+ if disc == DAMM_CREATE_DYNAMIC_CONFIG:
3727
+ return EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG
3142
3728
  return None
3143
3729
  if program_id == METEORA_DBC_PROGRAM_ID:
3144
3730
  if disc == DBC_SWAP:
@@ -3149,21 +3735,21 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
3149
3735
  return EventType.METEORA_DBC_CURVE_COMPLETE
3150
3736
  return None
3151
3737
  if program_id == METEORA_DLMM_PROGRAM_ID:
3152
- if disc == DLMM_SWAP:
3738
+ if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
3153
3739
  return EventType.METEORA_DLMM_SWAP
3154
- if disc == DLMM_ADD_LIQ:
3740
+ if disc in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
3155
3741
  return EventType.METEORA_DLMM_ADD_LIQUIDITY
3156
- if disc == DLMM_REMOVE_LIQ:
3742
+ if disc in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
3157
3743
  return EventType.METEORA_DLMM_REMOVE_LIQUIDITY
3158
- if disc == DLMM_INIT_POOL:
3744
+ if disc in (DLMM_INIT_POOL, DLMM_LEGACY_INIT_POOL):
3159
3745
  return EventType.METEORA_DLMM_INITIALIZE_POOL
3160
3746
  if disc == DLMM_INIT_BIN:
3161
3747
  return EventType.METEORA_DLMM_INITIALIZE_BIN_ARRAY
3162
- if disc == DLMM_CREATE_POS:
3748
+ if disc in (DLMM_CREATE_POS, DLMM_LEGACY_CREATE_POS):
3163
3749
  return EventType.METEORA_DLMM_CREATE_POSITION
3164
- if disc == DLMM_CLOSE_POS:
3750
+ if disc in (DLMM_CLOSE_POS, DLMM_LEGACY_CLOSE_POS):
3165
3751
  return EventType.METEORA_DLMM_CLOSE_POSITION
3166
- if disc == DLMM_CLAIM_FEE:
3752
+ if disc in (DLMM_CLAIM_FEE, DLMM_CLAIM_FEE2, DLMM_LEGACY_CLAIM_FEE):
3167
3753
  return EventType.METEORA_DLMM_CLAIM_FEE
3168
3754
  return None
3169
3755
  return event_type_for_discriminator(disc)
@@ -3194,7 +3780,7 @@ def filter_allows_unscoped_discriminator(event_type_filter: Any, disc: int) -> b
3194
3780
  return filter_wants_pumpfun_trade(event_type_filter) or filter_wants_raydium_launchlab_trade(
3195
3781
  event_type_filter
3196
3782
  )
3197
- if disc == DLMM_SWAP:
3783
+ if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
3198
3784
  return event_type_filter.should_include(EventType.RAYDIUM_CPMM_SWAP) or event_type_filter.should_include(
3199
3785
  EventType.METEORA_DLMM_SWAP
3200
3786
  )
@@ -3441,6 +4027,8 @@ def dispatch_program_data(
3441
4027
  return parse_clmm_collect_protocol_from_data(data, meta)
3442
4028
  return None
3443
4029
  if program_id == RAYDIUM_CPMM_PROGRAM_ID:
4030
+ if disc == _d(64, 198, 205, 232, 38, 8, 113, 226):
4031
+ return parse_cpmm_swap_event_from_data(data, meta)
3444
4032
  if disc == _d(143, 190, 90, 218, 196, 30, 51, 222):
3445
4033
  return parse_cpmm_swap_in_from_data(data, meta)
3446
4034
  if disc == _d(55, 217, 98, 86, 163, 74, 180, 173):
@@ -3610,11 +4198,16 @@ def dispatch_program_data(
3610
4198
  if disc in (
3611
4199
  DAMM_SWAP,
3612
4200
  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),
4201
+ DAMM_ADD_LIQUIDITY,
4202
+ DAMM_REMOVE_LIQUIDITY,
4203
+ DAMM_LIQUIDITY_CHANGE,
4204
+ DAMM_INIT_POOL,
4205
+ DAMM_CREATE_POSITION,
4206
+ DAMM_CLOSE_POSITION,
4207
+ DAMM_UPDATE_DELEGATE_PERMISSION,
4208
+ DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD,
4209
+ DAMM_CREATE_CONFIG,
4210
+ DAMM_CREATE_DYNAMIC_CONFIG,
3618
4211
  ):
3619
4212
  return parse_meteora_damm_from_buf(buf, meta)
3620
4213
  raydium_launchlab = parse_raydium_launchlab_from_discriminator(disc, data, meta)