sol-parser-sdk-python 0.5.13__py3-none-any.whl → 0.5.15__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 CHANGED
@@ -513,6 +513,8 @@ from .pump_upgrade import PumpFunPostCompleteBuyEvent, PumpFunSweepBondingCurveF
513
513
  __all__ += ['decode_pump_multi_hop_intent','PumpFunPostCompleteBuyEvent','PumpFunSweepBondingCurveFeeEvent','PumpFunCompleteEvent','PumpSwapSweepPoolFeeEvent']
514
514
 
515
515
  from .pump_routes import PumpRouteHop, PumpRouteIntentEvent
516
+ from .raw_instruction import RawInstructionEvent
517
+ __all__ += ["RawInstructionEvent"]
516
518
  from .shredstream_client import parse_shred_transaction, parse_shred_transaction_with_loaded_addresses, parse_shred_transaction_best_effort
517
519
 
518
520
  __all__ += ["PumpRouteHop", "PumpRouteIntentEvent", "parse_shred_transaction", "parse_shred_transaction_with_loaded_addresses", "parse_shred_transaction_best_effort"]
@@ -120,6 +120,7 @@ RUST_EVENT_TYPES = [
120
120
  "AccountOrcaFeeTier",
121
121
  "AccountOrcaWhirlpoolsConfig",
122
122
  "PumpRouteIntent",
123
+ "RawInstruction",
123
124
  ]
124
125
 
125
126
 
sol_parser/event_types.py CHANGED
@@ -1816,12 +1816,18 @@ def to_typed_event(event: dict) -> Optional[TypedDexEvent]:
1816
1816
  values={name:(_get_str(data,name) if typ=='pubkey' else _get_int(data,name)) for name,typ in fields}
1817
1817
  return cls(metadata=meta,**values)
1818
1818
 
1819
+ if event_type == EventType.RAW_INSTRUCTION:
1820
+ from .raw_instruction import RawInstructionEvent
1821
+ return RawInstructionEvent(metadata=meta, program_id=data['program_id'],
1822
+ instruction_index=int(data['instruction_index']), accounts=list(data['accounts']),
1823
+ account_indices=list(data['account_indices']), instruction_data=list(data['instruction_data']))
1819
1824
  if event_type == EventType.PUMP_ROUTE_INTENT:
1820
1825
  from .pump_routes import PumpRouteHop, PumpRouteIntentEvent
1821
1826
  return PumpRouteIntentEvent(metadata=meta,kind=data['kind'],program=data['program'],
1822
1827
  instruction_index=int(data['instruction_index']),user=data['user'],input_account=data['input_account'],output_account=data['output_account'],
1823
1828
  amount_in=None if data.get('amount_in') is None else int(data['amount_in']),min_amount_out=None if data.get('min_amount_out') is None else int(data['min_amount_out']),
1824
- hops=[PumpRouteHop(**h) for h in data['hops']],instruction_data=list(data['instruction_data']))
1829
+ hops=[PumpRouteHop(**h) for h in data['hops']],instruction_data=list(data['instruction_data']),
1830
+ is_buy=data.get('is_buy'),ix_name=data.get('ix_name'))
1825
1831
 
1826
1832
  # PumpFun events
