zeldhash_protocol/
config.rs

1use crate::types::Amount;
2
3/// Static parameters that describe how the ZELD protocol behaves on a network.
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct ZeldConfig {
6    /// Minimum leading zeros required for a transaction to earn ZELD.
7    pub min_zero_count: u8,
8    /// Base reward for the best transaction in a block.
9    pub base_reward: Amount,
10    /// Prefix bytes for custom distribution OP_RETURN data.
11    pub zeld_prefix: &'static [u8],
12}
13
14/// Bitcoin networks supported by the ZELD protocol.
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]
16pub enum ZeldNetwork {
17    Mainnet,
18    Testnet4,
19    Signet,
20    Regtest,
21}
22
23impl ZeldConfig {
24    /// ZELD parameters for Bitcoin mainnet.
25    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    /// ZELD parameters for Bitcoin testnet4.
32    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    /// ZELD parameters for Bitcoin signet.
39    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    /// ZELD parameters for Bitcoin regtest.
46    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    /// Returns the configuration associated with the provided Bitcoin network.
53    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}