Skip to content

Commit

Permalink
add filter that returns an error for the rpc is the filter is malform…
Browse files Browse the repository at this point in the history
…ed (#9)
jeffhelius authored Jan 2, 2025
1 parent 8703803 commit 9741a17
Showing 1 changed file with 27 additions and 26 deletions.
53 changes: 27 additions & 26 deletions rpc/src/rpc.rs
Original file line number Diff line number Diff line change
@@ -500,17 +500,18 @@ impl JsonRpcRequestProcessor {
min_context_slot,
})?;
let encoding = encoding.unwrap_or(UiAccountEncoding::Binary);

optimize_filters(&mut filters);
let keyed_accounts = {
if let Some(owner) = get_spl_token_owner_filter(program_id, &filters) {
if let Some(owner) = get_spl_token_owner_filter(program_id, &filters)? {
self.get_filtered_spl_token_accounts_by_owner(
&bank,
program_id,
&owner,
filters,
sort_results,
)?
} else if let Some(mint) = get_spl_token_mint_filter(program_id, &filters) {
} else if let Some(mint) = get_spl_token_mint_filter(program_id, &filters)? {
self.get_filtered_spl_token_accounts_by_mint(
&bank,
program_id,
@@ -2398,14 +2399,16 @@ fn encode_account<T: ReadableAccount>(
/// owner.
/// NOTE: `optimize_filters()` should almost always be called before using this method because of
/// the requirement that `Memcmp::raw_bytes_as_ref().is_some()`.
fn get_spl_token_owner_filter(program_id: &Pubkey, filters: &[RpcFilterType]) -> Option<Pubkey> {
fn get_spl_token_owner_filter(
program_id: &Pubkey,
filters: &[RpcFilterType],
) -> Result<Option<Pubkey>> {
if !is_known_spl_token_id(program_id) {
return None;
return Ok(None);
}
let mut data_size_filter: Option<u64> = None;
let mut memcmp_filter: Option<&[u8]> = None;
let mut owner_key: Option<Pubkey> = None;
let mut incorrect_owner_len: Option<usize> = None;
let mut token_account_state_filter = false;
let account_packed_len = TokenAccount::get_packed_len();
for filter in filters {
@@ -2420,7 +2423,11 @@ fn get_spl_token_owner_filter(program_id: &Pubkey, filters: &[RpcFilterType]) ->
if bytes.len() == PUBKEY_BYTES {
owner_key = Pubkey::try_from(bytes).ok();
} else {
incorrect_owner_len = Some(bytes.len());
return Err(Error::invalid_params(format!(
"Incorrect byte length {} for SPL token owner filter, expected {}",
bytes.len(),
PUBKEY_BYTES
)));
}
}
}
@@ -2432,31 +2439,27 @@ fn get_spl_token_owner_filter(program_id: &Pubkey, filters: &[RpcFilterType]) ->
|| memcmp_filter == Some(&[ACCOUNTTYPE_ACCOUNT])
|| token_account_state_filter
{
if let Some(incorrect_owner_len) = incorrect_owner_len {
info!(
"Incorrect num bytes ({:?}) provided for spl_token_owner_filter",
incorrect_owner_len
);
}
owner_key
Ok(owner_key)
} else {
debug!("spl_token program filters do not match by-owner index requisites");
None
Ok(None)
}
}

/// Analyze custom filters to determine if the result will be a subset of spl-token accounts by
/// mint.
/// NOTE: `optimize_filters()` should almost always be called before using this method because of
/// the requirement that `Memcmp::raw_bytes_as_ref().is_some()`.
fn get_spl_token_mint_filter(program_id: &Pubkey, filters: &[RpcFilterType]) -> Option<Pubkey> {
fn get_spl_token_mint_filter(
program_id: &Pubkey,
filters: &[RpcFilterType],
) -> Result<Option<Pubkey>> {
if !is_known_spl_token_id(program_id) {
return None;
return Ok(None);
}
let mut data_size_filter: Option<u64> = None;
let mut memcmp_filter: Option<&[u8]> = None;
let mut mint: Option<Pubkey> = None;
let mut incorrect_mint_len: Option<usize> = None;
let mut token_account_state_filter = false;
let account_packed_len = TokenAccount::get_packed_len();
for filter in filters {
@@ -2471,7 +2474,11 @@ fn get_spl_token_mint_filter(program_id: &Pubkey, filters: &[RpcFilterType]) ->
if bytes.len() == PUBKEY_BYTES {
mint = Pubkey::try_from(bytes).ok();
} else {
incorrect_mint_len = Some(bytes.len());
return Err(Error::invalid_params(format!(
"Incorrect byte length {} for SPL token mint filter, expected {}",
bytes.len(),
PUBKEY_BYTES
)));
}
}
}
@@ -2483,16 +2490,10 @@ fn get_spl_token_mint_filter(program_id: &Pubkey, filters: &[RpcFilterType]) ->
|| memcmp_filter == Some(&[ACCOUNTTYPE_ACCOUNT])
|| token_account_state_filter
{
if let Some(incorrect_mint_len) = incorrect_mint_len {
info!(
"Incorrect num bytes ({:?}) provided for spl_token_mint_filter",
incorrect_mint_len
);
}
mint
Ok(mint)
} else {
debug!("spl_token program filters do not match by-mint index requisites");
None
Ok(None)
}
}

0 comments on commit 9741a17

Please sign in to comment.