use crate::models::analysis::TxAnalysis;
use crate::models::message::Message;
use crate::models::pubkey_base58::PubkeyBase58;
use crate::ToolError;
pub trait ExtensionAction: Send + Sync {
fn protocol_name(&self) -> &'static str;
fn description(&self) -> String;
}
pub trait ProtocolAnalyzer: Send + Sync {
fn name(&self) -> &'static str;
fn supported_programs(&self) -> Result<&'static [PubkeyBase58], ToolError>;
fn program_description(&self, _program_id: &PubkeyBase58) -> Option<&'static str> {
None
}
fn detect(&self, message: &Message) -> bool {
let supported = match self.supported_programs() {
Ok(programs) => programs,
Err(_) => return false, };
message.instructions().iter().any(|instr| {
if let Some(pk) = message.account_keys().get(instr.program_id_index as usize) {
supported.contains(pk)
} else {
false
}
})
}
fn detect_in_accounts(&self, message: &Message) -> bool {
let supported = match self.supported_programs() {
Ok(programs) => programs,
Err(_) => return false,
};
message.account_keys().iter().any(|pk| supported.contains(pk))
}
fn analyze(
&self,
message: &Message,
account_list: &[PubkeyBase58],
signer: &PubkeyBase58,
analysis: &mut TxAnalysis,
);
fn enrich_notice(&self, analysis: &mut TxAnalysis);
}