From dc5f6d3e158093f53e102a47eab0c2402f7264ea Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 10 Feb 2021 02:03:48 +0000 Subject: [PATCH] Use spl-token-mint secondary index for relevant getProgramAccounts requests (#15219) (#15223) (cherry picked from commit 948819dfa8b08afaf9b3c930001113f6720918d6) Co-authored-by: Tyera Eulberg --- core/src/rpc.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/src/rpc.rs b/core/src/rpc.rs index b6f29a6e98..2c40c8e2c9 100644 --- a/core/src/rpc.rs +++ b/core/src/rpc.rs @@ -326,6 +326,8 @@ impl JsonRpcRequestProcessor { let keyed_accounts = { if let Some(owner) = get_spl_token_owner_filter(program_id, &filters) { self.get_filtered_spl_token_accounts_by_owner(&bank, &owner, filters) + } else if let Some(mint) = get_spl_token_mint_filter(program_id, &filters) { + self.get_filtered_spl_token_accounts_by_mint(&bank, &mint, filters) } else { self.get_filtered_program_accounts(&bank, program_id, filters) } @@ -1575,6 +1577,34 @@ fn get_spl_token_owner_filter(program_id: &Pubkey, filters: &[RpcFilterType]) -> } } +fn get_spl_token_mint_filter(program_id: &Pubkey, filters: &[RpcFilterType]) -> Option { + if program_id != &spl_token_id_v2_0() { + return None; + } + let mut data_size_filter: Option = None; + let mut mint: Option = None; + for filter in filters { + match filter { + RpcFilterType::DataSize(size) => data_size_filter = Some(*size), + RpcFilterType::Memcmp(Memcmp { + offset: SPL_TOKEN_ACCOUNT_MINT_OFFSET, + bytes: MemcmpEncodedBytes::Binary(bytes), + .. + }) => { + if let Ok(key) = Pubkey::from_str(bytes) { + mint = Some(key) + } + } + _ => {} + } + } + if data_size_filter == Some(TokenAccount::get_packed_len() as u64) { + mint + } else { + None + } +} + pub(crate) fn get_parsed_token_account( bank: Arc, pubkey: &Pubkey,