use super::*;
impl<N: Network> Stack<N> {
#[inline]
pub(crate) fn initialize(process: &Process<N>, program: &Program<N>) -> Result<Self> {
let edition = match process.contains_program(program.id()) {
false => 0u16,
true => {
let stack = process.get_stack(program.id())?;
let edition = *stack.program_edition();
edition.checked_add(1).ok_or_else(|| anyhow!("Overflow while incrementing the program edition"))?
}
};
let stack = Self::create_raw(process, program, edition)?;
stack.initialize_and_check(process)?;
Ok(stack)
}
#[inline]
pub(crate) fn create_raw(process: &Process<N>, program: &Program<N>, edition: u16) -> Result<Self> {
let stack = Self {
program: program.clone(),
stacks: Arc::downgrade(&process.stacks),
constructor_types: Default::default(),
register_types: Default::default(),
finalize_types: Default::default(),
universal_srs: process.universal_srs().clone(),
proving_keys: Default::default(),
verifying_keys: Default::default(),
program_address: program.id().to_address()?,
program_checksum: program.to_checksum(),
program_edition: U16::new(edition),
program_owner: None,
};
Ok(stack)
}
}