Skip to main content

sof_tx/
providers.rs

1//! Provider traits and basic in-memory adapters used by the transaction SDK.
2
3use std::net::SocketAddr;
4
5use solana_pubkey::Pubkey;
6
7/// One leader/validator target that can receive transactions directly.
8#[derive(Debug, Clone, Eq, PartialEq, Hash)]
9pub struct LeaderTarget {
10    /// Optional validator identity.
11    pub identity: Option<Pubkey>,
12    /// TPU/ingress socket used for direct submit.
13    pub tpu_addr: SocketAddr,
14}
15
16impl LeaderTarget {
17    /// Creates a leader target with optional identity.
18    #[must_use]
19    pub const fn new(identity: Option<Pubkey>, tpu_addr: SocketAddr) -> Self {
20        Self { identity, tpu_addr }
21    }
22}
23
24/// Source of the latest recent blockhash bytes.
25pub trait RecentBlockhashProvider: Send + Sync {
26    /// Returns the newest blockhash bytes when available.
27    fn latest_blockhash(&self) -> Option<[u8; 32]>;
28}
29
30/// Source of current/next leader targets.
31pub trait LeaderProvider: Send + Sync {
32    /// Returns the currently scheduled leader target.
33    fn current_leader(&self) -> Option<LeaderTarget>;
34
35    /// Returns up to `n` upcoming leader targets.
36    fn next_leaders(&self, n: usize) -> Vec<LeaderTarget>;
37}
38
39/// In-memory blockhash provider for tests and static configurations.
40#[derive(Debug, Clone)]
41pub struct StaticRecentBlockhashProvider {
42    /// Optional static blockhash bytes.
43    value: Option<[u8; 32]>,
44}
45
46impl StaticRecentBlockhashProvider {
47    /// Creates a provider with an optional static blockhash.
48    #[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/// In-memory leader provider for tests and static configurations.
61#[derive(Debug, Clone, Default)]
62pub struct StaticLeaderProvider {
63    /// Optional current leader.
64    current: Option<LeaderTarget>,
65    /// Ordered next leaders.
66    next: Vec<LeaderTarget>,
67}
68
69impl StaticLeaderProvider {
70    /// Creates a static leader provider.
71    #[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}