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/__init__.py +10 -0
- sol_parser/account_dispatcher.py +79 -0
- sol_parser/account_fillers/meteora.py +10 -2
- sol_parser/account_fillers/raydium.py +3 -2
- sol_parser/account_fillers/raydium_launchlab.py +50 -0
- sol_parser/accounts/__init__.py +47 -2
- sol_parser/dex_parsers.py +648 -68
- sol_parser/event_type_parity.py +4 -0
- sol_parser/event_types.py +221 -3
- sol_parser/grpc_instruction_parser.py +85 -26
- sol_parser/grpc_types.py +12 -0
- sol_parser/inner_instruction_parser.py +5 -7
- sol_parser/instructions.py +213 -49
- sol_parser/log_instr_dedup.py +56 -12
- sol_parser/merger.py +73 -85
- sol_parser/parser.py +11 -0
- sol_parser/pumpfun_fee_enrich.py +2 -0
- sol_parser/rpc_parser.py +30 -4
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.8.dist-info}/METADATA +26 -9
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.8.dist-info}/RECORD +22 -22
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.8.dist-info}/WHEEL +1 -1
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.8.dist-info}/entry_points.txt +0 -0
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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
|
-
|
|
2411
|
-
|
|
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 =
|
|
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"] =
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
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
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
o
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
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(
|
|
2730
|
-
DLMM_CLOSE_POS = _d(
|
|
2731
|
-
DLMM_CLAIM_FEE = _d(
|
|
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
|
-
|
|
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 ==
|
|
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
|
|
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
|
|
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
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
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
|
|
3725
|
+
if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
|
|
3153
3726
|
return EventType.METEORA_DLMM_SWAP
|
|
3154
|
-
if disc
|
|
3727
|
+
if disc in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
|
|
3155
3728
|
return EventType.METEORA_DLMM_ADD_LIQUIDITY
|
|
3156
|
-
if disc
|
|
3729
|
+
if disc in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
|
|
3157
3730
|
return EventType.METEORA_DLMM_REMOVE_LIQUIDITY
|
|
3158
|
-
if disc
|
|
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
|
|
3735
|
+
if disc in (DLMM_CREATE_POS, DLMM_LEGACY_CREATE_POS):
|
|
3163
3736
|
return EventType.METEORA_DLMM_CREATE_POSITION
|
|
3164
|
-
if disc
|
|
3737
|
+
if disc in (DLMM_CLOSE_POS, DLMM_LEGACY_CLOSE_POS):
|
|
3165
3738
|
return EventType.METEORA_DLMM_CLOSE_POSITION
|
|
3166
|
-
if disc
|
|
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
|
|
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
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
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)
|