zebra_chain/parameters/network/
magic.rs

1//! Network `Magic` type and implementation.
2
3use std::fmt;
4
5use crate::parameters::{constants::magics, Network};
6
7#[cfg(any(test, feature = "proptest-impl"))]
8use proptest_derive::Arbitrary;
9
10/// A magic number identifying the network.
11#[derive(Copy, Clone, Eq, PartialEq)]
12#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
13pub struct Magic(pub [u8; 4]);
14
15impl fmt::Debug for Magic {
16    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17        f.debug_tuple("Magic").field(&hex::encode(self.0)).finish()
18    }
19}
20
21impl Network {
22    /// Get the magic value associated to this `Network`.
23    pub fn magic(&self) -> Magic {
24        match self {
25            Network::Mainnet => magics::MAINNET,
26            Network::Testnet(params) => params.network_magic(),
27        }
28    }
29}
30
31#[cfg(test)]
32mod magic_proptest {
33
34    use proptest::prelude::*;
35
36    use super::{magics, Magic};
37
38    #[test]
39    fn magic_debug() {
40        let _init_guard = zebra_test::init();
41
42        assert_eq!(format!("{:?}", magics::MAINNET), "Magic(\"24e92764\")");
43        assert_eq!(format!("{:?}", magics::TESTNET), "Magic(\"fa1af9bf\")");
44        assert_eq!(format!("{:?}", magics::REGTEST), "Magic(\"aae83f5f\")");
45    }
46
47    proptest! {
48
49        #[test]
50        fn proptest_magic_from_array(data in any::<[u8; 4]>()) {
51            let _init_guard = zebra_test::init();
52
53            assert_eq!(format!("{:?}", Magic(data)), format!("Magic({:x?})", hex::encode(data)));
54        }
55    }
56}