StreamAccountUpdatesRequest
StreamAccountUpdatesRequest subscribes to account delta events.
Filter expressions support the following params:
-
params.min_slot (uint64): Minimum slot for filtering updates Example: account_update.slot >= params.min_slot
-
params.min_balance (uint64): Minimum balance for filtering Example: snapshot.meta.balance >= params.min_balance
-
params.owner (bytes|Pubkey): Owner pubkey for filtering Examples: snapshot.meta.owner.value == params.owner account_update.meta.owner.value == params.owner
-
params.address (bytes|Pubkey): Account address for filtering Example: account_address.value == params.address Note: Use account_address for unified filtering across both snapshot and update messages
-
params.addresses (BytesList): List of addresses for multi-account filtering Example: account_address.value in params.addresses Note: Use the ‘in’ operator to filter by multiple addresses in a single subscription
-
params.min_nonce (uint64): Minimum nonce for filtering Example: snapshot.meta.nonce >= params.min_nonce
-
params.min_seq (uint64): Minimum sequence number for filtering Example: snapshot.meta.seq >= params.min_seq
-
params.min_data_size (uint32): Minimum data size for filtering Example: snapshot.meta.data_size >= params.min_data_size
Available snapshot fields (thru.core.v1.Account): snapshot.address, snapshot.address.value (bytes), snapshot.meta.balance (uint64), snapshot.meta.seq (uint64), snapshot.meta.nonce (uint64), snapshot.meta.data_size (uint32), snapshot.meta.version (uint32), snapshot.meta.flags (AccountFlags), snapshot.meta.flags.is_program (bool), snapshot.meta.flags.is_privileged (bool), snapshot.meta.flags.is_uncompressable (bool), snapshot.meta.flags.is_ephemeral (bool), snapshot.meta.flags.is_deleted (bool), snapshot.meta.flags.is_new (bool), snapshot.meta.flags.is_compressed (bool), snapshot.meta.owner, snapshot.meta.owner.value (bytes)
Available account_update fields (AccountUpdate): account_update.slot (uint64), account_update.delete (bool), account_update.meta.balance (uint64), account_update.meta.seq (uint64), account_update.meta.nonce (uint64), account_update.meta.data_size (uint32), account_update.meta.version (uint32), account_update.meta.flags (AccountFlags), account_update.meta.flags.is_program (bool), account_update.meta.flags.is_privileged (bool), account_update.meta.flags.is_uncompressable (bool), account_update.meta.flags.is_ephemeral (bool), account_update.meta.flags.is_deleted (bool), account_update.meta.flags.is_new (bool), account_update.meta.flags.is_compressed (bool), account_update.meta.owner, account_update.meta.owner.value (bytes)
Available unified fields (work for both snapshot and update messages): account_address, account_address.value (bytes) - extracted from whichever message type is present
Filter expression examples:
-
Filter by minimum balance (snapshot or update): Expression: “(has(snapshot.meta) && snapshot.meta.balance >= uint(1000000)) || (has(account_update.meta) && account_update.meta.balance >= uint(1000000))”
-
Filter by account owner using params: Expression: “(has(snapshot.meta) && has(snapshot.meta.owner) && snapshot.meta.owner.value == params.owner) || (has(account_update.meta) && has(account_update.meta.owner) && account_update.meta.owner.value == params.owner)” Params: {“owner”: <32-byte pubkey>}
-
Filter by specific account address (works for both snapshot and update messages): Expression: “account_address.value == params.address” Params: {“address”: <32-byte pubkey>}
-
Filter by minimum slot for updates: Expression: “has(account_update.meta) && account_update.slot >= params.min_slot” Params: {“min_slot”: 1000}
-
Filter by nonce greater than value: Expression: “(has(snapshot.meta) && snapshot.meta.nonce >= uint(5)) || (has(account_update.meta) && account_update.meta.nonce >= uint(5))”
-
Filter by sequence number: Expression: “(has(snapshot.meta) && snapshot.meta.seq >= uint(100)) || (has(account_update.meta) && account_update.meta.seq >= uint(100))”
-
Filter by data size: Expression: “(has(snapshot.meta) && snapshot.meta.data_size >= uint(1024)) || (has(account_update.meta) && account_update.meta.data_size >= uint(1024))”
-
Filter by account version: Expression: “(has(snapshot.meta) && snapshot.meta.version >= uint(1)) || (has(account_update.meta) && account_update.meta.version >= uint(1))”
-
Filter by account flags (check if account is a program): Expression: “(has(snapshot.meta) && has(snapshot.meta.flags) && snapshot.meta.flags.is_program) || (has(account_update.meta) && has(account_update.meta.flags) && account_update.meta.flags.is_program)”
-
Filter by privileged flag: Expression: “(has(snapshot.meta) && has(snapshot.meta.flags) && snapshot.meta.flags.is_privileged) || (has(account_update.meta) && has(account_update.meta.flags) && account_update.meta.flags.is_privileged)”
-
Filter non-delete updates: Expression: “has(snapshot.meta) || (has(account_update.meta) && (!has(account_update.delete) || !account_update.delete))”
-
Check for snapshot or update presence: Expression: “has(snapshot.meta) || has(account_update.meta)”
-
Combined filters (multiple conditions): Expression: “has(snapshot.meta) || (has(account_update.meta) && account_update.slot >= params.min_slot && account_update.meta.balance >= params.min_balance)” Params: {“min_slot”: 1000, “min_balance”: 1000000}
-
Filter by minimum balance using params: Expression: “(has(snapshot.meta) && snapshot.meta.balance >= params.min_balance) || (has(account_update.meta) && account_update.meta.balance >= params.min_balance)” Params: {“min_balance”: 5000000000}
Note: The response contains either a snapshot (initial state), an update (delta), or a BlockFinished message. Filters should handle both snapshot and update cases using OR logic to match either message type.
To filter by specific account address (recommended - works for both message types): Expression: “account_address.value == params.address” Params: {“address”: <32-byte pubkey>}
To filter by owner (program): Expression: “(has(snapshot.meta.owner) && snapshot.meta.owner.value == params.owner) || (has(account_update.meta.owner) && account_update.meta.owner.value == params.owner)” Params: {“owner”: <32-byte program pubkey>}
To filter by multiple account addresses (recommended for multi-account subscriptions): Expression: “account_address.value in params.addresses” Params: {“addresses”: BytesList{values: [<pubkey1>, <pubkey2>, …]}} Note: Use BytesList parameter type with the ‘in’ operator for efficient multi-address filtering
Package: thru.services.v1
Fields
Section titled “Fields”| Field | Type | # | Description |
|---|---|---|---|
view | thru.core.v1.AccountView | 2 · optional | |
filter | thru.common.v1.Filter | 4 · optional |