zeldhash_protocol/
config.rs

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