solana_central/utilities/
is_legit_token.rs

1use crate::CentralContext;
2use crate::constants::SOLANA_PROGRAMS;
3use solana_sdk::pubkey::Pubkey;
4use std::sync::Arc;
5
6/// Check if a token is legitimate based on its Metaplex metadata
7///
8/// A token is considered legit if:
9/// 1. It has Metaplex metadata
10/// 2. The update authority matches a known legitimate launchpad (Raydium Launchpad or Pumpfun)
11///
12/// Results are cached in the central context for performance.
13pub fn is_legit_token(token_address: &Pubkey, central_context: &Arc<CentralContext>) -> bool {
14  let mut legit_tokens = central_context.legit_tokens.lock().unwrap();
15  if let Some(legit_token) = legit_tokens.get(token_address) {
16    return *legit_token;
17  }
18
19  // Derive metaplex pda for token
20  let (metaplex_pda, _) = Pubkey::find_program_address(
21    &[
22      b"metadata",
23      SOLANA_PROGRAMS.metaplex_program.as_ref(),
24      token_address.as_ref(),
25    ],
26    &SOLANA_PROGRAMS.metaplex_program,
27  );
28
29  // Get account data for metaplex pda
30  if let Ok(metaplex_pda_data) = central_context.json_rpc_client.get_account(&metaplex_pda) {
31    let metaplex_pda_data = metaplex_pda_data.data;
32    // Must have discriminator and update authority
33    if metaplex_pda_data.len() < 33 {
34      return false;
35    }
36    let update_authority = Pubkey::new_from_array(metaplex_pda_data[1..33].try_into().unwrap());
37    // Cache and return result
38    let legit = central_context
39      .legit_update_authorities
40      .contains(&update_authority);
41    legit_tokens.insert(*token_address, legit);
42    return legit;
43  }
44  /*
45  Unsuccessful request for metaplex data for this token address, means its definitely not legit as
46  all protocols store metadata in metaplex
47  */
48  false
49}