use crate::{KeyImage, Owner, OwnerOnce};
use bls_ringct::{
blstrs::Scalar,
group::Curve,
mlsag::{MlsagMaterial, TrueInput},
ringct::{Amount, RingCtMaterial},
{Output, RevealedCommitment},
};
use blsttc::IntoFr;
pub struct GenesisMaterial {
pub ringct_material: RingCtMaterial,
pub owner_once: OwnerOnce,
pub input_key_image: KeyImage,
}
impl GenesisMaterial {
pub const GENESIS_AMOUNT: Amount = Amount::MAX; }
impl Default for GenesisMaterial {
fn default() -> Self {
let input_sk_seed: u64 = 1234567890;
let input_sk = blsttc::SecretKey::from_mut(&mut input_sk_seed.into_fr());
let output_sk = blsttc::SecretKey::random();
let output_owner_once = OwnerOnce {
owner_base: Owner::from(output_sk.clone()),
derivation_index: [1; 32],
};
let output_sk_once = output_sk.derive_child(&output_owner_once.derivation_index);
let true_input = TrueInput::new(
input_sk,
RevealedCommitment {
value: Self::GENESIS_AMOUNT,
blinding: 1000.into(), },
);
let input_key_image: KeyImage = true_input.key_image().to_affine().into();
let mlsag_material = MlsagMaterial {
true_input,
decoy_inputs: vec![],
pi_base: 0,
alpha: (Default::default(), Default::default()),
r: vec![(Scalar::default(), Scalar::default())],
};
let ringct_material = RingCtMaterial {
inputs: vec![mlsag_material],
outputs: vec![Output::new(
output_sk_once.public_key(),
Self::GENESIS_AMOUNT,
)],
};
Self {
ringct_material,
owner_once: output_owner_once,
input_key_image,
}
}
}