Skip to main content

miden_client/rpc/domain/
sync.rs

1use miden_protocol::block::{BlockHeader, BlockNumber};
2use miden_protocol::crypto::merkle::mmr::MmrDelta;
3
4use crate::rpc::domain::MissingFieldHelper;
5use crate::rpc::{RpcError, generated as proto};
6
7// CHAIN MMR INFO
8// ================================================================================================
9
10/// Represents the result of a `SyncChainMmr` RPC call, with fields converted into domain types.
11pub struct ChainMmrInfo {
12    /// The block number from which the delta starts (inclusive).
13    pub block_from: BlockNumber,
14    /// The block number up to which the delta covers (inclusive).
15    pub block_to: BlockNumber,
16    /// The MMR delta for the requested block range.
17    pub mmr_delta: MmrDelta,
18    /// The block header at `block_to`.
19    pub block_header: BlockHeader,
20}
21
22impl TryFrom<proto::rpc::SyncChainMmrResponse> for ChainMmrInfo {
23    type Error = RpcError;
24
25    fn try_from(value: proto::rpc::SyncChainMmrResponse) -> Result<Self, Self::Error> {
26        let block_range = value
27            .block_range
28            .ok_or(proto::rpc::SyncChainMmrResponse::missing_field(stringify!(block_range)))?;
29
30        let mmr_delta = value
31            .mmr_delta
32            .ok_or(proto::rpc::SyncChainMmrResponse::missing_field(stringify!(mmr_delta)))?
33            .try_into()?;
34
35        let block_header = value
36            .block_header
37            .ok_or(proto::rpc::SyncChainMmrResponse::missing_field(stringify!(block_header)))?
38            .try_into()?;
39
40        Ok(Self {
41            block_from: block_range.block_from.into(),
42            block_to: block_range
43                .block_to
44                .ok_or(proto::rpc::SyncChainMmrResponse::missing_field(stringify!(
45                    block_range.block_to
46                )))?
47                .into(),
48            mmr_delta,
49            block_header,
50        })
51    }
52}