use anchor_lang::prelude::*;
use crate::{errors::AccountCompressionErrorCode, AccessMetadata, RolloverMetadata};
#[account(zero_copy)]
#[derive(AnchorDeserialize, Debug, PartialEq, Default)]
pub struct MerkleTreeMetadata {
pub access_metadata: AccessMetadata,
pub rollover_metadata: RolloverMetadata,
pub associated_queue: Pubkey,
pub next_merkle_tree: Pubkey,
}
impl MerkleTreeMetadata {
pub fn init(
&mut self,
access_metadata: AccessMetadata,
rollover_metadata: RolloverMetadata,
associated_queue: Pubkey,
) {
self.access_metadata = access_metadata;
self.rollover_metadata = rollover_metadata;
self.associated_queue = associated_queue;
}
pub fn rollover(
&mut self,
old_associated_queue: Pubkey,
next_merkle_tree: Pubkey,
) -> Result<()> {
if self.associated_queue != old_associated_queue {
return err!(AccountCompressionErrorCode::MerkleTreeAndQueueNotAssociated);
}
self.rollover_metadata.rollover()?;
self.next_merkle_tree = next_merkle_tree;
Ok(())
}
}