use ff::PrimeField;
use incrementalmerkletree::{Hashable, Level};
use pasta_curves::Fp;
use crate::hash::{MerkleHashVote, TREE_DEPTH};
#[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct Anchor(Fp);
impl From<Fp> for Anchor {
fn from(value: Fp) -> Self {
Anchor(value)
}
}
impl From<MerkleHashVote> for Anchor {
fn from(hash: MerkleHashVote) -> Self {
Anchor(hash.0)
}
}
impl Anchor {
pub fn empty_tree() -> Self {
Anchor(MerkleHashVote::empty_root(Level::from(TREE_DEPTH as u8)).0)
}
pub fn inner(&self) -> Fp {
self.0
}
pub fn to_bytes(&self) -> [u8; 32] {
self.0.to_repr()
}
pub fn from_bytes(bytes: [u8; 32]) -> Option<Self> {
Option::from(Fp::from_repr(bytes).map(Anchor))
}
}