Skip to content

ListTransactionsRequest

View as Markdown

ListTransactionsRequest lists executed transactions with CEL filtering and pagination.

Returns transactions ordered from most recent to older (slot DESC, block_offset DESC). Supports filtering on transaction metadata and execution results using CEL expressions.

Available fields for filtering:

  • transaction.slot (uint64): Block slot number where transaction was executed
  • transaction.block_offset (uint32): Transaction’s position within the block
  • transaction.signature.value (bytes): Transaction signature

Header fields (in-memory evaluation only, not SQL pushdown):

  • transaction.header.version (uint32): Transaction format version
  • transaction.header.fee (uint64): Transaction fee
  • transaction.header.nonce (uint64): Sender account nonce
  • transaction.header.start_slot (uint64): Earliest slot for execution
  • transaction.header.expiry_after (uint32): Expiry duration in slots
  • transaction.header.requested_compute_units (uint64): Requested compute units
  • transaction.header.requested_memory_units (uint32): Requested memory units
  • transaction.header.requested_state_units (uint32): Requested state units
  • transaction.header.fee_payer_pubkey.value (bytes): Fee payer public key
  • transaction.header.program_pubkey.value (bytes): Program public key
  • transaction.header.fee_payer_signature.value (bytes): Fee payer signature

Execution result fields:

  • transaction.execution_result.vm_error (TransactionVmError enum): VM error code (0 = success)
  • transaction.execution_result.user_error_code (uint64): User-defined error code
  • transaction.execution_result.execution_result (uint64): Alias for user_error_code
  • transaction.execution_result.consumed_compute_units (uint64): Compute units consumed
  • transaction.execution_result.consumed_memory_units (uint32): Memory units consumed
  • transaction.execution_result.consumed_state_units (uint32): State units consumed
  • transaction.execution_result.events_count (uint32): Number of events emitted
  • transaction.execution_result.events_size (uint32): Total size of events in bytes

Available CEL functions:

  • has(field): Check if optional field exists
  • uint(value): Convert to uint type
  • int(value): Convert to int type
  • string(value): Convert to string type
  • bytes(value): Convert to bytes type

Available filter parameters (accessible via params.* in expressions):

  • params.slot (uint64): Slot number for filtering
  • params.u64 (uint64): Generic uint64 parameter
  • params.pubkey (Pubkey): Public key parameter for filtering

Filter examples:

  1. Filter by slot range: filter.expression = “transaction.slot >= uint(1000) && transaction.slot <= uint(2000)”

  2. Filter by successful transactions (no error): filter.expression = “transaction.execution_result.user_error_code == uint(0)” filter.expression = “transaction.execution_result.vm_error == int(0)”

  3. Filter by specific VM error: filter.expression = “transaction.execution_result.vm_error == int(2)” // VM_REVERT filter.expression = “transaction.execution_result.vm_error == int(4)” // NONCE_TOO_LOW filter.expression = “transaction.execution_result.vm_error == int(5)” // NONCE_TOO_HIGH

  4. Filter by resource usage: filter.expression = “transaction.execution_result.consumed_compute_units > uint(1000)” filter.expression = “transaction.execution_result.consumed_memory_units > uint(0)” filter.expression = “transaction.execution_result.consumed_state_units >= uint(0)”

  5. Filter by compute units range: filter.expression = “transaction.execution_result.consumed_compute_units >= uint(0) && transaction.execution_result.consumed_compute_units < uint(1000000)”

  6. Filter by events count: filter.expression = “transaction.execution_result.events_count == uint(0)” // No events (transfers) filter.expression = “transaction.execution_result.events_count > uint(0)” // Has events filter.expression = “transaction.execution_result.events_count == uint(1)” // Exactly 1 event

  7. Filter by events size: filter.expression = “transaction.execution_result.events_size == uint(0)” // No events filter.expression = “transaction.execution_result.events_size > uint(0)” // Has events filter.expression = “transaction.execution_result.events_size >= uint(100)” // Large events filter.expression = “transaction.execution_result.events_size >= uint(50) && transaction.execution_result.events_size <= uint(200)”

  8. Filter by block offset: filter.expression = “transaction.block_offset >= uint(0)” filter.expression = “transaction.block_offset == uint(5)”

  9. Combine multiple conditions with AND: filter.expression = “transaction.execution_result.user_error_code == uint(0) && transaction.execution_result.consumed_compute_units > uint(0)”

  10. Combine multiple conditions with OR: filter.expression = “transaction.execution_result.user_error_code == uint(0) || transaction.execution_result.user_error_code != uint(0)” filter.expression = “transaction.execution_result.vm_error == int(2) || transaction.execution_result.vm_error == int(4)”

  11. Complex combined filters: filter.expression = “(transaction.slot >= uint(0) && transaction.execution_result.user_error_code == uint(0)) || transaction.execution_result.consumed_compute_units > uint(100000)”

  12. Check for field existence: filter.expression = “has(transaction.execution_result)”

  13. Use inequality operators: filter.expression = “transaction.execution_result.consumed_compute_units < uint(1000000)” filter.expression = “transaction.execution_result.consumed_compute_units <= uint(1000000)” filter.expression = “transaction.execution_result.consumed_compute_units >= uint(0)” filter.expression = “transaction.execution_result.user_error_code != uint(999)”

  14. Use params.slot parameter: filter.expression = “transaction.slot == params.slot” filter.params[“slot”].uint_value = 1234

  15. Use params.u64 with type conversion: filter.expression = “transaction.execution_result.consumed_compute_units < uint(params.u64)” filter.params[“u64”].uint_value = 1000000

The return_events flag controls whether event data is included in the response:

  • return_events = false (default): Only event counts/sizes are returned, not actual event data
  • return_events = true: Full event data is included in execution results

Note: All filters are pushed down to SQL for optimal performance where possible.

Package: thru.services.v1

FieldType#Description
filterthru.common.v1.Filter1 · optionalCEL filter expression (OPTIONAL). See message documentation for examples.
pagethru.common.v1.PageRequest2 · optional
return_eventsbool3 · optionalWhether to include event data in results (default: false)
version_contextthru.common.v1.VersionContext4 · optional
min_consensusthru.common.v1.ConsensusStatus5 · optional