Skip to main content

solana_cluster_type/
lib.rs

1#![cfg_attr(feature = "frozen-abi", feature(min_specialization))]
2#![cfg_attr(docsrs, feature(doc_cfg))]
3#![no_std]
4
5#[cfg(feature = "frozen-abi")]
6use solana_frozen_abi_macro::{AbiEnumVisitor, AbiExample};
7#[cfg(feature = "frozen-abi")]
8extern crate std;
9
10use {core::str::FromStr, solana_hash::Hash};
11
12// The order can't align with release lifecycle only to remain ABI-compatible...
13#[cfg_attr(feature = "frozen-abi", derive(AbiExample, AbiEnumVisitor))]
14#[cfg_attr(
15    feature = "serde",
16    derive(serde_derive::Deserialize, serde_derive::Serialize)
17)]
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub enum ClusterType {
20    Testnet,
21    MainnetBeta,
22    Devnet,
23    Development,
24}
25
26impl ClusterType {
27    pub const STRINGS: [&'static str; 4] = ["development", "devnet", "testnet", "mainnet-beta"];
28
29    /// Get the known genesis hash for this ClusterType
30    pub fn get_genesis_hash(&self) -> Option<Hash> {
31        match self {
32            Self::MainnetBeta => {
33                Some(Hash::from_str("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d").unwrap())
34            }
35            Self::Testnet => {
36                Some(Hash::from_str("4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY").unwrap())
37            }
38            Self::Devnet => {
39                Some(Hash::from_str("EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG").unwrap())
40            }
41            Self::Development => None,
42        }
43    }
44}
45
46impl FromStr for ClusterType {
47    type Err = &'static str;
48
49    fn from_str(s: &str) -> Result<Self, Self::Err> {
50        match s {
51            "development" => Ok(ClusterType::Development),
52            "devnet" => Ok(ClusterType::Devnet),
53            "testnet" => Ok(ClusterType::Testnet),
54            "mainnet-beta" => Ok(ClusterType::MainnetBeta),
55            _ => Err("Unrecognized cluster type"),
56        }
57    }
58}