mod bytes;
mod genesis;
mod serialize;
mod string;
mod to_bits;
mod to_hash;
use console::{network::prelude::*, types::Field};
use core::marker::PhantomData;
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Metadata<N: Network> {
network: u16,
round: u64,
height: u32,
coinbase_target: u64,
proof_target: u64,
timestamp: i64,
_phantom: PhantomData<N>,
}
impl<N: Network> Metadata<N> {
pub fn new(
network: u16,
round: u64,
height: u32,
coinbase_target: u64,
proof_target: u64,
timestamp: i64,
) -> Result<Self> {
let metadata = Self { network, round, height, coinbase_target, proof_target, timestamp, _phantom: PhantomData };
match metadata.is_valid() {
true => Ok(metadata),
false => bail!("Invalid block metadata: {:?}", metadata),
}
}
pub fn is_valid(&self) -> bool {
match self.height == 0u32 {
true => self.is_genesis(),
false => {
self.network == N::ID
&& self.round != 0u64
&& self.height != 0u32
&& self.timestamp != 0i64
}
}
}
}
impl<N: Network> Metadata<N> {
pub const fn network(&self) -> u16 {
self.network
}
pub const fn round(&self) -> u64 {
self.round
}
pub const fn height(&self) -> u32 {
self.height
}
pub const fn coinbase_target(&self) -> u64 {
self.coinbase_target
}
pub const fn proof_target(&self) -> u64 {
self.proof_target
}
pub const fn timestamp(&self) -> i64 {
self.timestamp
}
}