Skip to content

shredstream/shredstream-sdk-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

7 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Solana ShredStream SDK for Python

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.

License: MIT Python

๐Ÿ“‹ Prerequisites

  1. Create an account on ShredStream.com
  2. Launch a Shred Stream and pick your region (Frankfurt, Amsterdam, Singapore, Chicago, and more)
  3. Enter your server's IP address and the UDP port where you want to receive shreds
  4. Open your firewall for inbound UDP traffic on that port (e.g. configure your cloud provider's security group)
  5. 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.

๐Ÿ“ฆ Installation

# Create a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate

# Install the SDK
pip install shredstream

โšก Quick Start

Create 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.py

๐Ÿ“– API Reference

ShredListener

  • ShredListener.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 configuration
  • ShredListener.offline() -> ShredListener โ€” Bind on ephemeral port; drive via handle_packet
  • ShredListener.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 yielding RawShred headers (no decode)
  • listener.handle_packet(data: bytes) -> tuple[int, list[bytes]] | None โ€” Inject an externally-received UDP datagram
  • listener.local_addr() -> str โ€” Bound socket address
  • listener.close() โ€” Release the socket

ListenerOptions

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

AccumulatorConfig

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

Metrics

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

Helpers

  • shredstream.classify_variant(byte: int) -> VariantKind | None โ€” Classify a shred variant byte
  • shredstream.pin_current_thread_to_cpu(cpu_id: int) -> None โ€” Best-effort thread pinning. Linux: sched_setaffinity; macOS: hint; other: no-op

๐ŸŽฏ Use Cases

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.

๐Ÿ’Ž PumpFun Token Sniping

ShredStream.com SDK detects PumpFun token creations ~499ms before they appear on PumpFun's live feed โ€” tested across 25 consecutive detections:

ShredStream.com SDK vs PumpFun live feed โ€” ~499ms advantage

Ready-to-run example included: see examples/pumpfun_creates.py. Run with python3 examples/pumpfun_creates.py [port].

โš™๏ธ Configuration

OS Tuning

# 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=67108864

Dependencies

  • solders>=0.21 โ€” Required to decode the bincode-encoded transactions yielded by the iterator.

๐Ÿš€ Launch a Shred Stream

Need a feed? Launch a Solana Shred Stream on ShredStream.com โ€” sub-millisecond delivery, multiple global regions, 5-minute setup.

๐Ÿ”— Links

๐Ÿ“„ License

MIT โ€” ShredStream.com