waterfalls 0.9.2

Waterfalls provide blockchain data to liquid and bitcoin light-client wallets
Documentation
use crate::be::block::elements_block_hash;
use crate::{be, Family};

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BlockHeader {
    Bitcoin(Box<bitcoin::block::Header>),
    Elements(Box<elements::BlockHeader>),
}

impl BlockHeader {
    pub fn block_hash(&self) -> elements::BlockHash {
        match self {
            BlockHeader::Bitcoin(header) => elements_block_hash(header.block_hash()),
            BlockHeader::Elements(header) => header.block_hash(),
        }
    }

    pub(crate) fn serialize_hex(&self) -> String {
        match self {
            BlockHeader::Bitcoin(header) => {
                bitcoin::consensus::encode::serialize_hex(header.as_ref())
            }
            BlockHeader::Elements(header) => elements::encode::serialize_hex(header.as_ref()),
        }
    }

    pub(crate) fn time(&self) -> u32 {
        match self {
            BlockHeader::Bitcoin(header) => header.time,
            BlockHeader::Elements(header) => header.time,
        }
    }

    pub fn prev_blockhash(&self) -> elements::BlockHash {
        match self {
            BlockHeader::Bitcoin(header) => elements_block_hash(header.prev_blockhash),
            BlockHeader::Elements(header) => header.prev_blockhash,
        }
    }

    pub(crate) fn from_bytes(bytes: &[u8], family: be::Family) -> Result<Self, anyhow::Error> {
        Ok(match family {
            Family::Bitcoin => {
                let bitcoin_header =
                    <bitcoin::block::Header as bitcoin::consensus::Decodable>::consensus_decode(
                        &mut &bytes[..],
                    )?;
                be::BlockHeader::Bitcoin(Box::new(bitcoin_header))
            }
            Family::Elements => {
                let elements_header =
                    <elements::BlockHeader as elements::encode::Decodable>::consensus_decode(
                        bytes,
                    )?;
                be::BlockHeader::Elements(Box::new(elements_header))
            }
        })
    }

    pub(crate) fn from_str(header_hex: &str, family: be::Family) -> Result<Self, anyhow::Error> {
        let bytes = hex_simd::decode_to_vec(header_hex.as_bytes())?;
        Self::from_bytes(&bytes, family)
    }
}