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