1use std::net::SocketAddr;
4
5use solana_pubkey::Pubkey;
6
7#[derive(Debug, Clone, Eq, PartialEq, Hash)]
9pub struct LeaderTarget {
10 pub identity: Option<Pubkey>,
12 pub tpu_addr: SocketAddr,
14}
15
16impl LeaderTarget {
17 #[must_use]
19 pub const fn new(identity: Option<Pubkey>, tpu_addr: SocketAddr) -> Self {
20 Self { identity, tpu_addr }
21 }
22}
23
24pub trait RecentBlockhashProvider: Send + Sync {
26 fn latest_blockhash(&self) -> Option<[u8; 32]>;
28}
29
30pub trait LeaderProvider: Send + Sync {
32 fn current_leader(&self) -> Option<LeaderTarget>;
34
35 fn next_leaders(&self, n: usize) -> Vec<LeaderTarget>;
37}
38
39#[derive(Debug, Clone)]
41pub struct StaticRecentBlockhashProvider {
42 value: Option<[u8; 32]>,
44}
45
46impl StaticRecentBlockhashProvider {
47 #[must_use]
49 pub const fn new(value: Option<[u8; 32]>) -> Self {
50 Self { value }
51 }
52}
53
54impl RecentBlockhashProvider for StaticRecentBlockhashProvider {
55 fn latest_blockhash(&self) -> Option<[u8; 32]> {
56 self.value
57 }
58}
59
60#[derive(Debug, Clone, Default)]
62pub struct StaticLeaderProvider {
63 current: Option<LeaderTarget>,
65 next: Vec<LeaderTarget>,
67}
68
69impl StaticLeaderProvider {
70 #[must_use]
72 pub const fn new(current: Option<LeaderTarget>, next: Vec<LeaderTarget>) -> Self {
73 Self { current, next }
74 }
75}
76
77impl LeaderProvider for StaticLeaderProvider {
78 fn current_leader(&self) -> Option<LeaderTarget> {
79 self.current.clone()
80 }
81
82 fn next_leaders(&self, n: usize) -> Vec<LeaderTarget> {
83 self.next.iter().take(n).cloned().collect()
84 }
85}