// file: khbb_lib/src/program_registry.rs //! Registry of known Solana programs used for early domain classification. /// Known Solana program family. #[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub enum KhbbKnownProgram { /// SPL Token program. SplToken, /// SPL Token-2022 program. SplToken2022, /// System program. System, /// Compute budget program. ComputeBudget, /// Associated token account program. AssociatedTokenAccount, } /// Returns the known program classification for a given program id. pub(crate) fn classify_known_program_id( program_id: &str, ) -> std::option::Option { let parse_result = program_id.parse::(); let pubkey = match parse_result { Ok(value) => value, Err(_) => { return None; } }; if pubkey == crate::SPL_TOKEN_PROGRAM_ID { return Some(KhbbKnownProgram::SplToken); } if pubkey == crate::SPL_TOKEN_2022_PROGRAM_ID { return Some(KhbbKnownProgram::SplToken2022); } if pubkey == crate::SYSTEM_PROGRAM_ID { return Some(KhbbKnownProgram::System); } if pubkey == crate::COMPUTE_BUDGET_PROGRAM_ID { return Some(KhbbKnownProgram::ComputeBudget); } if pubkey == crate::ASSOCIATED_TOKEN_PROGRAM_ID { return Some(KhbbKnownProgram::AssociatedTokenAccount); } None } /// Detects known program mentions in a transaction log line. /// /// This is intentionally simple and string-based in the first version. pub(crate) fn classify_known_program_from_log_line( log_line: &str, ) -> std::option::Option { if log_line.contains("Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") { return Some(KhbbKnownProgram::SplToken); } if log_line.contains("Program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb") { return Some(KhbbKnownProgram::SplToken2022); } if log_line.contains("Program 11111111111111111111111111111111") { return Some(KhbbKnownProgram::System); } if log_line.contains("Program ComputeBudget111111111111111111111111111111") { return Some(KhbbKnownProgram::ComputeBudget); } if log_line.contains("Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL") { return Some(KhbbKnownProgram::AssociatedTokenAccount); } None } #[cfg(test)] mod tests { #[test] fn classify_known_program_id_detects_spl_token() { let result = super::classify_known_program_id("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); assert_eq!(result, Some(super::KhbbKnownProgram::SplToken)); } #[test] fn classify_known_program_from_log_line_detects_compute_budget() { let result = super::classify_known_program_from_log_line( "Program ComputeBudget111111111111111111111111111111 invoke [1]", ); assert_eq!(result, Some(super::KhbbKnownProgram::ComputeBudget)); } #[test] fn classify_known_program_from_log_line_returns_none_for_unknown_program() { let result = super::classify_known_program_from_log_line( "Program SomeUnknown111111111111111111111111111111 invoke [1]", ); assert!(result.is_none()); } }