use std::fmt;
use vapory_types::{U256, H256};
use crate::security_level::SecurityLevel;
use crate::BlockNumber;
#[derive(Clone, Debug)]
pub struct BlockChainInfo {
pub total_difficulty: U256,
pub pending_total_difficulty: U256,
pub genesis_hash: H256,
pub best_block_hash: H256,
pub best_block_number: BlockNumber,
pub best_block_timestamp: u64,
pub ancient_block_hash: Option<H256>,
pub ancient_block_number: Option<BlockNumber>,
pub first_block_hash: Option<H256>,
pub first_block_number: Option<BlockNumber>,
}
impl BlockChainInfo {
pub fn security_level(&self) -> SecurityLevel {
if self.ancient_block_number.is_none() || self.first_block_number.is_none() {
SecurityLevel::FullProofOfWork
} else {
SecurityLevel::PartialProofOfWork(self.best_block_number - self.first_block_number.expect("Guard condition means this is not none"))
}
}
}
impl fmt::Display for BlockChainInfo {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "#{}.{}", self.best_block_number, self.best_block_hash)
}
}