← Back to list
💰

yellowstone-grpc Checked

Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)
💰 Finance & Trading skills By agiprolabs Version v1.0.0 Added 2026-09-20 Updated 2026-09-20 Source ↗
8.2Overall rating
2Views
6Downloads
366Stars

Installation

🤖 Install via AI

Copy the prompt below and send it to your AI assistant (e.g. Claude Code) — it will follow the instructions and install automatically.

Install the "yellowstone-grpc" skill by following the instructions at https://skill123.me/install/yellowstone-grpc.
⌨️ Command line install

Run in your terminal — downloads and installs to ~/.claude/skills/.

curl -fsSL https://skill123.me/install/yellowstone-grpc.sh | bash
📦 Download ZIP

Download the zip and extract it into your skills directory (e.g. ~/.claude/skills/), then restart your session.

⬇ Download v1.0.0 · 23 KB
📊 Static rating
8.2/10
Trigger
3.5
Structure
9.3
Workflow
8.4
Content
10.0
Engineering
10.0
Security
10.0

Six-dimension rubric with reviewer rationale.

View scorecard ↓
🛡 Dynamic test
—

Not live-tested yet — this skill is rated on static analysis only.

About this skill

Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)

Yellowstone gRPC — Real-Time Solana Streaming

Stream every transaction, account update, slot, and block on Solana in real-time using Yellowstone gRPC. This is the foundation for any latency-sensitive Solana trading system — replacing REST polling with push-based streaming at ~5ms slot latency.

Documentation

Real-time Solana transaction and account streaming via Yellowstone gRPC (Geyser plugin)

Yellowstone gRPC — Real-Time Solana Streaming

Stream every transaction, account update, slot, and block on Solana in real-time using Yellowstone gRPC. This is the foundation for any latency-sensitive Solana trading system — replacing REST polling with push-based streaming at ~5ms slot latency.

Why Yellowstone gRPC

| Method | Slot Latency (p90) | Use Case |

|--------|-------------------|----------|

| REST polling (getTransaction) | ~150ms+ | Historical lookups |

| WebSocket (onLogs) | ~10ms | Simple notifications |

| **Yellowstone gRPC** | **~5ms** | **Production trading systems** |

Yellowstone is a Geyser plugin that exposes Solana validator data over gRPC. Every major RPC provider runs it. You subscribe to filtered streams of transactions, account changes, slots, blocks, and entries — and the data pushes to you.

Quick Start

### 1. Get Access

You need a gRPC-enabled RPC provider. See references/providers.md for full comparison.

| Provider | gRPC Entry Price | Notes |

|----------|-----------------|-------|

| Shyft | $199/mo | Best value, 7 regions, unlimited bandwidth |

| Helius | $999/mo | LaserStream, DAS APIs included |

| Triton One | ~$2,900/mo | Created Yellowstone, lowest latency |

| QuickNode | Plan-dependent | Marketplace add-on |

| Chainstack | $49/mo (1 stream) | Budget option, limited filters |

| Alchemy | Free tier available | Compute-unit metered |

### 2. Install Dependencies


# Python
uv pip install grpcio grpcio-tools protobuf base58 solders python-dotenv

