All packages

solana_common

StreamingFast
v0.5.1/18 downloads

Package ref

solana-common@v0.5.1

Run package

CLI

Run transactions_by_programid from the command line.

substreams run solana-common@v0.5.1 transactions_by_programid -e solana-mainnet --start-block -1
Authenticate by running substreams auth or directly on thegraph.market (see docs).

README

Solana Common Modules

The Solana Common Modules Substreams contains a set of modules that allow you to easily retrieve basic information from the Solana blockchain, such as transactions or instructions.

The substreams.yaml file defines all the different modules available, and also provides you with documentation about the usage of every module.

Using this module to speed up a substreams

Using the full "solana block" object (simplest if changing an existing substreams)

In your substreams.yaml,

  1. Import this .spkg:
imports:
  sol: https://spkg.io/streamingfast/solana-common-v0.5.1.spkg
  1. Add block filtering to your "entry modules" (any module reading blocks or transactions before emitting your custom types):

If you know the instruction program ID of all transactions that you want, use the program_ids index like this:

    blockFilter:
      module: sol:program_ids
      query:
        string: "program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy || program:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD"

If you also need to get transactions based on the instruction's accounts, use the (bigger) index like this:

    blockFilter:
      module: sol:program_ids_and_accounts
      query:
        string: "program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy || account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD"

Using the new 'transactions' object (simplest if writing a new substreams)

In your substreams.yaml,

  1. Import this .spkg:
imports:
  sol: https://spkg.io/streamingfast/solana-common-v0.5.1.spkg
  1. Set one of transactions_by_programid or transactions_by_programid_and_account (along with source: sf.substreams.v1.Clock if you need slot number/ID/timestamp) as your module input, ex:
  - name: my_cool_module
    kind: map
    inputs:
      - source: sf.substreams.v1.Clock
      - map: sol:transactions_by_programid
  1. Set the "block filter string" on the sol:transactions_by_programid or transactions_by_programid_and_account module to match the data that you want to be fed to your module:
params:
  sol:transactions_by_programid: "program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy"
  sol:transactions_by_programid_and_account: "program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy || (account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD && program:FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH)"
  1. Run substreams build. With buffa in your Cargo.toml dependencies, it generates the Rust bindings for these types, so you do not need to write a buf.gen.yaml yourself.

Modules

program_ids (index)

  • This module is an index that allows you to efficiently retrieve instructions based on the program ID. Example keys: program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy

Use it to only get blocks that contain instructions matching the programID/accounts that you need, ex:

  - name: my_module
    ...
    blockFilter:
      module: program_ids
      query:
        string: (program:4vMsoUT2BWatFweudnQM1xedRLfJgJ7hswhcpz4xgBTy || program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)

program_ids_and_accounts (index)

  • This module is an index that allows you to efficiently retrieve instructions based on the program ID and/or accounts. Example keys: account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD, program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Use it to only get blocks that contain instructions matching the programID/accounts that you need, ex:

  - name: my_module
    ...
    blockFilter:
      module: program_ids_and_accounts
      query:
        string: (account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD && program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA)

transactions_by_programid (map)

transactions_by_programid_and_account (map)

  • This modules uses the program_ids_and_accounts index to only process blocks that contain matching instructions.
  • Furthermore, it filters out all the transactions that do not contain a matching instruction, so your module can be run only on data that is meaningful to you.
  • Set the query string by using params (ref: https://substreams.streamingfast.io/documentation/develop/parameterized-modules)

What's new

v0.5.1

  • Removed blocks_without_votes: read sf.solana.type.v1.Block directly with source: instead of map: sol:blocks_without_votes
  • Module names dropped the _without_votes suffix, for example transactions_by_programid_without_votes is now transactions_by_programid
  • Built on substreams 0.8 and substreams-solana 0.16
  • Requires reprocessing all blocks, every module hash changed

Modules

Execution graph

4 modules
mapMain

transactions_by_programid

`transactions_by_programid` emits the transactions that contain an instruction matching the query, and skips blocks with none through the `program_ids` index. Set the query in params, for example: * program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Output

sf.substreams.solana.v1.Transactions

blockIndex

program_ids

`program_ids` creates a _cache_ to efficiently retrieve instructions based on the program ID. For example, the following sets keys for the Token program: * program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA

Output

sf.substreams.index.v1.Keys

blockIndex

program_ids_and_accounts

`program_ids_and_accounts` creates a _cache_ to efficiently retrieve instructions based on the program ID and the accounts they use. For example, the following sets keys for the Token program and one account: * program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA * account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD

Output

sf.substreams.index.v1.Keys

map

transactions_by_programid_and_account

`transactions_by_programid_and_account` emits the transactions that contain an instruction matching the query, and skips blocks with none through the `program_ids_and_accounts` index. Set the query in params, for example: * program:TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA && account:Gnt27xtC473ZT2Mw5u8wZ68Z3gULkSTb5DuxJy7eJotD

Output

sf.substreams.solana.v1.Transactions