zeldhash_protocol/
config.rs1use crate::types::Amount;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct ZeldConfig {
6 pub min_zero_count: u8,
8 pub base_reward: Amount,
10 pub zeld_prefix: &'static [u8],
12}
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum ZeldNetwork {
17 Mainnet,
18 Testnet4,
19 Signet,
20 Regtest,
21}
22
23impl ZeldConfig {
24 pub const MAINNET: Self = Self {
26 min_zero_count: 6,
27 base_reward: 4_096 * 10u64.pow(8),
28 zeld_prefix: b"ZELD",
29 };
30
31 pub const TESTNET4: Self = Self {
33 min_zero_count: 2,
34 base_reward: 4_096 * 10u64.pow(8),
35 zeld_prefix: b"ZELD",
36 };
37
38 pub const SIGNET: Self = Self {
40 min_zero_count: 2,
41 base_reward: 4_096 * 10u64.pow(8),
42 zeld_prefix: b"ZELD",
43 };
44
45 pub const REGTEST: Self = Self {
47 min_zero_count: 2,
48 base_reward: 4_096 * 10u64.pow(8),
49 zeld_prefix: b"ZELD",
50 };
51
52 pub const fn for_network(network: ZeldNetwork) -> Self {
54 match network {
55 ZeldNetwork::Mainnet => Self::MAINNET,
56 ZeldNetwork::Testnet4 => Self::TESTNET4,
57 ZeldNetwork::Signet => Self::SIGNET,
58 ZeldNetwork::Regtest => Self::REGTEST,
59 }
60 }
61}
62
63impl Default for ZeldConfig {
64 fn default() -> Self {
65 Self::MAINNET
66 }
67}
68
69impl From<ZeldNetwork> for ZeldConfig {
70 fn from(network: ZeldNetwork) -> Self {
71 Self::for_network(network)
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78
79 fn assert_config(
80 config: ZeldConfig,
81 min_zero_count: u8,
82 base_reward: Amount,
83 prefix: &'static [u8],
84 ) {
85 assert_eq!(config.min_zero_count, min_zero_count);
86 assert_eq!(config.base_reward, base_reward);
87 assert_eq!(config.zeld_prefix, prefix);
88 }
89
90 #[test]
91 fn constants_expose_expected_parameters() {
92 let base_reward = 4_096 * 10u64.pow(8);
93 assert_config(ZeldConfig::MAINNET, 6, base_reward, b"ZELD");
94 assert_config(ZeldConfig::TESTNET4, 2, base_reward, b"ZELD");
95 assert_config(ZeldConfig::SIGNET, 2, base_reward, b"ZELD");
96 assert_config(ZeldConfig::REGTEST, 2, base_reward, b"ZELD");
97 }
98
99 #[test]
100 fn for_network_routes_to_correct_constants() {
101 assert_eq!(
102 ZeldConfig::for_network(ZeldNetwork::Mainnet),
103 ZeldConfig::MAINNET
104 );
105 assert_eq!(
106 ZeldConfig::for_network(ZeldNetwork::Testnet4),
107 ZeldConfig::TESTNET4
108 );
109 assert_eq!(
110 ZeldConfig::for_network(ZeldNetwork::Signet),
111 ZeldConfig::SIGNET
112 );
113 assert_eq!(
114 ZeldConfig::for_network(ZeldNetwork::Regtest),
115 ZeldConfig::REGTEST
116 );
117 }
118
119 #[test]
120 fn from_network_matches_for_network() {
121 let networks = [
122 ZeldNetwork::Mainnet,
123 ZeldNetwork::Testnet4,
124 ZeldNetwork::Signet,
125 ZeldNetwork::Regtest,
126 ];
127
128 for network in networks {
129 assert_eq!(ZeldConfig::from(network), ZeldConfig::for_network(network));
130 }
131 }
132
133 #[test]
134 fn default_matches_mainnet() {
135 assert_eq!(ZeldConfig::default(), ZeldConfig::MAINNET);
136 }
137}