2022-01-19 18:39:21 -08:00
|
|
|
use {
|
|
|
|
solana_sdk::{
|
|
|
|
clock::{Slot, UnixTimestamp},
|
|
|
|
hash::Hash,
|
|
|
|
},
|
|
|
|
solana_vote_program::vote_state::{Vote, VoteStateUpdate},
|
|
|
|
};
|
|
|
|
|
2022-05-22 18:00:42 -07:00
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
2022-01-19 18:39:21 -08:00
|
|
|
pub enum VoteTransaction {
|
|
|
|
Vote(Vote),
|
|
|
|
VoteStateUpdate(VoteStateUpdate),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl VoteTransaction {
|
|
|
|
pub fn slots(&self) -> Vec<Slot> {
|
|
|
|
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<UnixTimestamp> {
|
|
|
|
match self {
|
|
|
|
VoteTransaction::Vote(vote) => vote.timestamp,
|
|
|
|
VoteTransaction::VoteStateUpdate(vote_state_update) => vote_state_update.timestamp,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn last_voted_slot(&self) -> Option<Slot> {
|
|
|
|
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<Vote> for VoteTransaction {
|
|
|
|
fn from(vote: Vote) -> Self {
|
|
|
|
VoteTransaction::Vote(vote)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl From<VoteStateUpdate> for VoteTransaction {
|
|
|
|
fn from(vote_state_update: VoteStateUpdate) -> Self {
|
|
|
|
VoteTransaction::VoteStateUpdate(vote_state_update)
|
|
|
|
}
|
|
|
|
}
|