use super::types::KeyPair;
use crate::crypto::{Point, Scalar};
#[derive(Clone, Debug, Default)]
pub struct GenContext {
pub asset_ids: Vec<Point>,
pub blinded_asset_ids: Vec<Point>,
pub amount_commitments: Vec<Point>,
pub asset_id_blinding_masks: Vec<Scalar>,
pub amounts: Vec<Scalar>,
pub amount_blinding_masks: Vec<Scalar>,
pub pseudo_outs_blinded_asset_ids: Vec<Point>,
pub pseudo_outs_plus_real_out_blinding_masks: Vec<Scalar>,
pub real_zc_ins_asset_ids: Vec<Point>,
pub zc_input_amounts: Vec<u64>,
pub pseudo_out_amount_commitments_sum: Option<Point>,
pub pseudo_out_amount_blinding_masks_sum: Option<Scalar>,
pub real_in_asset_id_blinding_mask_x_amount_sum: Option<Scalar>,
pub amount_commitments_sum: Option<Point>,
pub amount_blinding_masks_sum: Option<Scalar>,
pub asset_id_blinding_mask_x_amount_sum: Option<Scalar>,
pub ao_asset_id: Option<Point>,
pub ao_asset_id_pt: Option<Point>,
pub ao_amount_commitment: Option<Point>,
pub ao_amount_blinding_mask: Option<Scalar>,
pub ao_commitment_in_outputs: bool,
pub tx_key: Option<KeyPair>,
pub tx_pub_key_p: Option<Point>,
}
impl GenContext {
pub fn resize(&mut self, in_cnt: usize, out_cnt: usize) {
self.asset_ids.resize_with(out_cnt, Point::identity);
self.blinded_asset_ids.resize_with(out_cnt, Point::identity);
self.amount_commitments
.resize_with(out_cnt, Point::identity);
self.asset_id_blinding_masks
.resize_with(out_cnt, || Scalar::ZERO);
self.amounts.resize_with(out_cnt, || Scalar::ZERO);
self.amount_blinding_masks
.resize_with(out_cnt, || Scalar::ZERO);
self.zc_input_amounts.resize(in_cnt, 0);
}
pub fn add_scalar(slot: &mut Option<Scalar>, v: &Scalar) {
*slot = Some(match slot {
Some(cur) => cur.add(v),
None => v.clone(),
});
}
pub fn add_point(slot: &mut Option<Point>, v: &Point) {
*slot = Some(match slot {
Some(cur) => cur.add(v),
None => *v,
});
}
pub fn scalar_or_zero(slot: &Option<Scalar>) -> Scalar {
slot.clone().unwrap_or(Scalar::ZERO)
}
pub fn point_or_identity(slot: &Option<Point>) -> Point {
slot.unwrap_or_else(Point::identity)
}
}