use derive_getters::Getters;
use derive_new::new;
use zakura_chain::{
block::Hash,
block::Height,
subtree::{NoteCommitmentSubtreeData, NoteCommitmentSubtreeIndex},
};
pub type SubtreeRpcData = NoteCommitmentSubtreeData<String>;
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, Getters, new)]
pub struct GetSubtreesByIndexResponse {
pub(crate) pool: String,
#[getter(copy)]
pub(crate) start_index: NoteCommitmentSubtreeIndex,
pub(crate) subtrees: Vec<SubtreeRpcData>,
}
impl Default for GetSubtreesByIndexResponse {
fn default() -> Self {
Self {
pool: "sapling | orchard | ironwood".to_string(),
start_index: NoteCommitmentSubtreeIndex(u16::default()),
subtrees: vec![],
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, Getters, new)]
pub struct GetTreestateResponse {
#[serde(with = "hex")]
#[getter(copy)]
hash: Hash,
#[getter(copy)]
height: Height,
time: u32,
#[serde(skip_serializing_if = "Option::is_none")]
sprout: Option<Treestate>,
sapling: Treestate,
orchard: Treestate,
#[serde(default)]
ironwood: Treestate,
}
impl GetTreestateResponse {
#[deprecated(note = "Use `new` instead.")]
pub fn from_parts(
hash: Hash,
height: Height,
time: u32,
sapling: Option<Vec<u8>>,
orchard: Option<Vec<u8>>,
) -> Self {
let sapling = Treestate {
commitments: Commitments {
final_state: sapling,
final_root: None,
},
};
let orchard = Treestate {
commitments: Commitments {
final_state: orchard,
final_root: None,
},
};
Self {
hash,
height,
time,
sprout: None,
sapling,
orchard,
ironwood: Default::default(),
}
}
#[deprecated(note = "Use getters instead.")]
pub fn into_parts(self) -> (Hash, Height, u32, Option<Vec<u8>>, Option<Vec<u8>>) {
(
self.hash,
self.height,
self.time,
self.sapling.commitments.final_state,
self.orchard.commitments.final_state,
)
}
}
impl Default for GetTreestateResponse {
fn default() -> Self {
Self {
hash: Hash([0; 32]),
height: Height::MIN,
time: Default::default(),
sprout: Default::default(),
sapling: Default::default(),
orchard: Default::default(),
ironwood: Default::default(),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, Getters, new)]
pub struct Treestate {
commitments: Commitments,
}
impl Treestate {
#[deprecated(note = "Use `commitments()` instead.")]
pub fn inner(&self) -> &Commitments {
self.commitments()
}
}
impl Default for Treestate {
fn default() -> Self {
Self {
commitments: Commitments {
final_root: None,
final_state: None,
},
}
}
}
#[serde_with::serde_as]
#[derive(Clone, Debug, Eq, PartialEq, serde::Serialize, serde::Deserialize, Getters, new)]
pub struct Commitments {
#[serde_as(as = "Option<serde_with::hex::Hex>")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "finalRoot")]
final_root: Option<Vec<u8>>,
#[serde_as(as = "Option<serde_with::hex::Hex>")]
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "finalState")]
final_state: Option<Vec<u8>>,
}
impl Commitments {
#[deprecated(note = "Use `final_state()` instead.")]
pub fn inner(&self) -> &Option<Vec<u8>> {
&self.final_state
}
}