solana_runtime/
vote_transaction.rs

1use {
2    solana_sdk::{
3        clock::{Slot, UnixTimestamp},
4        hash::Hash,
5    },
6    solana_vote_program::vote_state::{Vote, VoteStateUpdate},
7};
8
9#[derive(Debug, PartialEq, Eq)]
10pub enum VoteTransaction {
11    Vote(Vote),
12    VoteStateUpdate(VoteStateUpdate),
13}
14
15impl VoteTransaction {
16    pub fn slots(&self) -> Vec<Slot> {
17        match self {
18            VoteTransaction::Vote(vote) => vote.slots.clone(),
19            VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update
20                .lockouts
21                .iter()
22                .map(|lockout| lockout.slot)
23                .collect(),
24        }
25    }
26
27    pub fn is_empty(&self) -> bool {
28        match self {
29            VoteTransaction::Vote(vote) => vote.slots.is_empty(),
30            VoteTransaction::VoteStateUpdate(vote_state_update) => {
31                vote_state_update.lockouts.is_empty()
32            }
33        }
34    }
35
36    pub fn hash(&self) -> Hash {
37        match self {
38            VoteTransaction::Vote(vote) => vote.hash,
39            VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update.hash,
40        }
41    }
42
43    pub fn timestamp(&self) -> Option<UnixTimestamp> {
44        match self {
45            VoteTransaction::Vote(vote) => vote.timestamp,
46            VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update.timestamp,
47        }
48    }
49
50    pub fn last_voted_slot(&self) -> Option<Slot> {
51        match self {
52            VoteTransaction::Vote(vote) => vote.slots.last().copied(),
53            VoteTransaction::VoteStateUpdate(vote_state_update) => {
54                Some(vote_state_update.lockouts.back()?.slot)
55            }
56        }
57    }
58
59    pub fn last_voted_slot_hash(&self) -> Option<(Slot, Hash)> {
60        Some((self.last_voted_slot()?, self.hash()))
61    }
62}
63
64impl From<Vote> for VoteTransaction {
65    fn from(vote: Vote) -> Self {
66        VoteTransaction::Vote(vote)
67    }
68}
69
70impl From<VoteStateUpdate> for VoteTransaction {
71    fn from(vote_state_update: VoteStateUpdate) -> Self {
72        VoteTransaction::VoteStateUpdate(vote_state_update)
73    }
74}