use { solana_sdk::{ clock::{Slot, UnixTimestamp}, hash::Hash, }, solana_vote_program::vote_state::{Vote, VoteStateUpdate}, }; #[derive(Debug, PartialEq, Eq)] pub enum VoteTransaction { Vote(Vote), VoteStateUpdate(VoteStateUpdate), } impl VoteTransaction { pub fn slots(&self) -> Vec { match self { VoteTransaction::Vote(vote) => vote.slots.clone(), VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update .lockouts .iter() .map(|lockout| lockout.slot()) .collect(), } } pub fn is_empty(&self) -> bool { match self { VoteTransaction::Vote(vote) => vote.slots.is_empty(), VoteTransaction::VoteStateUpdate(vote_state_update) => { vote_state_update.lockouts.is_empty() } } } pub fn hash(&self) -> Hash { match self { VoteTransaction::Vote(vote) => vote.hash, VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update.hash, } } pub fn timestamp(&self) -> Option { match self { VoteTransaction::Vote(vote) => vote.timestamp, VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update.timestamp, } } pub fn last_voted_slot(&self) -> Option { match self { VoteTransaction::Vote(vote) => vote.slots.last().copied(), VoteTransaction::VoteStateUpdate(vote_state_update) => { Some(vote_state_update.lockouts.back()?.slot()) } } } pub fn last_voted_slot_hash(&self) -> Option<(Slot, Hash)> { Some((self.last_voted_slot()?, self.hash())) } } impl From for VoteTransaction { fn from(vote: Vote) -> Self { VoteTransaction::Vote(vote) } } impl From for VoteTransaction { fn from(vote_state_update: VoteStateUpdate) -> Self { VoteTransaction::VoteStateUpdate(vote_state_update) } }