use anyhow::Context; use bdk::electrum_client::HeaderNotification; use serde::{Deserialize, Serialize}; use std::convert::{TryFrom, TryInto}; use std::ops::Add; /// Represent a block height, or block number, expressed in absolute block /// count. E.g. The transaction was included in block #655123, 655123 block /// after the genesis block. #[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Serialize, Deserialize)] #[serde(transparent)] pub struct BlockHeight(u32); impl From for u32 { fn from(height: BlockHeight) -> Self { height.0 } } impl TryFrom for BlockHeight { type Error = anyhow::Error; fn try_from(value: HeaderNotification) -> Result { Ok(Self( value .height .try_into() .context("Failed to fit usize into u32")?, )) } } impl Add for BlockHeight { type Output = BlockHeight; fn add(self, rhs: u32) -> Self::Output { BlockHeight(self.0 + rhs) } } #[derive(Serialize, Debug, Clone, Copy, PartialEq, Eq)] pub enum ExpiredTimelocks { None { blocks_left: u32 }, Cancel { blocks_left: u32 }, Punish, }