# gRPC Transaction, Slot, Block & Entry Filters

> Subscribe to Solana transactions, slots, blocks, entries, and deshred data via Yellowstone gRPC.

Canonical: https://nolimitnodes.com/docs/api-reference/grpc/transactions-slots-blocks

## Transaction Filters

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

## SubscribeRequestFilterTransactions

### `vote`, boolean

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

### `failed`, boolean

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

### `signature`, string

Match a specific transaction signature.

### `account_include`, array of strings

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

### `account_exclude`, array of strings

Exclude transactions that use **any** account from this list.

### `account_required`, array of strings, required

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

> Note: 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)

### `transaction`, SubscribeUpdateTransactionInfo

### properties

Transaction signature.

    ### `is_vote`, bool

Whether this is a vote transaction.

    ### `transaction`, Transaction

Full transaction data (message + signatures).

    ### `meta`, TransactionStatusMeta

Execution metadata (logs, balances, etc.).

    ### `index`, uint64

Transaction index within the block.

### `slot`, uint64

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:

### `slot`, uint64

Slot containing the transaction.

### `signature`, bytes

Transaction signature.

### `is_vote`, bool

Whether this is a vote transaction.

### `index`, uint64

Transaction index within the block.

### `err`, TransactionError

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

### `filter_by_commitment`, boolean

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

### `interslot_updates`, 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;
}
```

| Status | Value | Description |
|---|---|---|
| `SLOT_PROCESSED` | 0 | Slot processed by the node |
| `SLOT_CONFIRMED` | 1 | Slot confirmed by supermajority |
| `SLOT_FINALIZED` | 2 | Slot finalized |
| `SLOT_FIRST_SHRED_RECEIVED` | 3 | First shred of slot received |
| `SLOT_COMPLETED` | 4 | All shreds received for slot |
| `SLOT_CREATED_BANK` | 5 | Bank created for slot |
| `SLOT_DEAD` | 6 | Slot is dead (will not be confirmed) |

## Slot Update Message

### `slot`, uint64

The slot number.

### `parent`, uint64

Parent slot number (optional).

### `status`, SlotStatus

Current status of the slot.

### `dead_error`, string

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

### `account_include`, array of strings

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

### `include_transactions`, boolean

Include all transactions in block updates.

### `include_accounts`, boolean

Include all account updates in block updates.

### `include_entries`, 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)

### `slot`, uint64

Block slot number.

### `blockhash`, string

Block hash.

### `rewards`, Rewards

Block rewards.

### `block_time`, UnixTimestamp

Block timestamp.

### `block_height`, BlockHeight

Block height.

### `parent_slot`, uint64

Parent slot number.

### `parent_blockhash`, string

Parent block hash.

### `executed_transaction_count`, uint64

Number of transactions executed.

### `transactions`, array

Array of `SubscribeUpdateTransactionInfo` (if included).

### `updated_account_count`, uint64

Number of accounts updated.

### `accounts`, array

Array of `SubscribeUpdateAccountInfo` (if included).

### `entries_count`, uint64

Number of entries.

### `entries`, array

Array of `SubscribeUpdateEntry` (if included).

### SubscribeUpdateBlockMeta (Lightweight)

### `slot`, uint64

Block slot number.

### `blockhash`, string

Block hash.

### `rewards`, Rewards

Block rewards.

### `block_time`, UnixTimestamp

Block timestamp.

### `block_height`, BlockHeight

Block height.

### `parent_slot`, uint64

Parent slot number.

### `parent_blockhash`, string

Parent block hash.

### `executed_transaction_count`, uint64

Number of transactions executed.

### `entries_count`, uint64

Number of entries.

> Note: Block reconstruction is based on `BlockMeta`. Blocks generated on validators may always have zero entries due to a [known Solana issue](https://github.com/solana-labs/solana/issues/33823).

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

### `slot`, uint64

Slot containing the entry.

### `index`, uint64

Entry index within the slot.

### `num_hashes`, uint64

Number of hashes since the previous entry.

### `hash`, bytes

Entry hash (SHA-256).

### `executed_transaction_count`, uint64

Number of transactions in this entry.

### `starting_transaction_index`, uint64

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. NoLimitNodes does not list this method as a supported production feature.

> Warning: 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

### `deshred_transactions`

">
  Named deshred transaction subscription filters.

### `ping`, SubscribeRequestPing

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

## SubscribeRequestFilterDeshredTransactions

### `vote`, boolean

Include vote transactions.

### `account_include`, array of strings

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

### `account_exclude`, array of strings

Exclude transactions that use any account from this list.

### `account_required`, array of strings, required

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

## SubscribeUpdateDeshred

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

### `filters`, array

Names of the filters that matched this update.

### `update_oneof`, oneof

### Update types

Pre-execution transaction data.

    ### `ping`, SubscribeUpdatePing

Server ping.

    ### `pong`, SubscribeUpdatePong

Pong response to client ping.

### `created_at`, Timestamp

Server-side timestamp when the update was created.

## SubscribeUpdateDeshredTransaction

### `transaction`, SubscribeUpdateDeshredTransactionInfo

### properties

Transaction signature.

    ### `is_vote`, bool

Whether this is a vote transaction.

    ### `transaction`, Transaction

Transaction data (message and signatures).

    ### `loaded_writable_addresses`, array of bytes

Dynamically loaded writable addresses from address lookup tables.

    ### `loaded_readonly_addresses`, array of bytes

Dynamically loaded readonly addresses from address lookup tables.

### `slot`, uint64

Slot in which the transaction was received.

## SubscribeUpdateDeshredTransactionInfo

### `signature`, bytes

Transaction signature.

### `is_vote`, bool

Whether this is a vote transaction.

### `transaction`, Transaction

Transaction data (message and signatures).

### `loaded_writable_addresses`, array of bytes

Dynamically loaded writable addresses from address lookup tables.

### `loaded_readonly_addresses`, array of bytes

Dynamically loaded readonly addresses from address lookup tables.

> Warning: 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: [],
    },
  },
});
```
