1use std::{fmt, num::TryFromIntError};
4
5use serde::{Deserialize, Serialize};
6
7use crate::block::Height;
8
9#[cfg(any(test, feature = "proptest-impl"))]
10use proptest_derive::Arbitrary;
11
12pub const TRACKED_SUBTREE_HEIGHT: u8 = 16;
14
15#[derive(
18 Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize, schemars::JsonSchema,
19)]
20#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
21#[serde(transparent)]
22pub struct NoteCommitmentSubtreeIndex(pub u16);
23
24impl fmt::Display for NoteCommitmentSubtreeIndex {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 f.write_str(&self.0.to_string())
27 }
28}
29
30impl From<u16> for NoteCommitmentSubtreeIndex {
31 fn from(value: u16) -> Self {
32 Self(value)
33 }
34}
35
36impl TryFrom<u64> for NoteCommitmentSubtreeIndex {
37 type Error = TryFromIntError;
38
39 fn try_from(value: u64) -> Result<Self, Self::Error> {
40 u16::try_from(value).map(Self)
41 }
42}
43
44impl From<NoteCommitmentSubtreeIndex> for u64 {
47 fn from(value: NoteCommitmentSubtreeIndex) -> Self {
48 value.0.into()
49 }
50}
51
52#[derive(Copy, Clone, Debug, Eq, PartialEq)]
59#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
60pub struct NoteCommitmentSubtree<SubtreeRoot> {
61 pub index: NoteCommitmentSubtreeIndex,
63 pub root: SubtreeRoot,
65 pub end_height: Height,
67}
68
69impl<SubtreeRoot> NoteCommitmentSubtree<SubtreeRoot> {
70 pub fn new(
72 index: impl Into<NoteCommitmentSubtreeIndex>,
73 end_height: Height,
74 root: SubtreeRoot,
75 ) -> Self {
76 let index = index.into();
77 Self {
78 index,
79 end_height,
80 root,
81 }
82 }
83
84 pub fn into_data(self) -> NoteCommitmentSubtreeData<SubtreeRoot> {
86 NoteCommitmentSubtreeData::new(self.end_height, self.root)
87 }
88}
89
90#[derive(Copy, Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
93#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
94pub struct NoteCommitmentSubtreeData<SubtreeRoot> {
95 pub root: SubtreeRoot,
97
98 pub end_height: Height,
100}
101
102impl<SubtreeRoot> NoteCommitmentSubtreeData<SubtreeRoot> {
103 pub fn new(end_height: Height, root: SubtreeRoot) -> Self {
105 Self { end_height, root }
106 }
107
108 pub fn with_index(
110 self,
111 index: impl Into<NoteCommitmentSubtreeIndex>,
112 ) -> NoteCommitmentSubtree<SubtreeRoot> {
113 NoteCommitmentSubtree::new(index, self.end_height, self.root)
114 }
115}