1827
1833
  if event_type in (EventType.PUMP_FUN_TRADE, EventType.PUMP_FUN_BUY,
@@ -19,6 +19,7 @@ from .grpc_types import (
19
19
  event_type_filter_allows_instruction_parsing,
20
20
  )
21
21
  from .inner_instruction_parser import parse_inner_instruction
22
+ from .instructions import clear_pump_instruction_execution_amounts
22
23
  from .instructions import (METEORA_DLMM_PROGRAM_ID, PUMPFUN_PROGRAM_ID, PUMPSWAP_PROGRAM_ID,
23
24
  parse_inner_compiled_instruction_if_supported, parse_instruction_unified)
24
25
  from .merger import try_merge_dex_events
@@ -395,6 +396,7 @@ def parse_instructions_enhanced_from_parsed(
395
396
  ev = parse_instruction_unified(
396
397
  data, accounts, signature, slot, tx_index, block_time_us, grpc_us, filter, pid
397
398
  )
399
+ ev = clear_pump_instruction_execution_amounts(ev)
398
400
  if ev:
399
401
  result.append((i, None, 1, False, ev))
400
402
 
@@ -404,7 +406,7 @@ def parse_instructions_enhanced_from_parsed(
404
406
  pid = get_key_b58(inner_ix.program_id_index)
405
407
  data = bytes(inner_ix.data)
406
408
  accounts = [get_key_b58(b) for b in bytes(inner_ix.accounts)]
407
- ev = parse_inner_compiled_instruction_if_supported(
409
+ ev = clear_pump_instruction_execution_amounts(parse_inner_compiled_instruction_if_supported(
408
410
  data,
409
411
  accounts,
410
412
  signature,
@@ -414,7 +416,7 @@ def parse_instructions_enhanced_from_parsed(
414
416
  grpc_us,
415
417
  filter,
416
418
  pid,
417
- ) or parse_inner_instruction(
419
+ )) or parse_inner_instruction(
418
420
  data,
419
421
  pid,
420
422
  _meta_dict(signature, slot, tx_index, block_time_us, grpc_us, recent_bh),
sol_parser/grpc_types.py CHANGED
@@ -48,6 +48,7 @@ class EventType(str, Enum):
48
48
  RAYDIUM_LAUNCHLAB_POOL_CREATE = "RaydiumLaunchlabPoolCreate"
49
49
  RAYDIUM_LAUNCHLAB_MIGRATE_AMM = "RaydiumLaunchlabMigrateAmm"
50
50
  PUMP_ROUTE_INTENT = "PumpRouteIntent"
51
+ RAW_INSTRUCTION = "RawInstruction"
51
52
  # PumpFun
52
53
  PUMP_FUN_TRADE = "PumpFunTrade"
53
54
  PUMP_FUN_BUY = "PumpFunBuy"
@@ -313,7 +314,7 @@ RAYDIUM_LAUNCHLAB_FILTER_TYPES = (
313
314
  EventType.RAYDIUM_LAUNCHLAB_MIGRATE_AMM,
314
315
  )
315
316
  INSTRUCTION_EVENT_TYPES = (
316
- EventType.PUMP_ROUTE_INTENT,
317
+ EventType.PUMP_ROUTE_INTENT, EventType.RAW_INSTRUCTION,
317
318
  *PUMPFUN_FILTER_TYPES,
318
319
  *PUMP_FEES_EVENT_TYPES,
319
320
  *PUMPSWAP_FILTER_TYPES,
@@ -460,7 +461,7 @@ def all_event_types() -> List[EventType]:
460
461
  EventType.ACCOUNT_ORCA_TICK_ARRAY,
461
462
  EventType.ACCOUNT_ORCA_FEE_TIER,
462
463
  EventType.ACCOUNT_ORCA_WHIRLPOOLS_CONFIG,
463
- EventType.PUMP_ROUTE_INTENT,
464
+ EventType.PUMP_ROUTE_INTENT, EventType.RAW_INSTRUCTION,
464
465
  ]
465
466
 
466
467
 
@@ -280,13 +280,13 @@ def parse_inner_instruction(
280
280
  if program_id_b58 == PUMPFUN_PROGRAM_ID:
281
281
  if filter is not None and not event_type_filter_includes_pumpfun(filter):
282
282
  return None
283
- if disc16 == _PUMPFUN_INNER_TRADE:
283
+ if disc16 == _PUMPFUN_INNER_TRADE or (disc16[:8] == _EVENT_CPI_PREFIX and disc16[8:] == _PUMPFUN_INNER_TRADE[:8]):
284
284
  ev = parse_trade_from_data(inner, meta_d, is_created_buy)
285
285
  return emit(ev if ev.is_valid() else None)
286
- if disc16 == _PUMPFUN_INNER_CREATE:
286
+ if disc16 == _PUMPFUN_INNER_CREATE or (disc16[:8] == _EVENT_CPI_PREFIX and disc16[8:] == _PUMPFUN_INNER_CREATE[:8]):
287
287
  ev = parse_create_from_data(inner, meta_d)
288
288
  return emit(ev if ev.is_valid() else None)
289
- if disc16 == _PUMPFUN_INNER_MIGRATE:
289
+ if disc16 == _PUMPFUN_INNER_MIGRATE or (disc16[:8] == _EVENT_CPI_PREFIX and disc16[8:] == _PUMPFUN_INNER_MIGRATE[:8]):
290
290
  ev = parse_migrate_from_data(inner, meta_d)
291
291
  return emit(ev if ev.is_valid() else None)
292
292
  return None
@@ -76,6 +76,15 @@ PUMPSWAP_FEES_PROGRAM_ID = "pfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ"
76
76
  PUMP_FEES_PROGRAM_ID = PUMPSWAP_FEES_PROGRAM_ID
77
77
 
78
78
 
79
+ def clear_pump_instruction_execution_amounts(event: Optional[DexEvent]) -> Optional[DexEvent]:
80
+ """RPC/gRPC compiled arguments are limits, not observed execution amounts."""
81
+ if event is not None and isinstance(event.data, PumpFunTradeEvent):
82
+ event.data.sol_amount = 0
83
+ event.data.token_amount = 0
84
+ event.data.quote_amount = 0
85
+ return event
86
+
87
+
79
88
  def _d(*xs: int) -> int:
80
89
  return struct.unpack("<Q", bytes(xs))[0]
81
90
 
sol_parser/pump_routes.py CHANGED
@@ -38,6 +38,10 @@ class PumpRouteIntentEvent(DexEventBase):
38
38
  min_amount_out: Optional[int] = None
39
39
  hops: list[PumpRouteHop] = field(default_factory=list)
40
40
  instruction_data: list[int] = field(default_factory=list)
41
+ # Intended direction relative to the wrapper hop's base mint, not a fill.
42
+ is_buy: Optional[bool] = None
43
+ # Official underlying instruction name encoded in the wrapper; unknown is None.
44
+ ix_name: Optional[str] = None
41
45
 
42
46
 
43
47
  def allows_route(filter, program):
@@ -86,4 +90,7 @@ def parse_route(program,data,a,metadata,index,filter=None):
86
90
  kind,fixed,user,source,dest,amount,minimum='BuyPumpDelta',0,0,16,15,None,None
87
91
  if amount==0:return None
88
92
  hops=[PumpRouteHop(*a[i:i+5]) for i in range(fixed,len(a),5)] if fixed else [PumpRouteHop(*(a[i] for i in ((7,2,16,17,18) if program==RAPID else (2,3,11,12,13))))]
89
- return DexEvent(EventType.PUMP_ROUTE_INTENT,PumpRouteIntentEvent(metadata,kind,program,index,a[user],a[source],a[dest],amount,minimum,hops,list(data)))
93
+ return DexEvent(EventType.PUMP_ROUTE_INTENT,PumpRouteIntentEvent(
94
+ metadata,kind,program,index,a[user],a[source],a[dest],amount,minimum,hops,list(data),
95
+ is_buy=True if kind in ('RapidBuy', 'BuyPumpDelta') else None,
96
+ ix_name='buy_exact_quote_in_v2' if kind == 'RapidBuy' else None))
@@ -0,0 +1,15 @@
1
+ """Lossless outer instructions, without inferred CPI or trade semantics."""
2
+ from dataclasses import dataclass, field
3
+ from typing import Optional
4
+ from .event_types import DexEventBase
5
+
6
+ INFRASTRUCTURE_PROGRAMS = frozenset(["11111111111111111111111111111111","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb","ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","ComputeBudget111111111111111111111111111111","MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr","Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo","AddressLookupTab1e1111111111111111111111111","Vote111111111111111111111111111111111111111","Ed25519SigVerify111111111111111111111111111","KeccakSecp256k11111111111111111111111111111","Secp256r1SigVerify1111111111111111111111111"])
7
+
8
+ @dataclass
9
+ class RawInstructionEvent(DexEventBase):
10
+ program_id: str = ''
11
+ instruction_index: int = 0
12
+ # Original order including duplicates. None denotes an unresolved ALT key.
13
+ accounts: list[Optional[str]] = field(default_factory=list)
14
+ account_indices: list[int] = field(default_factory=list)
15
+ instruction_data: list[int] = field(default_factory=list)
sol_parser/rpc_parser.py CHANGED
@@ -11,6 +11,7 @@ import base58
11
11
  from .dex_parsers import DexEvent
12
12
  from .grpc_types import EventTypeFilter, EventType, event_type_filter_allows_instruction_parsing
13
13
  from .inner_instruction_parser import parse_inner_instruction
14
+ from .instructions import clear_pump_instruction_execution_amounts
14
15
  from .instructions import (
15
16
  METEORA_DLMM_PROGRAM_ID,
16
17
  PUMPFUN_PROGRAM_ID,
@@ -386,7 +387,7 @@ def _parse_rpc_instruction(
386
387
  program_id,
387
388
  )
388
389
  if ev:
389
- return ev
390
+ return clear_pump_instruction_execution_amounts(ev)
390
391
  return parse_inner_instruction(
391
392
  data,
392
393
  program_id,
@@ -402,9 +403,9 @@ def _parse_rpc_instruction(
402
403
  is_created_buy,
403
404
  )
404
405
 
405
- return parse_instruction_unified(
406
+ return clear_pump_instruction_execution_amounts(parse_instruction_unified(
406
407
  data, accounts, signature, slot, tx_index, block_time_us, grpc_recv_us, filter, program_id
407
- )
408
+ ))
408
409
 
409
410
 
410
411
  def convert_rpc_to_grpc(
@@ -133,6 +133,8 @@ def _should_parse_shred_instructions(filter: Optional[EventTypeFilter]) -> bool:
133
133
 
134
134
 
135
135
  def _parse_decoded_shred(tx, keys, signature, slot, tx_index, recv_us, filter, best_effort=False):
136
+ from .raw_instruction import RawInstructionEvent, INFRASTRUCTURE_PROGRAMS
137
+ from .grpc_types import EventType
136
138
  from .pump_routes import may_parse_route, parse_route
137
139
  from .grpc_types import EventMetadata
138
140
  if not _should_parse_shred_instructions(filter):
@@ -150,6 +152,16 @@ def _parse_decoded_shred(tx, keys, signature, slot, tx_index, recv_us, filter, b
150
152
  mayhem |= m
151
153
  out = []
152
154
  for index, (pid, data, indices) in enumerate(instructions):
155
+ unknown = pid and pid not in _UNKNOWN_PROGRAM_CANDIDATES and pid not in INFRASTRUCTURE_PROGRAMS
156
+ explicit_raw = filter is not None and EventType.RAW_INSTRUCTION in (getattr(filter, 'include_only', None) or ())
157
+ if pid and (unknown or explicit_raw) and (filter is None or filter.should_include(EventType.RAW_INSTRUCTION)):
158
+ out.append(DexEvent(EventType.RAW_INSTRUCTION, RawInstructionEvent(
159
+ metadata=EventMetadata(signature=signature, slot=slot, tx_index=tx_index, grpc_recv_us=recv_us, recent_blockhash=msg['recentBlockhash']),
160
+ program_id=pid, instruction_index=index,
161
+ accounts=[keys[i] if i < len(keys) else None for i in indices],
162
+ account_indices=list(indices), instruction_data=list(data))))
163
+ if unknown:
164
+ continue
153
165
  resolved = pid is not None and all(i < len(keys) for i in indices)
154
166
  if not resolved and not best_effort:
155
167
  continue
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: sol-parser-sdk-python
3
- Version: 0.5.13
3
+ Version: 0.5.15
4
4
  Summary: Solana DEX program log parsing (pure Python, API aligned with sol-parser-sdk)
5
5
  Requires-Python: >=3.10
6
6
  Requires-Dist: base58>=2.0
@@ -21,6 +21,25 @@ Requires-Dist: solders==0.26.0; extra == 'simulation'
21
21
  Description-Content-Type: text/markdown
22
22
 
23
23
  <div align="center">
24
+
25
+ ## v0.5.15 — Pump execution replay
26
+
27
+ Current Anchor TradeEvent CPI decoding is supported alongside the historical encoding. RPC/gRPC instruction budgets and minimum outputs remain in instruction fields. Execution fields `sol_amount`, `quote_amount`, and `token_amount` come from execution events; without logs or event CPIs they remain zero (unavailable, not a proven zero fill).
28
+
29
+ Run `.venv/bin/python examples/pump_execution_replay.py` from this repository to replay real transactions fetched on 2026-10-19 offline. The example prints full/no-log/truncated-log results. Append a recent signature for online replay. Set `SOLANA_RPC_URL` for your RPC; transaction v1 is supported.
30
+
31
+ The current Delta sell signature is `4ARos3Yq1SMNE3izDpy9YdKrRgMmD7UCDxvnVrBRaGCJHiifPHSmQWc4DPfjUaEUcxS7puGmEN64K7EZdeXLJaj2` (slot 458542546). The dated fixture also includes Rapid create/buy, BuyV3, and PumpSwap buy with their full signatures and slots. Older five-combination multi-hop fixtures are retained as regression tests, not labeled as new mainnet captures.
32
+
33
+ ## v0.5.15 — raw Shred instructions
34
+
35
+ Default Shred parsing emits `RawInstruction` for unsupported third-party programs, including Rapid/Delta, without inferring direction, amounts, or internal buy methods. Infrastructure programs (System, Token, ATA, ComputeBudget, etc.) are omitted by default. Supported official DEX parsers are unchanged; official Pump/PumpSwap multi-hop instructions retain `PumpRouteIntent`.
36
+
37
+ The payload contains `program_id`, `instruction_index`, `accounts`, `account_indices`, `instruction_data`, and transaction metadata. Account order and duplicates are preserved. Unresolved ALT addresses are null/None, with original indices retained; supply cached loaded addresses or a resolver. No hot-path RPC is performed. Data is copied verbatim without requiring a known layout.
38
+
39
+ No filter returns unknown third-party instructions. Explicitly including `RawInstruction` returns every outer instruction, including infrastructure. A `PumpFunTrade`-only filter does not include raw events: subscribe to both types when needed. Streamer forwards `DexEvent::RawInstructionEvent` as Common. A Pump address in accounts does not prove a CPI or a particular buy method. Event count is not fill count.
40
+
41
+ Wrapper adapter functions remain explicit compatibility helpers only; default Shred parsing does not call them. The released-version history below describes previous behavior.
42
+
24
43
  <h1>⚡ Sol Parser SDK - Python</h1>
25
44
  <h3><em>High-performance Solana DEX event parser for Python</em></h3>
26
45
  </div>
@@ -60,15 +79,21 @@ Parser SDK language versions and related Rust SDKs:
60
79
 
61
80
  | Language | Repository | Description | Version |
62
81
  |----------|------------|-------------|---------|
63
- | Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.14` |
64
- | Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.20` |
65
- | Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.13` |
66
- | Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.13` |
67
- | **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.5` |
82
+ | Rust | [sol-parser-sdk](https://github.com/0xfnzero/sol-parser-sdk) | Solana DEX transaction and account event parsing | `v0.7.16` |
83
+ | Node.js | [sol-parser-sdk-nodejs](https://github.com/0xfnzero/sol-parser-sdk-nodejs) | TypeScript/JavaScript for Node.js | `v0.5.22` |
84
+ | Python | [sol-parser-sdk-python](https://github.com/0xfnzero/sol-parser-sdk-python) | Async/await native support | `v0.5.15` |
85
+ | Go | [sol-parser-sdk-golang](https://github.com/0xfnzero/sol-parser-sdk-golang) | Go transaction and account event parsing | `v0.5.15` |
86
+ | **Rust** | [sol-shred-sdk](https://github.com/0xfnzero/sol-shred-sdk) | Raw Solana shred decoding and ShredStream DEX event parsing | `v4.0.7` |
68
87
  | **Rust** | [sol-trade-sdk](https://github.com/0xfnzero/sol-trade-sdk) | Solana DEX trade construction and transaction execution | `v6.0.2` |
69
88
 
70
89
  ---
71
90
 
91
+ ## v0.5.14 — Pump route direction and instruction names
92
+
93
+ Route intents now expose `is_buy` and `ix_name`, following existing trade field names and official IDL instruction names. RapidBuy reports a buy intent and `buy_exact_quote_in_v2`; BuyPumpDelta reports only a buy intent. Multi-hop direction and unknown methods remain null. Read currencies from `hops[].base_mint` / `quote_mint`. These hints do not confirm execution, and filters do not convert intents into trades.
94
+
95
+ Older JSON without the fields remains readable as unknown. Rust struct literals must supply the new fields; Go uses pointers and Node.js/Python use null/None for unknown values. Streamer now forwards `DexEvent::PumpRouteIntentEvent` with protocol and event filtering.
96
+
72
97
  ## v0.5.13 — Pump routes and offline replay
73
98
 
74
99
  Adds native Pump route-intent parsing for official multi-hop instructions and the exact RapidBuy/BuyPumpDelta wrapper layouts captured in reported transactions. Adds locally cached ALT resolution and rejects unresolved account identities by default, with explicit best-effort compatibility APIs where supported. Route intents expose instruction constraints and hop identities; confirmed execution amounts require execution metadata.
@@ -150,7 +175,7 @@ This is the Python implementation of the FnZero Solana DEX parser SDK for asynci
150
175
  **From PyPI**
151
176
 
152
177
  ```bash
153
- pip install sol-parser-sdk-python==0.5.13
178
+ pip install sol-parser-sdk-python==0.5.15
154
179
  ```
155
180
 
156
181
  **From source**
@@ -266,18 +291,18 @@ From the **package root** after `pip install -e .`. Run with `python examples/<f
266
291
  | Description | Run command | Source |
267
292
  |-------------|-------------|--------|
268
293
  | **PumpFun** | | |
269
- | PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.13` |
270
- | PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.13` |
271
- | Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.13` |
294
+ | PumpFun trade filtering | `python examples/pumpfun_trade_filter.py` | [pumpfun_trade_filter.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_trade_filter.py) | `v0.5.15` |
295
+ | PumpFun events + metrics | `python examples/pumpfun_with_metrics.py` | [pumpfun_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_with_metrics.py) | `v0.5.15` |
296
+ | Quick PumpFun connection test | `python examples/pumpfun_quick_test.py` | [pumpfun_quick_test.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpfun_quick_test.py) | `v0.5.15` |
272
297
  | **PumpSwap** | | |
273
- | PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.13` |
274
- | PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.13` |
298
+ | PumpSwap ultra-low latency | `python examples/pumpswap_low_latency.py` | [pumpswap_low_latency.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_low_latency.py) | `v0.5.15` |
299
+ | PumpSwap events + metrics | `python examples/pumpswap_with_metrics.py` | [pumpswap_with_metrics.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/pumpswap_with_metrics.py) | `v0.5.15` |
275
300
  | **Meteora DAMM** | | |
276
- | Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.13` |
301
+ | Meteora DAMM V2 events | `python examples/meteora_damm_grpc.py` | [meteora_damm_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/meteora_damm_grpc.py) | `v0.5.15` |
277
302
  | **Multi-protocol** | | |
278
- | Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.13` |
303
+ | Subscribe to every program in Rust `Protocol` / `program_ids` | `python examples/multi_protocol_grpc.py` | [multi_protocol_grpc.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/multi_protocol_grpc.py) | `v0.5.15` |
279
304
  | **Utility** | | |
280
- | Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.13` |
305
+ | Parse tx by signature (HTTP RPC; not gRPC). `TX_SIGNATURE` / `RPC_URL` or `SOLANA_RPC_URL` in `.env` or `--sig` / `--rpc`. | `python examples/parse_tx_by_signature.py` | [parse_tx_by_signature.py](https://github.com/0xfnzero/sol-parser-sdk-python/blob/main/examples/parse_tx_by_signature.py) | `v0.5.15` |
281
306
 
282
307
  **Env:** gRPC examples need **`GRPC_URL`** or **`GRPC_ENDPOINT`**, plus **`GRPC_AUTH_TOKEN`** or **`GRPC_TOKEN`** (or legacy `GEYSER_*`). See **`.env.example`**.
283
308
 
@@ -1,4 +1,4 @@
1
- sol_parser/__init__.py,sha256=0SBivj4hJynvlD617cEWSEUJScO04zIA0e_KUnw36r8,17535
1
+ sol_parser/__init__.py,sha256=Q8OdGgSlSAFyt3AAPBI5IF-APauFGy7kZyJDZhotsbA,17619
2
2
  sol_parser/account_dispatcher.py,sha256=WgWD0833ArPtXuRGMO7_URDxPhLaCcnHc-e8RNeGCJI,19947
3
3
  sol_parser/block_meta.py,sha256=LuJ4oy6xvRmFjSIUDUG9k4Dg7q9l2xW9z35wYJdBmCw,854
4
4
  sol_parser/check_migration.py,sha256=PsRE_Zhnw2g_iaP_iYtlGsQutE2w_FsaZIP4GPeN8-o,537
@@ -6,16 +6,16 @@ sol_parser/clock.py,sha256=RHF99qMerKvEsT55krkftIh-uqy_uTzpgdKCqKBMDmA,278
6
6
  sol_parser/dex_parsers.py,sha256=eOigBKLpMQGZT_3dJwq18niDhY0fSGJrULDx_TGNC8Q,146032
7
7
  sol_parser/entries_decode.py,sha256=MOhGadNxWLerxBhGvuNatoWa2hzw2MXVz9NmNUhWvS8,3665
8
8
  sol_parser/env_config.py,sha256=Lw0SdZuy_MvUaVkyFxS0qPBgMzR9UBbxbN0CVz8nxg4,7296
9
- sol_parser/event_type_parity.py,sha256=mD9Lg43aPzJGvz0Ft94NxKw6XnpgBio5yL2xin9Wfdg,4521
10
- sol_parser/event_types.py,sha256=S7rKiHkAcws42R27f9MaUMJwnJcK7xEeaKibB7tUauA,98320
9
+ sol_parser/event_type_parity.py,sha256=G2drUpg-YDtRSzIp1zGUkVheVzfCGely3H9Uw46bqGE,4543
10
+ sol_parser/event_types.py,sha256=l4k78EDzJVuP-CTWdwC4LruVcoXiMWGEwJIrEEfr1Jw,98776
11
11
  sol_parser/geyser_pb2.py,sha256=Hq66wmWxXD2jSbSVQW7vmBRB7nWmR1DuYDMQ6nKgl3o,20123
12
12
  sol_parser/geyser_pb2_grpc.py,sha256=ASPmZsCNvyCzt_j4IrhKjSacWUNLVuAiLfpjmyd-2Qc,15322
13
13
  sol_parser/grpc_client.py,sha256=fusMuSJsTPEUxgobdeimQ7s3Hu9n0bD8pIH7rEL40jM,37370
14
- sol_parser/grpc_instruction_parser.py,sha256=ogpnD3dTEeduxORH5VmwCnubGkQe9bbMCTC-NSH9Wkw,17107
15
- sol_parser/grpc_types.py,sha256=cqBuHmUuRqE8MvCwGzPtRR-T7BKNonT5-k4P6yDzspI,41388
16
- sol_parser/inner_instruction_parser.py,sha256=i5tkKS7F1aZWUdE9pzm2o5_1EXWM8-v71cjo45jM-d8,21668
14
+ sol_parser/grpc_instruction_parser.py,sha256=-aO5t2lMjeqePw-wR17DbkcMeCco-NU2NiqYOnSjObM,17274
15
+ sol_parser/grpc_types.py,sha256=bp-bsoZDWMeT44hFYJ64ksr_geeNMa_KzEKJdvGlvW8,41481
16
+ sol_parser/inner_instruction_parser.py,sha256=TtBAWx7WKw4pGOm1gwXDWNSfwuTko8cZ9_HryAYodCI,21911
17
17
  sol_parser/instr_account_utils.py,sha256=MY8bgoIDiv2yJKeWxqhpfKc3pV4xUFTcYKnSXtnQMWc,1990
18
- sol_parser/instructions.py,sha256=XZt73ZJmCZE5LWF8A-yLmxGmF0dcPxnVuRmhMf-7ynY,88373
18
+ sol_parser/instructions.py,sha256=j5hLBo4cduoXDu8n1ICQfc0k9tAJ3wSPJj5kWsL0KXw,88747
19
19
  sol_parser/json_util.py,sha256=y7uCaOwmtkJtvCHx3R8ff5YxwAhTvWBTZ-duFtNRNLc,2274
20
20
  sol_parser/liquidity_snapshot.py,sha256=kk5vC3oaOZeVoU1q4wquxRbCOWorq-fSMrNVe6BdxwU,3621
21
21
  sol_parser/log_instr_dedup.py,sha256=gn0dWaJOrSOczKhp25mmpz7BH7A9Gemsoho7ZIa09_A,18152
@@ -23,13 +23,14 @@ sol_parser/market.py,sha256=p_N6n3b4hEtUjHAQQyGSnrKdHYmkHdY1hXXObHRKc0Y,1858
23
23
  sol_parser/merger.py,sha256=hVIeocXYnLTP5qtXb4lZtED5EteE_g3a84ZeUwUmda0,13498
24
24
  sol_parser/order_buffer.py,sha256=f3yvvYglHX800hyF8JhFbjb1VoNtOvrqUR8lm3lvF-Y,7874
25
25
  sol_parser/parser.py,sha256=aSDbsbnUqBHEJ6UMdnZIuR-01fWs4_GxUwTJ3vQ0GXU,11906
26
- sol_parser/pump_routes.py,sha256=BT7QlzCxqpunz7HDTucts-8zOrLc1u3xnnPZyJgFoIE,4485
26
+ sol_parser/pump_routes.py,sha256=U7FWxZYyP860jUZh5F8YKAoauki-hgmfu2DNDjEcplM,4868
27
27
  sol_parser/pump_upgrade.py,sha256=BnVB8PVHfPtILBOlI29nbXABihVuXZUO82Yw6upFhRM,5212
28
28
  sol_parser/pumpfun_fee_enrich.py,sha256=NHC_chCv2wuaOW5taYG8R6M1bu8cmdxcLf8cjSfo7Kc,4688
29
- sol_parser/rpc_parser.py,sha256=Ft1VSBk66RLbwURKIoGtsRFDwjorh4EE6Gdqkil5tHY,25871
29
+ sol_parser/raw_instruction.py,sha256=puKDeTi7O-RUjUbnoq2uLYL1DgN8Gk73q970Kp5rrGg,1140
30
+ sol_parser/rpc_parser.py,sha256=-e6IIyZQdmz-BUZiKZ5NBdcOphueIGelZTw-hXO_PpU,26022
30
31
  sol_parser/rust_api_inventory.py,sha256=V5Bx1M3GT-ku_vj_kD6lnbqWExv1K_A00PrmhCFfRec,2257
31
32
  sol_parser/rust_event_json.py,sha256=7hho9TGfSOQjHev_8uRa4YHU1hrEsW1RfwcU9qHYz1o,1649
32
- sol_parser/shredstream_client.py,sha256=0D6dPZ366mmSuE-bMfjyt-Y3vrB35VMt1cJlCUuZQ_Y,11660
33
+ sol_parser/shredstream_client.py,sha256=DH6yNZF58y_69oTMoHdo6bFsWoGw-W-FgNmxVypBOLo,12610
33
34
  sol_parser/shredstream_pb2.py,sha256=BMrgCTcvRu5sY_QG1nj5AhWK9RL1fqF9Ga0xYihQfio,1703
34
35
  sol_parser/shredstream_pb2_grpc.py,sha256=zfRJaDj-76Gbr6tC3x4gFOz6Xpu2fmJFWWcTOTmyIXs,3013
35
36
  sol_parser/shredstream_pumpfun.py,sha256=agTryEilG7c9Ttlek2-d2fyhzwGHIKrUD9YMAJjvXfk,11187
@@ -59,7 +60,7 @@ sol_parser/grpc/subscribe_builder.py,sha256=xH9NZ1Lp-7AQKcgxoqyE0PrB3vdOqnScm_Ht
59
60
  sol_parser/grpc/transaction_meta.py,sha256=NmIffIQ1_OIfWGjy6JY-f8pIK5ucjDZXXJryjnlgoQs,5894
60
61
  sol_parser/instr/__init__.py,sha256=0_Ky8KpVEoXzxszHcHLTuY2SDsJwu0uAF2Q0wMY1e-c,503
61
62
  sol_parser/logs/__init__.py,sha256=e1cbhbCNeXy-NZvVsYCpGksBpZf4NJBLmdlky06og-U,349
62
- sol_parser_sdk_python-0.5.13.dist-info/METADATA,sha256=BP18H7b5D3mDvlRc-DEQc0uOxUt1uXFIokHY9XmZ6JY,20000
63
- sol_parser_sdk_python-0.5.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
64
- sol_parser_sdk_python-0.5.13.dist-info/entry_points.txt,sha256=ZGXRb-2jBdc56d8PCAZFiJBLTAzUKFeHPohysJnKVbA,206
65
- sol_parser_sdk_python-0.5.13.dist-info/RECORD,,
63
+ sol_parser_sdk_python-0.5.15.dist-info/METADATA,sha256=lYO7wm1TeTd-336DRBLgzYyXZNkoQBGoP-rFP0au5hU,23191
64
+ sol_parser_sdk_python-0.5.15.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
65
+ sol_parser_sdk_python-0.5.15.dist-info/entry_points.txt,sha256=ZGXRb-2jBdc56d8PCAZFiJBLTAzUKFeHPohysJnKVbA,206
66
+ sol_parser_sdk_python-0.5.15.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.32.4
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any