solana_transaction/
simple_vote_transaction_checker.rs

1use {
2    crate::versioned::sanitized::SanitizedVersionedTransaction, solana_address::Address,
3    solana_message::VersionedMessage, solana_signature::Signature,
4};
5
6/// Simple vote transaction meets these conditions:
7/// 1. has 1 or 2 signatures;
8/// 2. is legacy message;
9/// 3. has only one instruction;
10/// 4. which must be Vote instruction;
11pub fn is_simple_vote_transaction(
12    sanitized_versioned_transaction: &SanitizedVersionedTransaction,
13) -> bool {
14    let is_legacy_message = matches!(
15        sanitized_versioned_transaction.message.message,
16        VersionedMessage::Legacy(_)
17    );
18    let instruction_programs = sanitized_versioned_transaction
19        .message
20        .program_instructions_iter()
21        .map(|(program_id, _ix)| program_id);
22
23    is_simple_vote_transaction_impl(
24        &sanitized_versioned_transaction.signatures,
25        is_legacy_message,
26        instruction_programs,
27    )
28}
29
30/// Simple vote transaction meets these conditions:
31/// 1. has 1 or 2 signatures;
32/// 2. is legacy message;
33/// 3. has only one instruction;
34/// 4. which must be Vote instruction;
35#[inline]
36pub fn is_simple_vote_transaction_impl<'a>(
37    signatures: &[Signature],
38    is_legacy_message: bool,
39    mut instruction_programs: impl Iterator<Item = &'a Address>,
40) -> bool {
41    signatures.len() < 3
42        && is_legacy_message
43        && instruction_programs
44            .next()
45            .xor(instruction_programs.next())
46            .map(|program_id| program_id == &solana_sdk_ids::vote::ID)
47            .unwrap_or(false)
48}