solana_runtime/
vote_transaction.rs1use {
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}