sol-parser-sdk-python 0.5.9__py3-none-any.whl → 0.5.11__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 +21 -0
- sol_parser/account_dispatcher.py +120 -7
- sol_parser/account_fillers/pumpfun.py +25 -15
- sol_parser/account_fillers/pumpswap.py +45 -2
- sol_parser/account_fillers/raydium.py +25 -0
- sol_parser/accounts/__init__.py +19 -1
- sol_parser/dex_parsers.py +242 -5
- sol_parser/event_type_parity.py +8 -0
- sol_parser/event_types.py +246 -2
- sol_parser/grpc_client.py +8 -2
- sol_parser/grpc_instruction_parser.py +81 -9
- sol_parser/grpc_types.py +38 -1
- sol_parser/inner_instruction_parser.py +14 -0
- sol_parser/instructions.py +200 -31
- sol_parser/log_instr_dedup.py +65 -7
- sol_parser/merger.py +18 -0
- sol_parser/order_buffer.py +37 -12
- sol_parser/parser.py +22 -5
- sol_parser/pump_upgrade.py +194 -0
- sol_parser/rpc_parser.py +15 -2
- sol_parser/shredstream_client.py +4 -1
- sol_parser/simulation_route.py +18 -6
- sol_parser/transaction_route.py +10 -1
- sol_parser/wire_transaction.py +8 -14
- {sol_parser_sdk_python-0.5.9.dist-info → sol_parser_sdk_python-0.5.11.dist-info}/METADATA +31 -14
- {sol_parser_sdk_python-0.5.9.dist-info → sol_parser_sdk_python-0.5.11.dist-info}/RECORD +28 -27
- {sol_parser_sdk_python-0.5.9.dist-info → sol_parser_sdk_python-0.5.11.dist-info}/WHEEL +0 -0
- {sol_parser_sdk_python-0.5.9.dist-info → sol_parser_sdk_python-0.5.11.dist-info}/entry_points.txt +0 -0
sol_parser/dex_parsers.py
CHANGED
|
@@ -43,12 +43,20 @@ from .event_types import (
|
|
|
43
43
|
MeteoraDlmmClaimFeeEvent, MeteoraPoolsSetPoolFeesEvent, MeteoraPoolsSwapEvent,
|
|
44
44
|
MeteoraPoolsAddLiquidityEvent, MeteoraPoolsRemoveLiquidityEvent,
|
|
45
45
|
MeteoraPoolsBootstrapLiquidityEvent, MeteoraPoolsPoolCreatedEvent, MeteoraDammV2SwapEvent,
|
|
46
|
+
MeteoraDammV2ClaimPositionFeeEvent,
|
|
47
|
+
MeteoraDammV2ClaimRewardEvent,
|
|
48
|
+
MeteoraDlmmClaimRewardEvent,
|
|
46
49
|
MeteoraDammV2CreatePositionEvent, MeteoraDammV2ClosePositionEvent,
|
|
47
50
|
MeteoraDammV2AddLiquidityEvent, MeteoraDammV2RemoveLiquidityEvent,
|
|
48
51
|
MeteoraDammV2InitializePoolEvent,
|
|
49
52
|
MeteoraDammV2DynamicFeeParameters,
|
|
50
53
|
MeteoraDammV2UpdateDelegatePermissionEvent,
|
|
51
54
|
MeteoraDammV2WithdrawDeadLiquidityRewardEvent,
|
|
55
|
+
MeteoraDammV2WithdrawIneligibleRewardEvent,
|
|
56
|
+
MeteoraDammV2UpdateRewardFunderEvent,
|
|
57
|
+
MeteoraDammV2UpdateRewardDurationEvent,
|
|
58
|
+
MeteoraDammV2InitializeRewardEvent,
|
|
59
|
+
MeteoraDammV2FundRewardEvent,
|
|
52
60
|
MeteoraDammV2CreateConfigEvent,
|
|
53
61
|
MeteoraDammV2CreateDynamicConfigEvent,
|
|
54
62
|
MeteoraDbcCurveCompleteEvent, MeteoraDbcInitializePoolEvent, MeteoraDbcSwapEvent,
|
|
@@ -260,8 +268,10 @@ def parse_trade_from_data(data: bytes, meta: dict, is_created_buy: bool) -> DexE
|
|
|
260
268
|
real_quote_reserves = _optional_u64(data, tail)
|
|
261
269
|
holder_rewards_bps = _optional_u64(data, tail)
|
|
262
270
|
holder_rewards = _optional_u64(data, tail)
|
|
271
|
+
creator_fee_unclaimed=_optional_u64(data,tail)
|
|
263
272
|
|
|
264
273
|
event_data = PumpFunTradeEvent(
|
|
274
|
+
creator_fee_unclaimed=creator_fee_unclaimed,
|
|
265
275
|
metadata=_make_meta(meta),
|
|
266
276
|
mint=mint,
|
|
267
277
|
sol_amount=sol_amount,
|
|
@@ -324,6 +334,10 @@ def parse_create_from_data(data: bytes, meta: dict) -> DexEvent:
|
|
|
324
334
|
uri, o = _borsh_str(data, o)
|
|
325
335
|
except Exception:
|
|
326
336
|
return DexEvent()
|
|
337
|
+
if len(data) - o == 96:
|
|
338
|
+
return DexEvent(type=EventType.PUMP_FUN_CREATE, data=PumpFunCreateEvent(
|
|
339
|
+
metadata=_make_meta(meta), name=name, symbol=sym, uri=uri,
|
|
340
|
+
mint=_pub(data, o), bonding_curve=_pub(data, o + 32), user=_pub(data, o + 64)))
|
|
327
341
|
if len(data) < o + 32 * 4 + 8 * 5 + 32 + 1:
|
|
328
342
|
return DexEvent()
|
|
329
343
|
mint = _pub(data, o)
|
|
@@ -381,6 +395,7 @@ def parse_create_from_data(data: bytes, meta: dict) -> DexEvent:
|
|
|
381
395
|
virtual_quote_reserves=virtual_quote_reserves,
|
|
382
396
|
creator_fee_bps=creator_fee_bps,
|
|
383
397
|
is_holder_reward=is_holder_reward,
|
|
398
|
+
depth=data[o+1] if o+1<len(data) else 0,
|
|
384
399
|
),
|
|
385
400
|
)
|
|
386
401
|
|
|
@@ -1442,7 +1457,7 @@ def parse_amm_init2_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
|
1442
1457
|
|
|
1443
1458
|
|
|
1444
1459
|
def parse_cpmm_swap_event_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
1445
|
-
if len(data) <
|
|
1460
|
+
if len(data) < 81 or (81 < len(data) < 162) or data[80] > 1 or (len(data) >= 162 and data[161] > 1):
|
|
1446
1461
|
return None
|
|
1447
1462
|
o = 0
|
|
1448
1463
|
pool = _pub(data, o)
|
|
@@ -1463,6 +1478,11 @@ def parse_cpmm_swap_event_from_data(data: bytes, meta: dict) -> Optional[DexEven
|
|
|
1463
1478
|
return DexEvent(
|
|
1464
1479
|
type=EventType.RAYDIUM_CPMM_SWAP,
|
|
1465
1480
|
data=RaydiumCpmmSwapEvent(
|
|
1481
|
+
input_mint=_pub(data,81) if len(data)>=162 else "",
|
|
1482
|
+
output_mint=_pub(data,113) if len(data)>=162 else "",
|
|
1483
|
+
trade_fee=_u64le(data,145) if len(data)>=162 else 0,
|
|
1484
|
+
creator_fee=_u64le(data,153) if len(data)>=162 else 0,
|
|
1485
|
+
creator_fee_on_input=len(data)>=162 and bool(data[161]),
|
|
1466
1486
|
metadata=_make_meta(meta),
|
|
1467
1487
|
pool_id=pool,
|
|
1468
1488
|
input_vault_before=input_vault_before,
|
|
@@ -1888,6 +1908,8 @@ def parse_meteora_pools_set_pool_fees_from_data(data: bytes, meta: dict) -> Opti
|
|
|
1888
1908
|
DAMM_SWAP = _d(27, 60, 21, 213, 138, 170, 187, 147)
|
|
1889
1909
|
DAMM_SWAP2 = _d(189, 66, 51, 168, 38, 80, 117, 153)
|
|
1890
1910
|
DAMM_CREATE_POSITION = _d(156, 15, 119, 198, 29, 181, 221, 55)
|
|
1911
|
+
DAMM_CLAIM_POSITION_FEE = _d(198, 182, 183, 52, 97, 12, 49, 56)
|
|
1912
|
+
DAMM_CLAIM_REWARD = _d(218, 86, 147, 200, 235, 188, 215, 231)
|
|
1891
1913
|
DAMM_CLOSE_POSITION = _d(20, 145, 144, 68, 143, 142, 214, 178)
|
|
1892
1914
|
DAMM_ADD_LIQUIDITY = _d(175, 242, 8, 157, 30, 247, 185, 169)
|
|
1893
1915
|
DAMM_REMOVE_LIQUIDITY = _d(87, 46, 88, 98, 175, 96, 34, 91)
|
|
@@ -1895,10 +1917,17 @@ DAMM_LIQUIDITY_CHANGE = _d(197, 171, 78, 127, 224, 211, 87, 13)
|
|
|
1895
1917
|
DAMM_INIT_POOL = _d(228, 50, 246, 85, 203, 66, 134, 37)
|
|
1896
1918
|
DAMM_UPDATE_DELEGATE_PERMISSION = _d(66, 188, 75, 151, 150, 232, 87, 93)
|
|
1897
1919
|
DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD = _d(228, 66, 150, 195, 42, 62, 163, 13)
|
|
1920
|
+
DAMM_WITHDRAW_INELIGIBLE_REWARD = _d(248, 215, 184, 78, 31, 180, 179, 168)
|
|
1921
|
+
DAMM_UPDATE_REWARD_FUNDER = _d(76, 154, 208, 13, 40, 115, 246, 146)
|
|
1922
|
+
DAMM_UPDATE_REWARD_DURATION = _d(149, 135, 65, 231, 129, 153, 65, 57)
|
|
1923
|
+
DAMM_INITIALIZE_REWARD = _d(129, 91, 188, 3, 246, 52, 185, 249)
|
|
1924
|
+
DAMM_FUND_REWARD = _d(104, 233, 237, 122, 199, 191, 121, 85)
|
|
1898
1925
|
DAMM_CREATE_CONFIG = _d(131, 207, 180, 174, 180, 73, 165, 54)
|
|
1899
1926
|
DAMM_CREATE_DYNAMIC_CONFIG = _d(231, 197, 13, 164, 248, 213, 133, 152)
|
|
1900
1927
|
# Mainnet upgrade: trading_fee/partner_fee → claiming_fee/compounding_fee in EvtSwap2
|
|
1901
1928
|
COMPOUNDING_FEE_LAYOUT_ACTIVATION_SLOT = 406_048_752
|
|
1929
|
+
DBC_SWAP2 = _d(189, 66, 51, 168, 38, 80, 117, 153)
|
|
1930
|
+
DBC_SWAP2_TRANSFER_HOOK = _d(134, 59, 168, 120, 94, 51, 114, 231)
|
|
1902
1931
|
DBC_SWAP = DAMM_SWAP
|
|
1903
1932
|
DBC_INIT_POOL = DAMM_INIT_POOL
|
|
1904
1933
|
DBC_CURVE_COMPLETE = _d(229, 231, 86, 84, 156, 134, 75, 24)
|
|
@@ -1925,6 +1954,10 @@ def parse_meteora_damm_from_buf(buf: bytes, meta: dict) -> Optional[DexEvent]:
|
|
|
1925
1954
|
return _parse_damm_swap(data, meta)
|
|
1926
1955
|
if d == DAMM_SWAP2:
|
|
1927
1956
|
return _parse_damm_swap2(data, meta)
|
|
1957
|
+
if d == DAMM_CLAIM_POSITION_FEE:
|
|
1958
|
+
return _parse_damm_claim_position_fee(data, meta)
|
|
1959
|
+
if d == DAMM_CLAIM_REWARD:
|
|
1960
|
+
return _parse_damm_claim_reward(data, meta)
|
|
1928
1961
|
if d == DAMM_CREATE_POSITION:
|
|
1929
1962
|
return _parse_damm_create_position(data, meta)
|
|
1930
1963
|
if d == DAMM_CLOSE_POSITION:
|
|
@@ -1941,6 +1974,16 @@ def parse_meteora_damm_from_buf(buf: bytes, meta: dict) -> Optional[DexEvent]:
|
|
|
1941
1974
|
return _parse_damm_update_delegate_permission(data, meta)
|
|
1942
1975
|
if d == DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD:
|
|
1943
1976
|
return _parse_damm_withdraw_dead_liquidity_reward(data, meta)
|
|
1977
|
+
if d == DAMM_WITHDRAW_INELIGIBLE_REWARD:
|
|
1978
|
+
return _parse_damm_withdraw_ineligible_reward(data, meta)
|
|
1979
|
+
if d == DAMM_UPDATE_REWARD_FUNDER:
|
|
1980
|
+
return _parse_damm_update_reward_funder(data, meta)
|
|
1981
|
+
if d == DAMM_UPDATE_REWARD_DURATION:
|
|
1982
|
+
return _parse_damm_update_reward_duration(data, meta)
|
|
1983
|
+
if d == DAMM_INITIALIZE_REWARD:
|
|
1984
|
+
return _parse_damm_initialize_reward(data, meta)
|
|
1985
|
+
if d == DAMM_FUND_REWARD:
|
|
1986
|
+
return _parse_damm_fund_reward(data, meta)
|
|
1944
1987
|
if d == DAMM_CREATE_CONFIG:
|
|
1945
1988
|
return _parse_damm_create_config(data, meta)
|
|
1946
1989
|
if d == DAMM_CREATE_DYNAMIC_CONFIG:
|
|
@@ -1949,6 +1992,8 @@ def parse_meteora_damm_from_buf(buf: bytes, meta: dict) -> Optional[DexEvent]:
|
|
|
1949
1992
|
|
|
1950
1993
|
|
|
1951
1994
|
def parse_meteora_dbc_from_discriminator(disc: int, data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
1995
|
+
if disc in (DBC_SWAP2, DBC_SWAP2_TRANSFER_HOOK):
|
|
1996
|
+
return _parse_dbc_swap2(data, meta, disc == DBC_SWAP2_TRANSFER_HOOK)
|
|
1952
1997
|
if disc == DBC_SWAP:
|
|
1953
1998
|
return _parse_dbc_swap(data, meta)
|
|
1954
1999
|
if disc == DBC_INIT_POOL:
|
|
@@ -2595,6 +2640,90 @@ def _parse_damm_withdraw_dead_liquidity_reward(data: bytes, meta: dict) -> Optio
|
|
|
2595
2640
|
)
|
|
2596
2641
|
|
|
2597
2642
|
|
|
2643
|
+
def _parse_damm_withdraw_ineligible_reward(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
2644
|
+
if len(data) < 32 + 32 + 8:
|
|
2645
|
+
return None
|
|
2646
|
+
o = 0
|
|
2647
|
+
pool = _pub(data, o)
|
|
2648
|
+
o += 32
|
|
2649
|
+
reward_mint = _pub(data, o)
|
|
2650
|
+
o += 32
|
|
2651
|
+
amount = _u64le(data, o)
|
|
2652
|
+
return DexEvent(
|
|
2653
|
+
type=EventType.METEORA_DAMM_V2_WITHDRAW_INELIGIBLE_REWARD,
|
|
2654
|
+
data=MeteoraDammV2WithdrawIneligibleRewardEvent(
|
|
2655
|
+
metadata=_make_meta(meta),
|
|
2656
|
+
pool=pool,
|
|
2657
|
+
reward_mint=reward_mint,
|
|
2658
|
+
amount=amount,
|
|
2659
|
+
),
|
|
2660
|
+
)
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
def _parse_damm_update_reward_funder(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
2664
|
+
if len(data) < 97:
|
|
2665
|
+
return None
|
|
2666
|
+
return DexEvent(
|
|
2667
|
+
type=EventType.METEORA_DAMM_V2_UPDATE_REWARD_FUNDER,
|
|
2668
|
+
data=MeteoraDammV2UpdateRewardFunderEvent(
|
|
2669
|
+
metadata=_make_meta(meta),
|
|
2670
|
+
pool=_pub(data, 0),
|
|
2671
|
+
reward_index=data[32],
|
|
2672
|
+
old_funder=_pub(data, 33),
|
|
2673
|
+
new_funder=_pub(data, 65),
|
|
2674
|
+
),
|
|
2675
|
+
)
|
|
2676
|
+
|
|
2677
|
+
def _parse_damm_update_reward_duration(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
2678
|
+
if len(data) < 49:
|
|
2679
|
+
return None
|
|
2680
|
+
return DexEvent(
|
|
2681
|
+
type=EventType.METEORA_DAMM_V2_UPDATE_REWARD_DURATION,
|
|
2682
|
+
data=MeteoraDammV2UpdateRewardDurationEvent(
|
|
2683
|
+
metadata=_make_meta(meta),
|
|
2684
|
+
pool=_pub(data, 0),
|
|
2685
|
+
reward_index=data[32],
|
|
2686
|
+
old_reward_duration=_u64le(data, 33),
|
|
2687
|
+
new_reward_duration=_u64le(data, 41),
|
|
2688
|
+
),
|
|
2689
|
+
)
|
|
2690
|
+
|
|
2691
|
+
def _parse_damm_initialize_reward(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
2692
|
+
if len(data) < 137:
|
|
2693
|
+
return None
|
|
2694
|
+
return DexEvent(
|
|
2695
|
+
type=EventType.METEORA_DAMM_V2_INITIALIZE_REWARD,
|
|
2696
|
+
data=MeteoraDammV2InitializeRewardEvent(
|
|
2697
|
+
metadata=_make_meta(meta),
|
|
2698
|
+
pool=_pub(data, 0),
|
|
2699
|
+
reward_mint=_pub(data, 32),
|
|
2700
|
+
funder=_pub(data, 64),
|
|
2701
|
+
creator=_pub(data, 96),
|
|
2702
|
+
reward_index=data[128],
|
|
2703
|
+
reward_duration=_u64le(data, 129),
|
|
2704
|
+
),
|
|
2705
|
+
)
|
|
2706
|
+
|
|
2707
|
+
def _parse_damm_fund_reward(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
2708
|
+
if len(data) < 153:
|
|
2709
|
+
return None
|
|
2710
|
+
return DexEvent(
|
|
2711
|
+
type=EventType.METEORA_DAMM_V2_FUND_REWARD,
|
|
2712
|
+
data=MeteoraDammV2FundRewardEvent(
|
|
2713
|
+
metadata=_make_meta(meta),
|
|
2714
|
+
pool=_pub(data, 0),
|
|
2715
|
+
funder=_pub(data, 32),
|
|
2716
|
+
mint_reward=_pub(data, 64),
|
|
2717
|
+
reward_index=data[96],
|
|
2718
|
+
amount=_u64le(data, 97),
|
|
2719
|
+
transfer_fee_excluded_amount_in=_u64le(data, 105),
|
|
2720
|
+
reward_duration_end=_u64le(data, 113),
|
|
2721
|
+
pre_reward_rate=_u128le_int(data, 121),
|
|
2722
|
+
post_reward_rate=_u128le_int(data, 137),
|
|
2723
|
+
),
|
|
2724
|
+
)
|
|
2725
|
+
|
|
2726
|
+
|
|
2598
2727
|
def _parse_damm_create_config_dynamic_fee(
|
|
2599
2728
|
data: bytes, o: int
|
|
2600
2729
|
) -> Optional[tuple[MeteoraDammV2DynamicFeeParameters, int]]:
|
|
@@ -2802,6 +2931,7 @@ def _parse_pumpswap_trade_tail(data: bytes) -> Optional[Dict[str, Any]]:
|
|
|
2802
2931
|
"base_supply": 0,
|
|
2803
2932
|
"holder_rewards_bps": 0,
|
|
2804
2933
|
"holder_rewards": 0,
|
|
2934
|
+
"creator_fee_unclaimed":0,
|
|
2805
2935
|
}
|
|
2806
2936
|
if not data:
|
|
2807
2937
|
return tail
|
|
@@ -2832,6 +2962,9 @@ def _parse_pumpswap_trade_tail(data: bytes) -> Optional[Dict[str, Any]]:
|
|
|
2832
2962
|
if len(data) >= 73:
|
|
2833
2963
|
tail["holder_rewards_bps"] = _u64le(data, 57)
|
|
2834
2964
|
tail["holder_rewards"] = _u64le(data, 65)
|
|
2965
|
+
if 73<len(data)<81:
|
|
2966
|
+
return None
|
|
2967
|
+
tail["creator_fee_unclaimed"]=_u64le(data,73) if len(data)>=81 else 0
|
|
2835
2968
|
return tail
|
|
2836
2969
|
|
|
2837
2970
|
|
|
@@ -3061,7 +3194,7 @@ def parse_ps_create_pool_from_data(data: bytes, meta: dict) -> Optional[DexEvent
|
|
|
3061
3194
|
|
|
3062
3195
|
|
|
3063
3196
|
def parse_ps_add_liq_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
3064
|
-
if len(data) <
|
|
3197
|
+
if len(data) < 11 * 8 + 5 * 32:
|
|
3065
3198
|
return None
|
|
3066
3199
|
o = 0
|
|
3067
3200
|
|
|
@@ -3108,7 +3241,7 @@ def parse_ps_add_liq_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
|
3108
3241
|
|
|
3109
3242
|
|
|
3110
3243
|
def parse_ps_remove_liq_from_data(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
3111
|
-
if len(data) <
|
|
3244
|
+
if len(data) < 11 * 8 + 5 * 32:
|
|
3112
3245
|
return None
|
|
3113
3246
|
o = 0
|
|
3114
3247
|
|
|
@@ -3164,6 +3297,7 @@ DLMM_INIT_POOL = _d(185, 74, 252, 125, 27, 215, 188, 111)
|
|
|
3164
3297
|
DLMM_INIT_BIN = _d(11, 18, 155, 194, 33, 115, 238, 119)
|
|
3165
3298
|
DLMM_CREATE_POS = _d(144, 142, 252, 84, 157, 53, 37, 121)
|
|
3166
3299
|
DLMM_CLOSE_POS = _d(255, 196, 16, 107, 28, 202, 53, 128)
|
|
3300
|
+
DLMM_CLAIM_REWARD2 = _d(27, 143, 244, 33, 80, 43, 110, 146)
|
|
3167
3301
|
DLMM_CLAIM_FEE = _d(75, 122, 154, 48, 140, 74, 123, 163)
|
|
3168
3302
|
DLMM_CLAIM_FEE2 = _d(232, 171, 242, 97, 58, 77, 35, 45)
|
|
3169
3303
|
|
|
@@ -3230,6 +3364,8 @@ def parse_dlmm_event_from_data(d: int, data: bytes, meta: dict) -> Optional[DexE
|
|
|
3230
3364
|
if d == DLMM_SWAP2:
|
|
3231
3365
|
if len(data) < 32 + 32 + 4 + 4 + 1 + 16 + 8 + 8 + 8 + 8 + 8 + 8 + 8 + 1 + 1:
|
|
3232
3366
|
return None
|
|
3367
|
+
if any(data[x] > 1 for x in (72, 145, 146)):
|
|
3368
|
+
return None
|
|
3233
3369
|
o = 0
|
|
3234
3370
|
pool = _pub(data, o)
|
|
3235
3371
|
o += 32
|
|
@@ -3245,19 +3381,26 @@ def parse_dlmm_event_from_data(d: int, data: bytes, meta: dict) -> Optional[DexE
|
|
|
3245
3381
|
o += 16
|
|
3246
3382
|
ai = _u64le(data, o)
|
|
3247
3383
|
o += 8
|
|
3384
|
+
amount_left = _u64le(data, o)
|
|
3248
3385
|
o += 8
|
|
3249
3386
|
ao = _u64le(data, o)
|
|
3250
3387
|
o += 8
|
|
3251
|
-
|
|
3388
|
+
mm_fee = _u64le(data, o)
|
|
3252
3389
|
o += 8
|
|
3253
3390
|
pf = _u64le(data, o)
|
|
3254
3391
|
o += 8
|
|
3392
|
+
limit_order_fee = _u64le(data, o)
|
|
3255
3393
|
o += 8
|
|
3256
3394
|
hf = _u64le(data, o)
|
|
3395
|
+
fee = mm_fee + pf + limit_order_fee
|
|
3396
|
+
if fee > (1 << 64) - 1:
|
|
3397
|
+
return None
|
|
3257
3398
|
return DexEvent(
|
|
3258
3399
|
type=EventType.METEORA_DLMM_SWAP,
|
|
3259
3400
|
data=MeteoraDlmmSwapEvent(
|
|
3260
3401
|
metadata=_make_meta(meta),
|
|
3402
|
+
event_version=2, amount_left=amount_left, mm_fee=mm_fee, limit_order_fee=limit_order_fee,
|
|
3403
|
+
fees_on_input=bool(data[145]), fees_on_token_x=bool(data[146]),
|
|
3261
3404
|
pool=pool,
|
|
3262
3405
|
from_addr=frm,
|
|
3263
3406
|
start_bin_id=sb,
|
|
@@ -3457,6 +3600,11 @@ def parse_dlmm_event_from_data(d: int, data: bytes, meta: dict) -> Optional[DexE
|
|
|
3457
3600
|
owner=owner,
|
|
3458
3601
|
),
|
|
3459
3602
|
)
|
|
3603
|
+
if d == DLMM_CLAIM_REWARD2:
|
|
3604
|
+
if len(data) < 116:
|
|
3605
|
+
return None
|
|
3606
|
+
return DexEvent(type=EventType.METEORA_DLMM_CLAIM_REWARD,
|
|
3607
|
+
data=MeteoraDlmmClaimRewardEvent(metadata=_make_meta(meta),pool=_pub(data,0),position=_pub(data,32),owner=_pub(data,64),reward_index=_u64le(data,96),total_reward=_u64le(data,104),active_bin_id=int.from_bytes(data[112:116],"little",signed=True)))
|
|
3460
3608
|
if d in (DLMM_CLAIM_FEE, DLMM_LEGACY_CLAIM_FEE):
|
|
3461
3609
|
if len(data) < 32 + 32 + 32 + 8 + 8:
|
|
3462
3610
|
return None
|
|
@@ -3572,9 +3720,16 @@ _LOG_DISCRIMINATOR_EVENT_TYPES = {
|
|
|
3572
3720
|
DAMM_LIQUIDITY_CHANGE: EventType.METEORA_DAMM_V2_ADD_LIQUIDITY, # routed by change_type in parser
|
|
3573
3721
|
DAMM_INIT_POOL: EventType.METEORA_DAMM_V2_INITIALIZE_POOL,
|
|
3574
3722
|
DAMM_CREATE_POSITION: EventType.METEORA_DAMM_V2_CREATE_POSITION,
|
|
3723
|
+
DAMM_CLAIM_POSITION_FEE: EventType.METEORA_DAMM_V2_CLAIM_POSITION_FEE,
|
|
3724
|
+
DAMM_CLAIM_REWARD: EventType.METEORA_DAMM_V2_CLAIM_REWARD,
|
|
3575
3725
|
DAMM_CLOSE_POSITION: EventType.METEORA_DAMM_V2_CLOSE_POSITION,
|
|
3576
3726
|
DAMM_UPDATE_DELEGATE_PERMISSION: EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION,
|
|
3577
3727
|
DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD: EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD,
|
|
3728
|
+
DAMM_WITHDRAW_INELIGIBLE_REWARD: EventType.METEORA_DAMM_V2_WITHDRAW_INELIGIBLE_REWARD,
|
|
3729
|
+
DAMM_UPDATE_REWARD_FUNDER: EventType.METEORA_DAMM_V2_UPDATE_REWARD_FUNDER,
|
|
3730
|
+
DAMM_UPDATE_REWARD_DURATION: EventType.METEORA_DAMM_V2_UPDATE_REWARD_DURATION,
|
|
3731
|
+
DAMM_INITIALIZE_REWARD: EventType.METEORA_DAMM_V2_INITIALIZE_REWARD,
|
|
3732
|
+
DAMM_FUND_REWARD: EventType.METEORA_DAMM_V2_FUND_REWARD,
|
|
3578
3733
|
DAMM_CREATE_CONFIG: EventType.METEORA_DAMM_V2_CREATE_CONFIG,
|
|
3579
3734
|
DAMM_CREATE_DYNAMIC_CONFIG: EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG,
|
|
3580
3735
|
DISC_RAYDIUM_LAUNCHLAB_POOL_CREATE: EventType.RAYDIUM_LAUNCHLAB_POOL_CREATE,
|
|
@@ -3585,6 +3740,7 @@ _LOG_DISCRIMINATOR_EVENT_TYPES = {
|
|
|
3585
3740
|
DLMM_CREATE_POS: EventType.METEORA_DLMM_CREATE_POSITION,
|
|
3586
3741
|
DLMM_CLOSE_POS: EventType.METEORA_DLMM_CLOSE_POSITION,
|
|
3587
3742
|
DLMM_CLAIM_FEE: EventType.METEORA_DLMM_CLAIM_FEE,
|
|
3743
|
+
DLMM_CLAIM_REWARD2: EventType.METEORA_DLMM_CLAIM_REWARD,
|
|
3588
3744
|
}
|
|
3589
3745
|
|
|
3590
3746
|
|
|
@@ -3607,6 +3763,10 @@ METEORA_DLMM_PROGRAM_ID = "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo"
|
|
|
3607
3763
|
|
|
3608
3764
|
|
|
3609
3765
|
def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -> Optional[EventType]:
|
|
3766
|
+
from .pump_upgrade import pump_upgrade_event_type
|
|
3767
|
+
upgrade=pump_upgrade_event_type(disc,program_id)
|
|
3768
|
+
if upgrade is not None:
|
|
3769
|
+
return upgrade
|
|
3610
3770
|
if program_id == PUMPFUN_PROGRAM_ID:
|
|
3611
3771
|
if disc == PUMP_CREATE:
|
|
3612
3772
|
return EventType.PUMP_FUN_CREATE
|
|
@@ -3713,6 +3873,10 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
|
|
|
3713
3873
|
return EventType.METEORA_DAMM_V2_ADD_LIQUIDITY
|
|
3714
3874
|
if disc == DAMM_INIT_POOL:
|
|
3715
3875
|
return EventType.METEORA_DAMM_V2_INITIALIZE_POOL
|
|
3876
|
+
if disc == DAMM_CLAIM_POSITION_FEE:
|
|
3877
|
+
return EventType.METEORA_DAMM_V2_CLAIM_POSITION_FEE
|
|
3878
|
+
if disc == DAMM_CLAIM_REWARD:
|
|
3879
|
+
return EventType.METEORA_DAMM_V2_CLAIM_REWARD
|
|
3716
3880
|
if disc == DAMM_CREATE_POSITION:
|
|
3717
3881
|
return EventType.METEORA_DAMM_V2_CREATE_POSITION
|
|
3718
3882
|
if disc == DAMM_CLOSE_POSITION:
|
|
@@ -3721,13 +3885,23 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
|
|
|
3721
3885
|
return EventType.METEORA_DAMM_V2_UPDATE_DELEGATE_PERMISSION
|
|
3722
3886
|
if disc == DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD:
|
|
3723
3887
|
return EventType.METEORA_DAMM_V2_WITHDRAW_DEAD_LIQUIDITY_REWARD
|
|
3888
|
+
if disc == DAMM_WITHDRAW_INELIGIBLE_REWARD:
|
|
3889
|
+
return EventType.METEORA_DAMM_V2_WITHDRAW_INELIGIBLE_REWARD
|
|
3890
|
+
if disc == DAMM_UPDATE_REWARD_FUNDER:
|
|
3891
|
+
return EventType.METEORA_DAMM_V2_UPDATE_REWARD_FUNDER
|
|
3892
|
+
if disc == DAMM_UPDATE_REWARD_DURATION:
|
|
3893
|
+
return EventType.METEORA_DAMM_V2_UPDATE_REWARD_DURATION
|
|
3894
|
+
if disc == DAMM_INITIALIZE_REWARD:
|
|
3895
|
+
return EventType.METEORA_DAMM_V2_INITIALIZE_REWARD
|
|
3896
|
+
if disc == DAMM_FUND_REWARD:
|
|
3897
|
+
return EventType.METEORA_DAMM_V2_FUND_REWARD
|
|
3724
3898
|
if disc == DAMM_CREATE_CONFIG:
|
|
3725
3899
|
return EventType.METEORA_DAMM_V2_CREATE_CONFIG
|
|
3726
3900
|
if disc == DAMM_CREATE_DYNAMIC_CONFIG:
|
|
3727
3901
|
return EventType.METEORA_DAMM_V2_CREATE_DYNAMIC_CONFIG
|
|
3728
3902
|
return None
|
|
3729
3903
|
if program_id == METEORA_DBC_PROGRAM_ID:
|
|
3730
|
-
if disc
|
|
3904
|
+
if disc in (DBC_SWAP, DBC_SWAP2, DBC_SWAP2_TRANSFER_HOOK):
|
|
3731
3905
|
return EventType.METEORA_DBC_SWAP
|
|
3732
3906
|
if disc == DBC_INIT_POOL:
|
|
3733
3907
|
return EventType.METEORA_DBC_INITIALIZE_POOL
|
|
@@ -3749,6 +3923,8 @@ def event_type_for_program_discriminator(program_id: Optional[str], disc: int) -
|
|
|
3749
3923
|
return EventType.METEORA_DLMM_CREATE_POSITION
|
|
3750
3924
|
if disc in (DLMM_CLOSE_POS, DLMM_LEGACY_CLOSE_POS):
|
|
3751
3925
|
return EventType.METEORA_DLMM_CLOSE_POSITION
|
|
3926
|
+
if disc == DLMM_CLAIM_REWARD2:
|
|
3927
|
+
return EventType.METEORA_DLMM_CLAIM_REWARD
|
|
3752
3928
|
if disc in (DLMM_CLAIM_FEE, DLMM_CLAIM_FEE2, DLMM_LEGACY_CLAIM_FEE):
|
|
3753
3929
|
return EventType.METEORA_DLMM_CLAIM_FEE
|
|
3754
3930
|
return None
|
|
@@ -3986,6 +4162,9 @@ def dispatch_program_data(
|
|
|
3986
4162
|
program_id: Optional[str] = None,
|
|
3987
4163
|
event_type_filter: Any = None,
|
|
3988
4164
|
) -> Optional[DexEvent]:
|
|
4165
|
+
from .pump_upgrade import pump_upgrade_event_type,parse_pump_upgrade_event
|
|
4166
|
+
if pump_upgrade_event_type(disc,program_id) is not None:
|
|
4167
|
+
return apply_event_type_filter(parse_pump_upgrade_event(disc,data,_make_meta(meta),program_id),event_type_filter)
|
|
3989
4168
|
if program_id == PUMPFUN_PROGRAM_ID:
|
|
3990
4169
|
return dispatch_scoped_pumpfun_data(disc, data, meta, is_created_buy, event_type_filter)
|
|
3991
4170
|
if program_id == PUMP_FEES_PROGRAM_ID:
|
|
@@ -4203,9 +4382,16 @@ def dispatch_program_data(
|
|
|
4203
4382
|
DAMM_LIQUIDITY_CHANGE,
|
|
4204
4383
|
DAMM_INIT_POOL,
|
|
4205
4384
|
DAMM_CREATE_POSITION,
|
|
4385
|
+
DAMM_CLAIM_POSITION_FEE,
|
|
4386
|
+
DAMM_CLAIM_REWARD,
|
|
4206
4387
|
DAMM_CLOSE_POSITION,
|
|
4207
4388
|
DAMM_UPDATE_DELEGATE_PERMISSION,
|
|
4208
4389
|
DAMM_WITHDRAW_DEAD_LIQUIDITY_REWARD,
|
|
4390
|
+
DAMM_WITHDRAW_INELIGIBLE_REWARD,
|
|
4391
|
+
DAMM_UPDATE_REWARD_FUNDER,
|
|
4392
|
+
DAMM_UPDATE_REWARD_DURATION,
|
|
4393
|
+
DAMM_INITIALIZE_REWARD,
|
|
4394
|
+
DAMM_FUND_REWARD,
|
|
4209
4395
|
DAMM_CREATE_CONFIG,
|
|
4210
4396
|
DAMM_CREATE_DYNAMIC_CONFIG,
|
|
4211
4397
|
):
|
|
@@ -4214,3 +4400,54 @@ def dispatch_program_data(
|
|
|
4214
4400
|
if raydium_launchlab:
|
|
4215
4401
|
return raydium_launchlab
|
|
4216
4402
|
return parse_dlmm_from_program_data(buf, meta)
|
|
4403
|
+
|
|
4404
|
+
|
|
4405
|
+
def _parse_dbc_swap2(data: bytes, meta: dict, has_transfer_hook: bool) -> Optional[DexEvent]:
|
|
4406
|
+
if len(data) < 179 or data[82] > 2 or data[64] > 1 or data[65] > 1:
|
|
4407
|
+
return None
|
|
4408
|
+
mode = data[82]
|
|
4409
|
+
amount_0, amount_1 = _u64le(data,66), _u64le(data,74)
|
|
4410
|
+
included = _u64le(data,83)
|
|
4411
|
+
return DexEvent(EventType.METEORA_DBC_SWAP, MeteoraDbcSwapEvent(
|
|
4412
|
+
metadata=_make_meta(meta), pool=_pub(data,0), config=_pub(data,32),
|
|
4413
|
+
trade_direction=data[64], has_referral=bool(data[65]), event_version=2,
|
|
4414
|
+
swap_mode=mode, amount_0=amount_0, amount_1=amount_1, has_transfer_hook=has_transfer_hook,
|
|
4415
|
+
amount_in=included, minimum_amount_out=0 if mode == 2 else amount_1,
|
|
4416
|
+
maximum_amount_in=amount_1 if mode == 2 else 0,
|
|
4417
|
+
included_fee_input_amount=included, actual_input_amount=_u64le(data,91),
|
|
4418
|
+
amount_left=_u64le(data,99), output_amount=_u64le(data,107), next_sqrt_price=_u128le_int(data,115),
|
|
4419
|
+
trading_fee=_u64le(data,131), protocol_fee=_u64le(data,139), referral_fee=_u64le(data,147),
|
|
4420
|
+
quote_reserve_amount=_u64le(data,155), migration_threshold=_u64le(data,163), current_timestamp=_u64le(data,171)))
|
|
4421
|
+
|
|
4422
|
+
|
|
4423
|
+
def _parse_damm_claim_position_fee(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
4424
|
+
if len(data) < 112:
|
|
4425
|
+
return None
|
|
4426
|
+
return DexEvent(
|
|
4427
|
+
type=EventType.METEORA_DAMM_V2_CLAIM_POSITION_FEE,
|
|
4428
|
+
data=MeteoraDammV2ClaimPositionFeeEvent(
|
|
4429
|
+
metadata=_make_meta(meta),
|
|
4430
|
+
pool=_pub(data, 0),
|
|
4431
|
+
position=_pub(data, 32),
|
|
4432
|
+
owner=_pub(data, 64),
|
|
4433
|
+
fee_a_claimed=int.from_bytes(data[96:104], "little"),
|
|
4434
|
+
fee_b_claimed=int.from_bytes(data[104:112], "little"),
|
|
4435
|
+
),
|
|
4436
|
+
)
|
|
4437
|
+
|
|
4438
|
+
|
|
4439
|
+
def _parse_damm_claim_reward(data: bytes, meta: dict) -> Optional[DexEvent]:
|
|
4440
|
+
if len(data) < 137:
|
|
4441
|
+
return None
|
|
4442
|
+
return DexEvent(
|
|
4443
|
+
type=EventType.METEORA_DAMM_V2_CLAIM_REWARD,
|
|
4444
|
+
data=MeteoraDammV2ClaimRewardEvent(
|
|
4445
|
+
metadata=_make_meta(meta),
|
|
4446
|
+
pool=_pub(data, 0),
|
|
4447
|
+
position=_pub(data, 32),
|
|
4448
|
+
owner=_pub(data, 64),
|
|
4449
|
+
mint_reward=_pub(data, 96),
|
|
4450
|
+
reward_index=data[128],
|
|
4451
|
+
total_reward=int.from_bytes(data[129:137], "little"),
|
|
4452
|
+
),
|
|
4453
|
+
)
|
sol_parser/event_type_parity.py
CHANGED
|
@@ -74,9 +74,17 @@ RUST_EVENT_TYPES = [
|
|
|
74
74
|
"MeteoraDammV2RemoveLiquidity",
|
|
75
75
|
"MeteoraDammV2InitializePool",
|
|
76
76
|
"MeteoraDammV2CreatePosition",
|
|
77
|
+
"MeteoraDammV2ClaimPositionFee",
|
|
78
|
+
"MeteoraDammV2ClaimReward",
|
|
79
|
+
"MeteoraDlmmClaimReward",
|
|
77
80
|
"MeteoraDammV2ClosePosition",
|
|
78
81
|
"MeteoraDammV2UpdateDelegatePermission",
|
|
79
82
|
"MeteoraDammV2WithdrawDeadLiquidityReward",
|
|
83
|
+
"MeteoraDammV2WithdrawIneligibleReward",
|
|
84
|
+
"MeteoraDammV2UpdateRewardFunder",
|
|
85
|
+
"MeteoraDammV2UpdateRewardDuration",
|
|
86
|
+
"MeteoraDammV2InitializeReward",
|
|
87
|
+
"MeteoraDammV2FundReward",
|
|
80
88
|
"MeteoraDammV2CreateConfig",
|
|
81
89
|
"MeteoraDammV2CreateDynamicConfig",
|
|
82
90
|
"MeteoraDbcSwap",
|