Program subscriptions now properly check results len and token program id (#12139) (#12140)

(cherry picked from commit 4431080066)

Co-authored-by: Tyera Eulberg <teulberg@gmail.com>
This commit is contained in:
mergify[bot]
2020-09-09 22:20:59 +00:00
committed by GitHub
parent a91a106319
commit fae90ff397

View File

@ -304,7 +304,7 @@ fn filter_signature_result(
fn filter_program_results( fn filter_program_results(
accounts: Vec<(Pubkey, Account)>, accounts: Vec<(Pubkey, Account)>,
_program_id: &Pubkey, program_id: &Pubkey,
last_notified_slot: Slot, last_notified_slot: Slot,
config: Option<ProgramConfig>, config: Option<ProgramConfig>,
bank: Option<Arc<Bank>>, bank: Option<Arc<Bank>>,
@ -312,15 +312,18 @@ fn filter_program_results(
let config = config.unwrap_or_default(); let config = config.unwrap_or_default();
let encoding = config.encoding.unwrap_or(UiAccountEncoding::Binary); let encoding = config.encoding.unwrap_or(UiAccountEncoding::Binary);
let filters = config.filters; let filters = config.filters;
let accounts_is_empty = accounts.is_empty();
let keyed_accounts = accounts.into_iter().filter(move |(_, account)| { let keyed_accounts = accounts.into_iter().filter(move |(_, account)| {
filters.iter().all(|filter_type| match filter_type { filters.iter().all(|filter_type| match filter_type {
RpcFilterType::DataSize(size) => account.data.len() as u64 == *size, RpcFilterType::DataSize(size) => account.data.len() as u64 == *size,
RpcFilterType::Memcmp(compare) => compare.bytes_match(&account.data), RpcFilterType::Memcmp(compare) => compare.bytes_match(&account.data),
}) })
}); });
let accounts: Box<dyn Iterator<Item = RpcKeyedAccount>> = let accounts: Box<dyn Iterator<Item = RpcKeyedAccount>> = if program_id == &spl_token_id_v2_0()
if encoding == UiAccountEncoding::JsonParsed { && encoding == UiAccountEncoding::JsonParsed
let bank = bank.unwrap(); // If !accounts.is_empty(), bank must be Some && !accounts_is_empty
{
let bank = bank.unwrap(); // If !accounts_is_empty, bank must be Some
Box::new(get_parsed_token_accounts(bank, keyed_accounts)) Box::new(get_parsed_token_accounts(bank, keyed_accounts))
} else { } else {
Box::new( Box::new(