This commit is contained in:
2026-04-18 22:11:09 +02:00
parent f011a4a7d3
commit ff5d3919e3
6 changed files with 455 additions and 32 deletions

View File

@@ -0,0 +1,82 @@
// 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<KhbbKnownProgram> {
match program_id {
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" => Some(KhbbKnownProgram::SplToken),
"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" => Some(KhbbKnownProgram::SplToken2022),
"11111111111111111111111111111111" => Some(KhbbKnownProgram::System),
"ComputeBudget111111111111111111111111111111" => Some(KhbbKnownProgram::ComputeBudget),
"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" => {
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<KhbbKnownProgram> {
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());
}
}