radix_common/network/
mod.rs

1use sbor::rust::prelude::*;
2use sbor::*;
3
4/// Network Definition is intended to be the actual definition of a network
5#[derive(Debug, Clone, Sbor, PartialEq, Eq)]
6pub struct NetworkDefinition {
7    pub id: u8,
8    pub logical_name: Cow<'static, str>,
9    pub hrp_suffix: Cow<'static, str>,
10}
11
12// NOTE: Most Network Definitions live in the node codebase
13// Some are duplicated here so that they can be easily used by scrypto and resim
14impl NetworkDefinition {
15    /// Used when running resim, and for engine/scrypto tests
16    pub const fn simulator() -> NetworkDefinition {
17        NetworkDefinition {
18            id: 242,
19            logical_name: Cow::Borrowed("simulator"),
20            hrp_suffix: Cow::Borrowed("sim"),
21        }
22    }
23
24    /// Used for running a local node
25    pub const fn localnet() -> NetworkDefinition {
26        NetworkDefinition {
27            id: 240,
28            logical_name: Cow::Borrowed("localnet"),
29            hrp_suffix: Cow::Borrowed("loc"),
30        }
31    }
32
33    /// The network definition for Alphanet
34    pub const fn adapanet() -> NetworkDefinition {
35        NetworkDefinition {
36            id: 0x0a,
37            logical_name: Cow::Borrowed("adapanet"),
38            hrp_suffix: Cow::Borrowed("tdx_a_"),
39        }
40    }
41
42    /// The network definition for Betanet
43    pub const fn nebunet() -> NetworkDefinition {
44        NetworkDefinition {
45            id: 0x0b,
46            logical_name: Cow::Borrowed("nebunet"),
47            hrp_suffix: Cow::Borrowed("tdx_b_"),
48        }
49    }
50
51    /// The network definition for RCnet v1
52    pub const fn kisharnet() -> NetworkDefinition {
53        NetworkDefinition {
54            id: 0x0c,
55            logical_name: Cow::Borrowed("kisharnet"),
56            hrp_suffix: Cow::Borrowed("tdx_c_"),
57        }
58    }
59
60    /// The network definition for RCnet v2
61    pub const fn ansharnet() -> NetworkDefinition {
62        NetworkDefinition {
63            id: 0x0d,
64            logical_name: Cow::Borrowed("ansharnet"),
65            hrp_suffix: Cow::Borrowed("tdx_d_"),
66        }
67    }
68
69    /// The network definition for RCnet v3
70    pub const fn zabanet() -> NetworkDefinition {
71        NetworkDefinition {
72            id: 0x0e,
73            logical_name: Cow::Borrowed("zabanet"),
74            hrp_suffix: Cow::Borrowed("tdx_e_"),
75        }
76    }
77
78    pub const fn stokenet() -> NetworkDefinition {
79        NetworkDefinition {
80            id: 2,
81            logical_name: Cow::Borrowed("stokenet"),
82            hrp_suffix: Cow::Borrowed("tdx_2_"),
83        }
84    }
85
86    pub const fn mainnet() -> NetworkDefinition {
87        NetworkDefinition {
88            id: 1,
89            logical_name: Cow::Borrowed("mainnet"),
90            hrp_suffix: Cow::Borrowed("rdx"),
91        }
92    }
93}
94
95impl FromStr for NetworkDefinition {
96    type Err = ParseNetworkError;
97
98    fn from_str(s: &str) -> Result<Self, Self::Err> {
99        match s.to_lowercase().as_str() {
100            "simulator" => Ok(NetworkDefinition::simulator()),
101            "adapanet" => Ok(NetworkDefinition::adapanet()),
102            "nebunet" => Ok(NetworkDefinition::nebunet()),
103            "kisharnet" => Ok(NetworkDefinition::kisharnet()),
104            "ansharnet" => Ok(NetworkDefinition::ansharnet()),
105            "zabanet" => Ok(NetworkDefinition::zabanet()),
106            "stokenet" => Ok(NetworkDefinition::stokenet()),
107            "mainnet" => Ok(NetworkDefinition::mainnet()),
108            _ => Err(ParseNetworkError::InvalidNetworkString),
109        }
110    }
111}
112
113#[derive(Debug)]
114pub enum ParseNetworkError {
115    InvalidNetworkString,
116}
117
118#[cfg(test)]
119mod tests {
120    use super::*;
121    use crate::internal_prelude::*;
122
123    #[test]
124    fn network_from_string_fail() {
125        assert_matches!(
126            NetworkDefinition::from_str("non_existing_network").unwrap_err(),
127            ParseNetworkError::InvalidNetworkString
128        );
129    }
130
131    #[test]
132    fn network_ids() {
133        let array = [
134            ("mainnet", 1),
135            ("Simulator", 242),
136            ("Adapanet", 10),
137            ("NEBUNET", 11),
138            ("Kisharnet", 12),
139            ("ansharnet", 13),
140            ("zabanet", 14),
141        ];
142
143        for (name, id) in array {
144            assert_eq!(NetworkDefinition::from_str(name).unwrap().id, id)
145        }
146    }
147}