Transaction, Slot, Block, and Entry

Transaction Filters

Subscribe to transaction updates with filtering by type, status, and account involvement.

SubscribeRequestFilterTransactions

boolean

Include vote transactions. Set false to exclude, true to include only votes.

boolean

Include failed transactions. Set false to exclude, true to include only failures.

string

Match a specific transaction signature.

array of strings

Include transactions that use any account from this list (logical OR).

array of strings

Exclude transactions that use any account from this list.

array of strings

Require all accounts from this list to be present in the transaction (logical AND).

If all fields are empty, all transactions are broadcast. Otherwise, fields work as logical AND, and values within arrays as logical OR.

Transaction Update Messages

SubscribeUpdateTransaction (Full)

transactionSubscribeUpdateTransactionInfo
properties
signaturebytes
Transaction signature.
is_votebool
Whether this is a vote transaction.
transactionTransaction
Full transaction data (message + signatures).
metaTransactionStatusMeta
Execution metadata (logs, balances, etc.).
indexuint64
Transaction index within the block.
slotuint64
Slot containing the transaction.

SubscribeUpdateTransactionStatus (Lightweight)

Use the transactions_status field in SubscribeRequest (same filter format) to receive only status updates without full transaction data:

slotuint64
Slot containing the transaction.
signaturebytes
Transaction signature.
is_votebool
Whether this is a vote transaction.
indexuint64
Transaction index within the block.
errTransactionError
Error details (null on success).

Transaction Examples

All Non-Vote Transactions

