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/__init__.py +34 -0
- sol_parser/account_dispatcher.py +98 -4
- sol_parser/account_fillers/meteora.py +10 -2
- sol_parser/account_fillers/raydium.py +9 -4
- sol_parser/account_fillers/raydium_launchlab.py +54 -0
- sol_parser/accounts/__init__.py +52 -2
- sol_parser/block_meta.py +29 -0
- sol_parser/dex_parsers.py +662 -69
- sol_parser/entries_decode.py +6 -80
- sol_parser/event_type_parity.py +4 -0
- sol_parser/event_types.py +269 -3
- sol_parser/grpc/subscribe_builder.py +8 -0
- sol_parser/grpc_client.py +114 -20
- sol_parser/grpc_instruction_parser.py +85 -26
- sol_parser/grpc_types.py +31 -0
- sol_parser/inner_instruction_parser.py +5 -7
- sol_parser/instructions.py +259 -53
- sol_parser/json_util.py +15 -1
- sol_parser/liquidity_snapshot.py +101 -0
- 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/simulation_route.py +233 -0
- sol_parser/stonkfun_registry.py +139 -0
- sol_parser/transaction_route.py +510 -0
- sol_parser/wire_transaction.py +172 -0
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.9.dist-info}/METADATA +44 -9
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.9.dist-info}/RECORD +32 -26
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.9.dist-info}/WHEEL +1 -1
- {sol_parser_sdk_python-0.5.7.dist-info → sol_parser_sdk_python-0.5.9.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)
|
|
@@ -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)
|
|
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
|
-
|
|
2411
|
-
|
|
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 =
|
|
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"] =
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
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(
|
|
2730
|
-
DLMM_CLOSE_POS = _d(
|
|
2731
|
-
DLMM_CLAIM_FEE = _d(
|
|
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
|
-
|
|
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 ==
|
|
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
|
|
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
|
|
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
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
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
|
|
3738
|
+
if disc in (DLMM_SWAP, DLMM_SWAP2, DLMM_LEGACY_SWAP):
|
|
3153
3739
|
return EventType.METEORA_DLMM_SWAP
|
|
3154
|
-
if disc
|
|
3740
|
+
if disc in (DLMM_ADD_LIQ, DLMM_LEGACY_ADD_LIQ):
|
|
3155
3741
|
return EventType.METEORA_DLMM_ADD_LIQUIDITY
|
|
3156
|
-
if disc
|
|
3742
|
+
if disc in (DLMM_REMOVE_LIQ, DLMM_LEGACY_REMOVE_LIQ):
|
|
3157
3743
|
return EventType.METEORA_DLMM_REMOVE_LIQUIDITY
|
|
3158
|
-
if disc
|
|
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
|
|
3748
|
+
if disc in (DLMM_CREATE_POS, DLMM_LEGACY_CREATE_POS):
|
|
3163
3749
|
return EventType.METEORA_DLMM_CREATE_POSITION
|
|
3164
|
-
if disc
|
|
3750
|
+
if disc in (DLMM_CLOSE_POS, DLMM_LEGACY_CLOSE_POS):
|
|
3165
3751
|
return EventType.METEORA_DLMM_CLOSE_POSITION
|
|
3166
|
-
if disc
|
|
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
|
|
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
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
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)
|