use neptune_consensus::block::block_body::BlockBody;
use neptune_mutator_set::active_window::ActiveWindow;
use neptune_mutator_set::mutator_set_accumulator::MutatorSetAccumulator;
use serde::Deserialize;
use serde::Serialize;
use tasm_lib::prelude::Digest;
use tasm_lib::twenty_first::prelude::Mmr;
use tasm_lib::twenty_first::util_types::mmr::mmr_accumulator::MmrAccumulator;
use crate::model::block::transaction_kernel::RpcTransactionKernel;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RpcMmrAccumulator {
pub leaf_count: u64,
pub peaks: Vec<Digest>,
}
impl From<&MmrAccumulator> for RpcMmrAccumulator {
fn from(mmr: &MmrAccumulator) -> Self {
Self {
leaf_count: mmr.num_leafs(),
peaks: mmr.peaks(),
}
}
}
impl From<RpcMmrAccumulator> for MmrAccumulator {
fn from(mmr: RpcMmrAccumulator) -> Self {
MmrAccumulator::init(mmr.peaks, mmr.leaf_count)
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct RpcActiveWindow(pub Vec<u32>);
impl From<&ActiveWindow> for RpcActiveWindow {
fn from(window: &ActiveWindow) -> Self {
Self(window.to_vec_u32())
}
}
impl From<RpcActiveWindow> for ActiveWindow {
fn from(window: RpcActiveWindow) -> Self {
ActiveWindow::from_vec_u32(window.0)
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RpcMutatorSetAccumulator {
pub aocl: RpcMmrAccumulator,
pub swbf_inactive: RpcMmrAccumulator,
pub swbf_active: RpcActiveWindow,
}
impl From<&MutatorSetAccumulator> for RpcMutatorSetAccumulator {
fn from(set: &MutatorSetAccumulator) -> Self {
Self {
aocl: RpcMmrAccumulator::from(&set.aocl),
swbf_inactive: RpcMmrAccumulator::from(&set.swbf_inactive),
swbf_active: RpcActiveWindow::from(&set.swbf_active),
}
}
}
impl From<RpcMutatorSetAccumulator> for MutatorSetAccumulator {
fn from(msa: RpcMutatorSetAccumulator) -> Self {
Self {
aocl: MmrAccumulator::from(msa.aocl),
swbf_inactive: MmrAccumulator::from(msa.swbf_inactive),
swbf_active: ActiveWindow::from(msa.swbf_active),
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RpcBlockBody {
pub transaction_kernel: RpcTransactionKernel,
pub mutator_set_accumulator: RpcMutatorSetAccumulator,
pub lock_free_mmr_accumulator: RpcMmrAccumulator,
pub block_mmr_accumulator: RpcMmrAccumulator,
}
impl From<&BlockBody> for RpcBlockBody {
fn from(body: &BlockBody) -> Self {
Self {
transaction_kernel: RpcTransactionKernel::from(&body.transaction_kernel),
mutator_set_accumulator: RpcMutatorSetAccumulator::from(
&body.mutator_set_accumulator_without_guesser_fees(),
),
lock_free_mmr_accumulator: RpcMmrAccumulator::from(&body.lock_free_mmr_accumulator),
block_mmr_accumulator: RpcMmrAccumulator::from(&body.block_mmr_accumulator),
}
}
}
impl From<RpcBlockBody> for BlockBody {
fn from(body: RpcBlockBody) -> Self {
BlockBody::new(
body.transaction_kernel.into(),
body.mutator_set_accumulator.into(),
body.lock_free_mmr_accumulator.into(),
body.block_mmr_accumulator.into(),
)
}
}