use crate::Network;
use snarkvm_fields::{ConstraintFieldError, ToConstraintField};
use snarkvm_utilities::ToBytes;
use anyhow::Result;
#[derive(Clone, Debug)]
pub struct OutputPublicVariables<N: Network> {
commitment: N::Commitment,
output_value_commitment: N::ValueCommitment,
pub(super) program_id: Option<N::ProgramID>,
}
impl<N: Network> OutputPublicVariables<N> {
pub(crate) fn blank() -> Self {
Self {
commitment: Default::default(),
output_value_commitment: N::ProgramAffineCurve::default().into(),
program_id: Some(N::ProgramID::default()),
}
}
pub(crate) fn new(
commitment: N::Commitment,
output_value_commitment: N::ValueCommitment,
program_id: Option<N::ProgramID>,
) -> Self {
Self { commitment, output_value_commitment, program_id }
}
pub(crate) fn commitment(&self) -> &N::Commitment {
&self.commitment
}
pub(crate) fn output_value_commitment(&self) -> &N::ValueCommitment {
&self.output_value_commitment
}
}
impl<N: Network> ToConstraintField<N::InnerScalarField> for OutputPublicVariables<N> {
fn to_field_elements(&self) -> Result<Vec<N::InnerScalarField>, ConstraintFieldError> {
let mut v = Vec::new();
if let Some(program_id) = &self.program_id {
v.extend_from_slice(&program_id.to_bytes_le()?.to_field_elements()?);
} else {
v.extend_from_slice(&vec![0u8; N::PROGRAM_ID_SIZE_IN_BYTES].to_field_elements()?);
}
v.extend_from_slice(&self.commitment.to_field_elements()?);
v.extend_from_slice(&self.output_value_commitment.to_field_elements()?);
Ok(v)
}
}