Three gotchas hit wiring a yellowstone-grpc (Geyser) transactions subscription in Rust, found building the solv1-rig Yellowstone adapter: where the confirmed-block proto types actually live, a new struct field that breaks exhaustive literals, and the fact that client and proto crates are no longer lockstep-versioned.
For Agents
Wiring
yellowstone-grpc-client+yellowstone-grpc-proto? (1)Message/Transaction/TransactionStatusMetalive undersolana::storage::confirmed_block(use the crate prelude). (2) Always buildSubscribeRequestFilterTransactionswith..Default::default()— it gained atoken_accountsfield. (3) Pin the client and proto crate versions independently; matching majors are not guaranteed.
1. Confirmed-block types live in solana::storage::confirmed_block
The decoded transaction types you need on the receive side — Message, Transaction, TransactionStatusMeta (and the surrounding confirmed-block messages) — are generated under:
yellowstone_grpc_proto::solana::storage::confirmed_block::{Message, Transaction, TransactionStatusMeta}The crate prelude re-exports them, so the ergonomic import is:
use yellowstone_grpc_proto::prelude::*;Reaching for them under a top-level module (or copying import paths from older examples / geyser plugin docs) sends you looking in the wrong place. When in doubt, import from the prelude.
2. SubscribeRequestFilterTransactions gained token_accounts (tag 30)
The transactions filter struct picked up a new field:
pub token_accounts: Option<i32>, // protobuf tag 30Any exhaustive struct literal (listing every field: account_include, account_exclude, account_required, vote, failed, signature, …) fails to compile against a proto version that added token_accounts. Always construct it with a spread so future field additions don’t break the build:
SubscribeRequestFilterTransactions {
account_include: venues.include_list(),
vote: Some(false),
failed: None, // include failed txs — shreds can't exclude them
..Default::default()
}Note the field is singular
The venue filter field is
account_include(singular_include), andfailed: Nonedeliberately includes failed transactions — the shred side can’t drop them, so excluding on the Yellowstone side would poison the cross-feed match population.
3. Client 13.x and proto 12.x are no longer lockstep-versioned
Older yellowstone-grpc releases moved the client and proto crates together; they no longer do. The rig pins them independently:
yellowstone-grpc-client = "13.2"
yellowstone-grpc-proto = "12.5"Do not assume the client and proto crates share a major version — pin each to what actually resolves and compiles together. Separately, client/proto ↔ server compatibility with a given vendor’s Yellowstone deployment (e.g. RPC Fast) is prudent-but-undocumented: verify against their server version during shakeout, not by assuming version parity.
Related
- solv1-rig-increment-1-build-2026-07-03 — the Yellowstone adapter these gotchas were found building
- solana-v0-alt-classification-trap — why this (Yellowstone) leg is the venue-classification authority
- rust-protoc-docker-wkt-proto — sibling proto/Docker gotcha from the same build