typescript
const request = {
  transactions: {
    allTxs: {
      vote: false,
      failed: true,
      accountInclude: [],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Transactions Involving a Specific Program

typescript
const request = {
  transactions: {
    jupiterTxs: {
      vote: false,
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Track a Specific Signature

typescript
const request = {
  transactions: {
    myTx: {
      signature: "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW",
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.FINALIZED,
};

Successful-Only Transactions for Multiple Programs

typescript
const request = {
  transactions: {
    defiTxs: {
      vote: false,
      failed: false,
      accountInclude: [
        "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
        "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc",
      ],
      accountExclude: [],
      accountRequired: [],
    },
  },
  accounts: {},
  slots: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Slot Filters

Subscribe to real-time slot status updates from the validator.

SubscribeRequestFilterSlots

boolean

When true, only receive slot updates matching the commitment level set in the SubscribeRequest. By default, slots are sent for all commitment levels.

boolean

When true, include interslot updates (e.g., first shred received, bank created).

Slot Status Enum

protobuf
enum SlotStatus {
  SLOT_PROCESSED = 0;
  SLOT_CONFIRMED = 1;
  SLOT_FINALIZED = 2;
  SLOT_FIRST_SHRED_RECEIVED = 3;
  SLOT_COMPLETED = 4;
  SLOT_CREATED_BANK = 5;
  SLOT_DEAD = 6;
}
StatusValueDescription
SLOT_PROCESSED0Slot processed by the node
SLOT_CONFIRMED1Slot confirmed by supermajority
SLOT_FINALIZED2Slot finalized
SLOT_FIRST_SHRED_RECEIVED3First shred of slot received
SLOT_COMPLETED4All shreds received for slot
SLOT_CREATED_BANK5Bank created for slot
SLOT_DEAD6Slot is dead (will not be confirmed)

Slot Update Message

slotuint64
The slot number.
parentuint64
Parent slot number (optional).
statusSlotStatus
Current status of the slot.
dead_errorstring
Error message if the slot is dead (optional).

Slot Examples

Confirmed Slots Only

typescript
const request = {
  slots: {
    confirmedSlots: {
      filterByCommitment: true,
    },
  },
  accounts: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.slot) {
    console.log(`Slot ${data.slot.slot} - ${SlotStatus[data.slot.status]}`);
  }
});

All Slot Updates (Including Interslot)

typescript
const request = {
  slots: {
    allUpdates: {
      filterByCommitment: false,
      interslotUpdates: true,
    },
  },
  accounts: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
};

Block Filters

Subscribe to full block data or lightweight block metadata.

SubscribeRequestFilterBlocks

array of strings

Filter transactions and accounts within blocks that involve any account from this list.

boolean

Include all transactions in block updates.

boolean

Include all account updates in block updates.

boolean

Include all entries in block updates.

SubscribeRequestFilterBlocksMeta

Block metadata has no filter parameters - all block metadata is broadcast. Use this for lightweight block tracking when you don't need full transaction or account data.

Block Update Messages

SubscribeUpdateBlock (Full)

slotuint64
Block slot number.
blockhashstring
Block hash.
rewardsRewards
Block rewards.
block_timeUnixTimestamp
Block timestamp.
block_heightBlockHeight
Block height.
parent_slotuint64
Parent slot number.
parent_blockhashstring
Parent block hash.
executed_transaction_countuint64
Number of transactions executed.
transactionsarray
Array of SubscribeUpdateTransactionInfo (if included).
updated_account_countuint64
Number of accounts updated.
accountsarray
Array of SubscribeUpdateAccountInfo (if included).
entries_countuint64
Number of entries.
entriesarray
Array of SubscribeUpdateEntry (if included).

SubscribeUpdateBlockMeta (Lightweight)

slotuint64
Block slot number.
blockhashstring
Block hash.
rewardsRewards
Block rewards.
block_timeUnixTimestamp
Block timestamp.
block_heightBlockHeight
Block height.
parent_slotuint64
Parent slot number.
parent_blockhashstring
Parent block hash.
executed_transaction_countuint64
Number of transactions executed.
entries_countuint64
Number of entries.

Block reconstruction is based on BlockMeta. Blocks generated on validators may always have zero entries due to a known Solana issue.

Block Examples

Full Blocks with Transactions

typescript
const request = {
  blocks: {
    fullBlocks: {
      accountInclude: [],
      includeTransactions: true,
      includeAccounts: false,
      includeEntries: false,
    },
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.block) {
    console.log(
      `Block ${data.block.slot}: ${data.block.executedTransactionCount} txs, hash=${data.block.blockhash}`
    );
  }
});

Block Metadata Only

typescript
const request = {
  blocksMeta: {
    meta: {},
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Blocks Filtered by Account

Only include transactions and accounts involving a specific program:

typescript
const request = {
  blocks: {
    jupiterBlocks: {
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      includeTransactions: true,
      includeAccounts: true,
      includeEntries: false,
    },
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocksMeta: {},
  entry: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

Entry Filters

Subscribe to ledger entries as they are produced by the validator.

SubscribeRequestFilterEntry

Currently, entry filters have no configurable parameters - all entries are broadcast when subscribed.

Entry Update Message

slotuint64
Slot containing the entry.
indexuint64
Entry index within the slot.
num_hashesuint64
Number of hashes since the previous entry.
hashbytes
Entry hash (SHA-256).
executed_transaction_countuint64
Number of transactions in this entry.
starting_transaction_indexuint64
Starting index of transactions within the block (available since Solana v1.18; always 0 on v1.17).

Entry Example

Subscribe to All Entries

typescript
const request = {
  entry: {
    allEntries: {},
  },
  accounts: {},
  slots: {},
  transactions: {},
  transactionsStatus: {},
  blocks: {},
  blocksMeta: {},
  accountsDataSlice: [],
  commitment: CommitmentLevel.CONFIRMED,
};

stream.write(request);

stream.on("data", (data) => {
  if (data.entry) {
    const e = data.entry;
    console.log(
      `Entry slot=${e.slot} index=${e.index} txs=${e.executedTransactionCount}`
    );
  }
});

Deshred Transactions

SubscribeDeshred is a deployment-specific extension. cubestech does not list this method as a supported production feature.

Do not build production logic around Deshred until your account team confirms endpoint support and limits.

protobuf
rpc SubscribeDeshred(stream SubscribeDeshredRequest) returns (stream SubscribeUpdateDeshred) {}

SubscribeDeshredRequest

map<string, SubscribeRequestFilterDeshredTransactions>

Named deshred transaction subscription filters.

SubscribeRequestPing

Optional ping for keep-alive. Contains id (int32).

SubscribeRequestFilterDeshredTransactions

boolean

Include vote transactions.

array of strings

Include transactions that use any account from this list (logical OR).

array of strings

Exclude transactions that use any account from this list.

array of strings

Require all accounts from this list to be present (logical AND).

SubscribeUpdateDeshred

Each update contains the matched filter names and one update type:

filtersarray

Names of the filters that matched this update.

update_oneofoneof
Update types
deshred_transactionSubscribeUpdateDeshredTransaction
Pre-execution transaction data.
pingSubscribeUpdatePing
Server ping.
pongSubscribeUpdatePong
Pong response to client ping.
created_atTimestamp

Server-side timestamp when the update was created.

SubscribeUpdateDeshredTransaction

transactionSubscribeUpdateDeshredTransactionInfo
properties
signaturebytes
Transaction signature.
is_votebool
Whether this is a vote transaction.
transactionTransaction
Transaction data (message and signatures).
loaded_writable_addressesarray of bytes
Dynamically loaded writable addresses from address lookup tables.
loaded_readonly_addressesarray of bytes
Dynamically loaded readonly addresses from address lookup tables.
slotuint64
Slot in which the transaction was received.

SubscribeUpdateDeshredTransactionInfo

signaturebytes
Transaction signature.
is_votebool
Whether this is a vote transaction.
transactionTransaction
Transaction data (message and signatures).
loaded_writable_addressesarray of bytes
Dynamically loaded writable addresses from address lookup tables.
loaded_readonly_addressesarray of bytes
Dynamically loaded readonly addresses from address lookup tables.

Deshred transactions have no execution metadata - no logs, no balance changes, no compute units. These are raw transactions as received from the network before the validator executes them.

Deshred Example

typescript
const stream = await client.subscribeDeshred();

stream.on("data", (data) => {
  if (data.deshredTransaction) {
    const tx = data.deshredTransaction;
    console.log(`Pre-exec TX in slot ${tx.slot}: ${Buffer.from(tx.transaction.signature).toString("hex")}`);
    console.log(`  Loaded writable: ${tx.transaction.loadedWritableAddresses.length}`);
    console.log(`  Loaded readonly: ${tx.transaction.loadedReadonlyAddresses.length}`);
  }
});

stream.write({
  deshredTransactions: {
    myFilter: {
      vote: false,
      accountInclude: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      accountExclude: [],
      accountRequired: [],
    },
  },
});