Yellowstone gRPC
Account Subscriptions
Monitor changes to Solana accounts in real-time. Track token balances, program state changes, and any on-chain data stored in accounts.
Unsupported Field
We don't support the
txn_signature field in account subscriptions. It will always return empty. Filter Fields
accountrepeated stringFilter by specific account public keys
ownerrepeated stringFilter by account owner (program ID). Monitors all accounts owned by a program.
memcmpMemcmpFilterMatch byte patterns at specific offsets in account data. Supports bytes, base58, and base64 encoding.
datasizeuint64Filter accounts by their data size in bytes
token_account_stateboolFilter only for SPL token accounts
lamportsLamportsFilterFilter by lamport balance using comparison operators: eq, ne, lt, gt
nonempty_txn_signatureoptional boolOnly receive updates associated with a transaction
Filter Definition
Request Filter
Protobufmessage SubscribeRequestFilterAccounts {
repeated string account = 2;
repeated string owner = 3;
repeated SubscribeRequestFilterAccountsFilter filters = 4;
optional bool nonempty_txn_signature = 5;
}
message SubscribeRequestFilterAccountsFilter {
oneof filter {
SubscribeRequestFilterAccountsFilterMemcmp memcmp = 1;
uint64 datasize = 2;
bool token_account_state = 3;
SubscribeRequestFilterAccountsFilterLamports lamports = 4;
}
}Response Structure
Response
Protobufmessage SubscribeUpdateAccount {
SubscribeUpdateAccountInfo account = 1;
uint64 slot = 2;
bool is_startup = 3;
}
message SubscribeUpdateAccountInfo {
bytes pubkey = 1;
uint64 lamports = 2;
bytes owner = 3;
bool executable = 4;
uint64 rent_epoch = 5;
bytes data = 6;
uint64 write_version = 7;
optional bytes txn_signature = 8; // Not supported -- will return empty
}Example
Stream token accounts for a specific mint
RustSubscribeRequest {
accounts: HashMap::from([(
"token_accounts_by_mint".to_string(),
SubscribeRequestFilterAccounts {
filters: vec![
// Filter for SPL token accounts
SubscribeRequestFilterAccountsFilter {
filter: Some(Filter::TokenAccountState(true)),
},
// Match specific mint at offset 0
SubscribeRequestFilterAccountsFilter {
filter: Some(Filter::Memcmp(
SubscribeRequestFilterAccountsFilterMemcmp {
offset: 0,
data: Some(Data::Base58(
"<MINT_ADDRESS>".to_string(),
)),
}
)),
},
],
..Default::default()
},
)]),
commitment: Some(CommitmentLevel::Confirmed as i32),
..Default::default()
}