Solana ShredStream SDK/Decoder for Python, enabling ultra-low latency Solana transaction streaming via UDP shreds from ShredStream.com
Part of the ShredStream.com ecosystem โ ultra-low latency Solana shred streaming via UDP.
- Create an account on ShredStream.com
- Launch a Shred Stream and pick your region (Frankfurt, Amsterdam, Singapore, Chicago, and more)
- Enter your server's IP address and the UDP port where you want to receive shreds
- Open your firewall for inbound UDP traffic on that port (e.g. configure your cloud provider's security group)
- Install Python 3.10+:
# Linux (Ubuntu/Debian) sudo apt update && sudo apt install -y python3 python3-venv python3-pip # macOS brew install python3
๐ Want to try before you buy? Open a ticket on our Discord to request a free trial.
# Create a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install the SDK
pip install shredstreamCreate a file main.py:
from shredstream import ShredListener
from solders.transaction import VersionedTransaction
import os
PORT = int(os.environ.get("SHREDSTREAM_PORT", 8001))
listener = ShredListener.bind(PORT)
# Decoded transactions โ ready-to-use Solana transactions
for slot, txs in listener:
for raw in txs:
tx = VersionedTransaction.from_bytes(raw)
print(f"slot {slot}: {tx.signatures[0]}")Each raw is the bincode wire-format encoding of a VersionedTransaction.
Run it:
python3 main.pyShredListener.bind(port: int) -> ShredListenerโ Bind with defaults (64 MB recv buf, 3 slot window, FEC enabled)ShredListener.bind_with_options(port, options: ListenerOptions) -> ShredListenerโ Custom configurationShredListener.offline() -> ShredListenerโ Bind on ephemeral port; drive viahandle_packetShredListener.from_fd(fd: int, options=None) -> ShredListenerโ Adopt an existing UDP file descriptor- Iterator protocol โ
for slot, txs in listener:yields(int, list[bytes]) listener.shreds() -> ShredIterโ Iterator yieldingRawShredheaders (no decode)listener.handle_packet(data: bytes) -> tuple[int, list[bytes]] | Noneโ Inject an externally-received UDP datagramlistener.local_addr() -> strโ Bound socket addresslistener.close()โ Release the socket
ListenerOptions(
recv_buf=64*1024*1024,
max_age=3,
busy_poll_us=200,
busy_poll_disabled=False,
pool_size=4096,
enable_fec=True,
disable_salvage_delivery=False,
accumulator=AccumulatorConfig(),
)| Field | Default | Description |
|---|---|---|
recv_buf |
64 MB |
SO_RCVBUF size |
max_age |
3 |
Slot retention window |
busy_poll_us |
200 |
Linux SO_BUSY_POLL ยตs |
busy_poll_disabled |
False |
Pass True to disable busy poll explicitly |
pool_size |
4096 |
Number of 2 KiB buffers in the zero-copy pool |
enable_fec |
True |
Reed-Solomon recovery on dropped data shreds |
disable_salvage_delivery |
False |
Drop salvaged tail txs for lowest p99 |
accumulator |
AccumulatorConfig() |
FEC and stuck-batch tuning |
| Field | Default | Description |
|---|---|---|
max_fec_sets_per_slot |
32 |
Per-slot FEC buffer cap |
stuck_batch_timeout_ms |
50 |
Force-finalize a stuck batch after this delay |
Read-only @property accessors on ShredListener:
| Group | Methods |
|---|---|
| Throughput | data_shred_count_total, code_shred_count_total, bytes_received, slot_count |
| Decoder | batches_decoded_streaming_total, batches_decoded_fallback_total, batches_skipped_total, decode_errors_total |
| FEC | fec_recoveries_total, fec_recovery_failures_total, fec_sets_discarded_unused_total, fec_sets_evicted_early_total |
| Unparseable | unparseable_packets, unparseable_too_short, unparseable_variant, unparseable_payload, unparseable_slot_range |
| Slot lifecycle | slots_completed_total, slots_evicted_by_age, dropped_known_slots, harvested_batches_total, salvaged_tail_tx_total |
| Tail control | batches_force_finalized_corrupted_total, batches_force_finalized_timeout_total |
| Pool / I-O | pool_exhausted_count, last_io_error_kind, busy_poll_active |
shredstream.classify_variant(byte: int) -> VariantKind | Noneโ Classify a shred variant byteshredstream.pin_current_thread_to_cpu(cpu_id: int) -> Noneโ Best-effort thread pinning. Linux:sched_setaffinity; macOS: hint; other: no-op
ShredStream.com shred data powers a wide range of latency-sensitive strategies โ HFT, MEV extraction, token sniping, copy trading, liquidation bots, on-chain analytics, and more.
ShredStream.com SDK detects PumpFun token creations ~499ms before they appear on PumpFun's live feed โ tested across 25 consecutive detections:
Ready-to-run example included: see
examples/pumpfun_creates.py. Run withpython3 examples/pumpfun_creates.py [port].
# Linux -- increase max receive buffer
sudo sysctl -w net.core.rmem_max=67108864
sudo sysctl -w net.core.busy_read=200
# macOS
sudo sysctl -w kern.ipc.maxsockbuf=67108864solders>=0.21โ Required to decode the bincode-encoded transactions yielded by the iterator.
Need a feed? Launch a Solana Shred Stream on ShredStream.com โ sub-millisecond delivery, multiple global regions, 5-minute setup.
- ๐ Website: https://www.shredstream.com/
- ๐ Documentation: https://docs.shredstream.com/
- ๐ฆ X (Twitter): https://x.com/ShredStream
- ๐ฎ Discord: https://discord.gg/4w2DNbTaWD
- ๐ฌ Telegram: https://t.me/ShredStream
- ๐ป GitHub: https://github.com/ShredStream
- ๐ซ Support: Discord
- ๐ Benchmarks: Discord
MIT โ ShredStream.com
