Solana DEX program log parsing (pure Python, API aligned with sol-parser-sdk)
Project description
⚡ Sol Parser SDK - Python
High-performance Solana DEX event parser for Python
High-performance Python library for parsing Solana DEX events in real-time via Yellowstone gRPC
中文 | English | Website | Telegram | Discord
☕ Support This Project
This SDK is completely free and open source. However, maintaining and continuously updating it requires significant AI computing resources and token consumption. If this SDK helps with your development, consider making a monthly SOL donation — any amount is appreciated and helps keep this project alive!
Donation Wallet:
6oW7AXz1yRb57pYSxysuXnMs2aR1ha5rzGzReZ1MjPV8
Other language SDKs
| Language | Repository |
|---|---|
| Rust | sol-parser-sdk |
| Node.js | sol-parser-sdk-nodejs |
| Python | sol-parser-sdk-python |
| Go | sol-parser-sdk-golang |
Release notes
v0.5.5
- Aligns ShredStream parsing with Rust/Node.js/Go for low-latency static-account paths.
- Uses default pubkey placeholders for V0 ALT-loaded instruction accounts instead of dropping the instruction.
- Adds discriminator fallback when the ShredStream outer program id is ALT-loaded.
- Fixes Pump.fun ShredStream create/create_v2 fallback to use instruction-order accounts.
- Improves Pump.fun v2 short-account parsing, event-type filtering, and multi-protocol routing parity.
How to use
1. Install
From PyPI
pip install sol-parser-sdk-python==0.5.5
From source
git clone https://github.com/0xfnzero/sol-parser-sdk-python
cd sol-parser-sdk-python
pip install -e .
pip install grpcio grpcio-tools protobuf base58 python-dotenv
2. Environment (Yellowstone gRPC examples)
At the package root (next to pyproject.toml):
cp .env.example .env
# Set GRPC_URL (or GRPC_ENDPOINT) and GRPC_AUTH_TOKEN or GRPC_TOKEN
Run examples from that directory so .env is picked up (same idea as the Node.js package).
CLI overrides: --grpc-url / -g, --grpc-token / --token (also --grpc-url=https://host:443). Rust-compatible names: GRPC_AUTH_TOKEN (same as sol-parser-sdk examples), GRPC_ENDPOINT (alias for URL). Legacy env: GEYSER_ENDPOINT / GEYSER_API_TOKEN. Precedence: CLI > GRPC_URL / GRPC_ENDPOINT > GEYSER_* > defaults; token: CLI > GRPC_AUTH_TOKEN > GRPC_TOKEN > GEYSER_API_TOKEN. Explicit shell export wins over .env; python-dotenv does not overwrite existing variables.
Helpers: sol_parser.env_config (parse_grpc_credentials, require_grpc_env, parse_shredstream_url, …), re-exported from sol_parser.
3. Smoke test
python examples/pumpfun_quick_test.py
Requires GRPC_URL (or GRPC_ENDPOINT) and (for most providers) GRPC_AUTH_TOKEN or GRPC_TOKEN in .env or the environment. You can pass credentials on the command line instead; see step 2.
4. Minimal gRPC subscribe + parse
import asyncio
import os
import base58
from sol_parser import parse_logs_only
from sol_parser.grpc_client import YellowstoneGrpc
from sol_parser.grpc_types import Protocol, SubscribeCallbacks, transaction_filter_for_protocols
async def main():
endpoint = (
os.environ.get("GRPC_URL", "").strip()
or os.environ.get("GRPC_ENDPOINT", "").strip()
or os.environ.get("GEYSER_ENDPOINT", "solana-yellowstone-grpc.publicnode.com:443")
)
token = (
os.environ.get("GRPC_AUTH_TOKEN", "").strip()
or os.environ.get("GRPC_TOKEN", "").strip()
or os.environ.get("GEYSER_API_TOKEN", "")
)
client = YellowstoneGrpc(endpoint)
if token:
client.set_x_token(token)
await client.connect()
filter_ = transaction_filter_for_protocols([Protocol.PUMP_FUN, Protocol.PUMP_SWAP])
filter_.vote = False
filter_.failed = False
def on_update(update):
if update.transaction is None or update.transaction.transaction is None:
return
tx_info = update.transaction.transaction
slot = update.transaction.slot
logs = tx_info.log_messages
if not logs:
return
sb = bytes(tx_info.signature) if tx_info.signature else b""
sig = base58.b58encode(sb).decode("ascii") if len(sb) == 64 else ""
events = parse_logs_only(
logs, sig, slot, None, subscribe_tx_info=tx_info
) # tx_info from gRPC update — fills accounts from instruction keys
for ev in events:
print(ev)
sub = await client.subscribe_transactions(
filter_,
SubscribeCallbacks(on_update=on_update, on_error=print, on_end=lambda: None),
)
print("subscribed", sub.id)
try:
await asyncio.Event().wait()
except KeyboardInterrupt:
pass
await client.disconnect()
asyncio.run(main())
Lighter path: parse_logs_only(logs, …) only needs log messages from the update (no full wire transaction).
5. ShredStream (HTTP — not Yellowstone gRPC)
Python includes a native ShredStream client (ShredStreamClient, ShredStreamConfig) plus the same env/CLI helpers as Node (parse_shredstream_url: SHREDSTREAM_URL / SHRED_URL, --url / -u / --endpoint=). Install the optional extra with pip install 'sol-parser-sdk-python[shredstream]'. ShredStream uses its own endpoint, not GRPC_URL.
The Python ShredStream hot path uses static account keys only. V0 ALT-loaded instruction accounts are represented with default pubkey placeholders, and ALT-loaded outer program ids are parsed best-effort by discriminator. Inner CPI/log-only events still require the Yellowstone/RPC paths.
Examples
From the package root after pip install -e .. Run with python examples/<file>.py. Scripts are written to mirror the output layout and env names of sol-parser-sdk/examples (Rust); streaming uses subscribe_transactions + parse_logs_only with the same program IDs as TransactionFilter::for_protocols in Rust.
| Description | Run command | Source |
|---|---|---|
| PumpFun | ||
| PumpFun trade filtering | python examples/pumpfun_trade_filter.py |
pumpfun_trade_filter.py |
| PumpFun events + metrics | python examples/pumpfun_with_metrics.py |
pumpfun_with_metrics.py |
| Quick PumpFun connection test | python examples/pumpfun_quick_test.py |
pumpfun_quick_test.py |
| PumpSwap | ||
| PumpSwap ultra-low latency | python examples/pumpswap_low_latency.py |
pumpswap_low_latency.py |
| PumpSwap events + metrics | python examples/pumpswap_with_metrics.py |
pumpswap_with_metrics.py |
| Meteora DAMM | ||
| Meteora DAMM V2 events | python examples/meteora_damm_grpc.py |
meteora_damm_grpc.py |
| Multi-protocol | ||
Subscribe to every program in Rust Protocol / program_ids |
python examples/multi_protocol_grpc.py |
multi_protocol_grpc.py |
| Utility | ||
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 |
Env: gRPC examples need GRPC_URL or GRPC_ENDPOINT, plus GRPC_AUTH_TOKEN or GRPC_TOKEN (or legacy GEYSER_*). See .env.example.
Protocols
PumpFun, PumpSwap, Raydium AMM V4 / CLMM / CPMM, Orca Whirlpool, Meteora DAMM V2 / DLMM, Raydium LaunchLab (see sol_parser/).
Useful exports
parse_logs_only— log-based DEX events from gRPC log messages.format_dex_event_json/dex_event_to_jsonable— pretty-printDexEventas indented JSON (one field per line);repr(ev)is the default dataclass single-line form, not JSON.YellowstoneGrpc— async Yellowstone gRPC client (connect,subscribe_transactions,disconnect).now_micros— microsecond clock (same role as Rustsol_parser_sdk::core::now_micros).transaction_filter_for_protocols/program_ids_for_protocols/account_filter_for_protocols— same program IDs as RustProtocol+for_protocolsingrpc/filter.rs.parse_grpc_credentials/require_grpc_env— load.env+ env + CLI (aligned with sol-parser-sdk-nodejsgrpc_env).
Advanced
Custom gRPC endpoint
import os
from sol_parser.grpc_client import YellowstoneGrpc
endpoint = os.environ.get("GRPC_URL") or os.environ.get("GRPC_ENDPOINT") or os.environ.get(
"GEYSER_ENDPOINT", "solana-yellowstone-grpc.publicnode.com:443"
)
token = (
os.environ.get("GRPC_AUTH_TOKEN")
or os.environ.get("GRPC_TOKEN")
or os.environ.get("GEYSER_API_TOKEN", "")
)
client = YellowstoneGrpc(endpoint)
if token:
client.set_x_token(token)
Create + buy detection
parse_logs_only can detect create-and-buy patterns from program logs; see the PumpFun examples.
Project structure
sol-parser-sdk-python/
├── sol_parser/
│ ├── grpc_client.py # YellowstoneGrpc (async connect / subscribe)
│ ├── env_config.py # GRPC_URL, .env, CLI helpers (Node parity)
│ ├── clock.py # now_micros()
│ ├── grpc_types.py # TransactionFilter, SubscribeCallbacks, for_protocols helpers, …
│ ├── parser.py # parse_logs_only, …
│ ├── geyser_pb2.py # Generated proto (Yellowstone)
│ └── …
├── examples/
│ ├── pumpfun_trade_filter.py
│ ├── pumpfun_quick_test.py
│ └── …
├── .env.example
└── pyproject.toml
Development
pip install -e ".[dev]"
pytest tests/
License
MIT — https://github.com/0xfnzero/sol-parser-sdk-python
Contact
- Repository: https://github.com/0xfnzero/sol-parser-sdk-python
- Website: https://fnzero.dev/
- Telegram: https://t.me/fnzero_group
- Discord: https://discord.gg/vuazbGkqQE
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sol_parser_sdk_python-0.5.5.tar.gz.
File metadata
- Download URL: sol_parser_sdk_python-0.5.5.tar.gz
- Upload date:
- Size: 123.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00f5cbb172e19add8fe5700d2c9b4b8fbd11125c33e2af808dd82e106318fbfb
|
|
| MD5 |
254a20a3225617a2acfb8f16fba6cbf3
|
|
| BLAKE2b-256 |
d1992dd260d7149dfba840e7ac8da1f7b7e1cef45cee0f16a1baa3ba1c3a2d6c
|
File details
Details for the file sol_parser_sdk_python-0.5.5-py3-none-any.whl.
File metadata
- Download URL: sol_parser_sdk_python-0.5.5-py3-none-any.whl
- Upload date:
- Size: 125.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3cfd3f44592085579985db017ff13e417583e2c03c7ac315eb60fd34fd19446c
|
|
| MD5 |
5d21435603a6ce3b299af4062eafd359
|
|
| BLAKE2b-256 |
b3382739ffb9d5e8b5f56247bef6d107aef132b9789875711f6c3b6c36aeb22a
|