Skip to main content
Sodae Preplay Shreds
A leader broadcasts its block as shreds while it is still producing it. Preplay Shreds reassembles those shreds the moment enough of them arrive, decodes every transaction and streams it to you, so you see each transaction in leader order before the block is finished or replayed.

API

The service speaks the Yellowstone gRPC protocol, so any Yellowstone client with SubscribeDeshred works, including yellowstone-grpc-client 14 for Rust and @triton-one/yellowstone-grpc 7 for TypeScript. The definitions are in geyser.proto and solana-storage.proto.
geyser.proto
Open the stream, then send a SubscribeDeshredRequest with one or more named filters. Each message you receive carries one transaction and the names of the filters it matched. See Transaction format for how to read it.

Filters

A filter matches a transaction when:
  • account_include is empty, or the transaction uses at least one of its accounts;
  • none of the account_exclude accounts appear in it;
  • it uses every account in account_required.
Accounts are matched against the transaction’s own account keys and the addresses it loads from address lookup tables. A filter with no accounts matches every transaction.
  • Vote transactions are never sent. Leave vote unset or set it to false; true is refused with INVALID_ARGUMENT.
  • Up to 16 filters per stream and 1,024 accounts per list. Filter names are at most 64 bytes.
  • Send a new request on the same stream at any time to replace the filters. A request with no filters stops delivery until you send new ones.
  • slots and include_update_parent are not supported and are refused.

What you receive

  • Signed transactions, in the order the leader recorded them: legacy, v0 and v1.
  • Lookup-table addresses already resolved in loaded_writable_addresses and loaded_readonly_addresses. In the rare case a table cannot be resolved, both lists are empty while the message still lists its address_table_lookups, and a filter with account_exclude skips that transaction.
  • No execution results. The transactions have not been executed yet, so there is no status, logs, fee or balance change. A transaction you see here can still fail, and the slot can still be skipped.
For executed transactions with status, use Yellowstone gRPC.

Staying connected

  • The server sends a ping every 15 seconds. Reply with a request carrying ping so proxies between you and the service keep the connection open; the reply does not change your filters.
  • Set the client’s maximum decoded message size to at least 64 MB.
  • Read continuously. A client that falls behind the stream, or reads nothing for 10 seconds, is disconnected with DATA_LOSS. Narrow your filters if you cannot keep up with the full stream.
  • Reconnect with exponential backoff when a stream ends. Nothing is replayed on reconnect; transactions broadcast while you were disconnected are not resent.
  • UNAVAILABLE and RESOURCE_EXHAUSTED without an error code are temporary: retry with backoff. INVALID_ARGUMENT means a filter was rejected: fix the request.
  • Do not retry on UNAUTHENTICATED, NOT_ENTITLED, IP_NOT_ALLOWED or QUOTA_EXCEEDED. See Errors.

Metering

Per-GB plans and trials count the bytes streamed to you, so filters that narrow the stream also reduce what you use. For sustained use of the full stream, the fixed-price Binary Decoded Shreds plan has no data cap.