use bitcoin::Transaction;
use sidestr_core::block::{HeaderFamily, SidestrBlock};
use sidestr_core::chain::ChainOf;
use sidestr_core::state::{Applied, StateOf, Submitted};
pub trait ChainView<F: HeaderFamily> {
fn state(&self) -> &StateOf<F>;
fn submit(&mut self, tx: Transaction) -> sidestr_core::Result<Submitted>;
fn add_block(&mut self, block: &F::Block, now: u64) -> sidestr_core::Result<Applied>;
}
impl<F: HeaderFamily> ChainView<F> for StateOf<F> {
fn state(&self) -> &StateOf<F> {
self
}
fn submit(&mut self, tx: Transaction) -> sidestr_core::Result<Submitted> {
StateOf::submit(self, tx)
}
fn add_block(&mut self, block: &F::Block, now: u64) -> sidestr_core::Result<Applied> {
StateOf::add_block(
self,
block,
None,
Some(u32::try_from(now).unwrap_or(u32::MAX)),
)
}
}
impl<F: HeaderFamily> ChainView<F> for ChainOf<F> {
fn state(&self) -> &StateOf<F> {
ChainOf::state(self)
}
fn submit(&mut self, tx: Transaction) -> sidestr_core::Result<Submitted> {
ChainOf::submit(self, &bitcoin::consensus::encode::serialize(&tx))
}
fn add_block(&mut self, block: &F::Block, _now: u64) -> sidestr_core::Result<Applied> {
ChainOf::add_block(self, &block.encode(), None)
}
}