Skip to main content

setFields(options)

Set the fields to be retrieved for data items of each supported type. The options object has the following structure:
Every field selector is a collection of boolean fields, typically mapping one-to-one to the fields of data items within the batch context iterables. Defining a field of a field selector of a given type and setting it to true will cause the processor to populate the corresponding field of all data items of that type. Here is a definition of a data source that requests signatures and err fields for transactions and the data field for instructions:
There are no default optional fields: apart from a small set of always-present fields (listed per item type below), a field that is not requested with setFields() will not be fetched and will be absent from the TypeScript types. Request every field your batch handler reads.
Same fields will be available for all data items of any given type, including the items accessed via nested references. Suppose we used the data source defined above to subscribe to some transactions as well as some instructions, and for each instruction we requested a parent transaction:
After populating the convenience reference fields with augmentBlock() from @subsquid/solana-objects, signatures and err fields would be available both within the transaction items of the transactions iterable of block data and within the transaction items that provide parent transaction information for the instructions matching the addInstruction() data request:
Fields that were not requested are missing from the data and from the item types, so reading them fails to compile:
Requesting only the fields you need improves sync performance, as unrequested fields are not fetched from the SQD Portal.

Data item types and field selectors

Most IDEs support smart suggestions to show the possible field selectors. For VS Code, press Ctrl+Space.
All addresses and pubkeys are represented as base58-encoded strings.
Here we describe the data item types as functions of the field selectors. Unless otherwise mentioned, each data item type field maps to the eponymous field of its corresponding field selector. Item fields are divided into two categories:
  • Fields that are always present regardless of the setFields() call.
  • Fields that must be requested with setFields().

Instruction

Instruction data items may have the following fields:
Here, instruction address is an array of tree indices addressing the instruction in the call tree:
  • Top level instructions get addresses [0], [1], …, [N-1], where N is the number of top level instructions in the transaction.
  • An address of length 2 indicates an inner instruction directly called by one of the top level instructions. For example, [3, 0] is the first inner instruction called by the fourth top level instruction.
  • Addresses of length 3 or more indicate inner instructions invoked by other inner instructions.

Transaction

Transaction data items may have the following fields:

LogMessage

LogMessage data items may have the following fields:

Balance

Balance data items may have the following fields:
Each Balance item describes a single account: pre is the account’s SOL balance before the transaction and post is its balance after it.

TokenBalance

Field selection for token balances data items is more nuanced, as depending on the subtype of the token balance some fields may be undefined. PostTokenBalance and PreTokenBalance both represent token balances, however PreTokenBalance will have postProgramId, postMint, postDecimals, postOwner and postAmount as undefined. PostTokenBalance will have preProgramId, preMint, preDecimals, preOwner and preAmount as undefined. TokenBalance data items may have the following fields:

Reward

Reward data items may have the following fields:

Block header

BlockHeader data items may have the following fields:
slot and parentSlot are not field names: use number for the Solana slot (also in setBlockRange() values) and parentNumber for the parent slot.
@subsquid/[email protected] accepts height in the TypeScript field selection, but the Portal source does not return it.
The stream converts Portal’s raw Solana block time from seconds to milliseconds. Pass timestamp directly to new Date(timestamp) without multiplying it by 1000.

A complete example