# Generate Python stubs from proto files
git clone https://github.com/rpcpool/yellowstone-grpc.git
python -m grpc_tools.protoc \
  -I./yellowstone-grpc/yellowstone-grpc-proto/proto/ \
  --python_out=./generated \
  --pyi_out=./generated \
  --grpc_python_out=./generated \
  ./yellowstone-grpc/yellowstone-grpc-proto/proto/*.proto

# Rust — Cargo.toml
[dependencies]
yellowstone-grpc-client = "6.0.0"
yellowstone-grpc-proto = "6.0.0"
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
futures = "0.3"
bs58 = "0.5"

# TypeScript
npm install @triton-one/yellowstone-grpc @solana/web3.js

### 3. Environment Setup


export GRPC_ENDPOINT="https://grpc.ny.shyft.to"  # your provider endpoint
export GRPC_TOKEN="your-x-token-here"              # from provider dashboard

### 4. Connect and Subscribe


import grpc
import os
from generated import geyser_pb2, geyser_pb2_grpc

endpoint = os.environ["GRPC_ENDPOINT"].replace("https://", "")
token = os.environ["GRPC_TOKEN"]
View full documentation

Authenticated TLS channel

auth_creds = grpc.metadata_call_credentials(

lambda ctx, cb: cb((("x-token", token),), None)

)

channel = grpc.secure_channel(

endpoint,

grpc.composite_channel_credentials(

grpc.ssl_channel_credentials(), auth_creds

),

options=[("grpc.max_receive_message_length", 64 * 1024 * 1024)],

)

stub = geyser_pb2_grpc.GeyserStub(channel)



## Core Concepts

### Subscription Types

| Type | What You Get | Use Case |
|------|-------------|----------|
| `transactions` | Full transaction with metadata | DEX swap monitoring, copy trading |
| `accounts` | Account data on change | Pool reserve tracking, token supply |
| `slots` | Slot progression events | Block timing, confirmation tracking |
| `blocks` | Full block contents | Block-level analysis |
| `blocks_meta` | Block metadata only | Lightweight block tracking |
| `entry` | Block entries (shred groups) | Low-level validator data |
| `transactions_status` | Tx status without full data | Lightweight confirmation |

### Filter Logic

- Multiple filter **types** (transactions + accounts) = **AND** — you get updates matching any type
- Values within arrays (multiple addresses in `account_include`) = **OR**
- Named filters let you distinguish which filter matched in the response
- Sending a new `SubscribeRequest` **replaces** all previous filters

### Commitment Levels

| Level | Speed | Safety | Use For |
|-------|-------|--------|---------|
| `PROCESSED` | Fastest | May be rolled back | Time-critical signals |
| `CONFIRMED` | ~400ms slower | Supermajority voted | Most trading use cases |
| `FINALIZED` | ~6-12s slower | Irreversible | Settlement verification |

## Common Subscription Patterns

### Watch All Swaps on a DEX Program

Filter: all non-vote, non-failed transactions involving PumpFun

request = geyser_pb2.SubscribeRequest(

transactions={

"pumpfun": geyser_pb2.SubscribeRequestFilterTransactions(

account_include=["6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"],

vote=False,

failed=False,

)

},

commitment=geyser_pb2.CommitmentLevel.PROCESSED,

)



### Track Specific Wallets

request = geyser_pb2.SubscribeRequest(

transactions={

"whales": geyser_pb2.SubscribeRequestFilterTransactions(

account_include=[

"WalletAddress1...",

"WalletAddress2...",

],

vote=False,

failed=False,

)

},

commitment=geyser_pb2.CommitmentLevel.CONFIRMED,

)



### Monitor Pool Reserves (Account Subscription)

request = geyser_pb2.SubscribeRequest(

accounts={

"raydium_pools": geyser_pb2.SubscribeRequestFilterAccounts(

account=["PoolAddress1...", "PoolAddress2..."],

)

},

commitment=geyser_pb2.CommitmentLevel.PROCESSED,

)



### Reduce Bandwidth with Data Slicing

Only get the first 40 bytes of account data (e.g., just the discriminator + key fields)

request = geyser_pb2.SubscribeRequest(

accounts={

"token_accounts": geyser_pb2.SubscribeRequestFilterAccounts(

owner=["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],

filters=[

geyser_pb2.SubscribeRequestFilterAccountsFilter(

token_account_state=True

)

],

)

},

accounts_data_slice=[

geyser_pb2.SubscribeRequestAccountsDataSlice(offset=0, length=40)

],

)



## Parsing Transaction Updates

When you receive a `SubscribeUpdateTransaction`, extract:

for update in stream:

if update.HasField("transaction"):

tx = update.transaction

info = tx.transaction

sig = base58.b58encode(info.signature).decode()

slot = tx.slot

msg = info.transaction.message

account_keys = [base58.b58encode(k).decode() for k in msg.account_keys]

Instructions

for ix in msg.instructions:

program = account_keys[ix.program_id_index]

accounts = [account_keys[i] for i in ix.accounts]

data = ix.data # bytes — decode per program IDL

Token balance changes (post-execution)

meta = info.meta

for tb in meta.post_token_balances:

mint = tb.mint

owner = tb.owner

amount = tb.ui_token_amount.ui_amount



See `references/proto_reference.md` for complete field documentation.

## Production Architecture

[gRPC Stream] → [Bounded Channel] → [Processing Workers]

(1K-100K cap) ├─ Parse instructions

├─ Update state / DB

└─ Trigger actions



**Critical patterns:**
- Decouple I/O from processing — never block the gRPC stream
- Reconnect with exponential backoff (100ms → 60s cap)
- Use `from_slot` to resume after disconnection (subtract ~32 slots for reorg safety)
- Ping every 15-30 seconds to keep connection alive
- Filter `vote: false` always — vote transactions are ~70% of all traffic
- Set `max_receive_message_length` to 64MB+ (default 4MB is too small)

See `references/performance.md` for full production checklist.

## Key Program IDs for Trading

| Program | Address | What It Does |
|---------|---------|-------------|
| PumpFun | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | Token launches, bonding curve trades |
| PumpSwap |

Score breakdown

Trigger
3.5
Description states What (real-time Solana streaming via Yellowstone gRPC) but no When/When-Not, no trigger variants, no exclusions: 3+2+2+0=7/20
Structure
9.3
270-line SKILL.md with clean offload to 4 references + 2 scripts, inline 'See references/...' cues throughout: 4+5+3+2=14/15
Workflow
8.4
Task-oriented quick start; tool-wrapper scripts with production patterns (backoff, queue caps, dedup, replay); strong error handling; modest verification guidance: 5+5+5+4+2=21/25
Content
10.0
Concise imperative style, complete runnable commands with real parameters across Python/Rust/TS: 10/10
Engineering
10.0
Valid frontmatter; scripts have shebangs, declared deps, and documented proto-stub setup; all paths exist: 10/10
Security
10.0
No undeclared egress, no eval/base64/destructive ops, no secrets, no injection; token via env used only for its own endpoint auth; capabilities match declared scope: 20/20
Well-engineered Yellowstone gRPC streaming skill: two robust scripts (exponential backoff, bounded queues, signature dedup, from_slot replay), 4 focused references, quick-start steps. Description is What-only. Capability manifest: reads env vars GRPC_ENDPOINT/GRPC_TOKEN/WATCH_WALLETS/TARGET_PROGRAM (all declared); no file/credential reads, no writes, no persistence; only network egress is gRPC to the user-configured endpoint with the token used solely for its auth. Minor: providers.md documents Shyft clear-connections URL with token in query string (provider's own API pattern, placeholder). Capabilities match declared scope.