use darkfi::{
zk::{halo2, Proof, ProvingKey, Witness, ZkCircuit},
zkas::ZkBinary,
Result,
};
use darkfi_sdk::{
crypto::{PublicKey, SecretKey},
pasta::pallas,
};
use log::debug;
use rand::rngs::OsRng;
use darkfi_money_contract::model::TokenId;
use crate::model::{Dao, DaoMintParams};
#[derive(Clone)]
pub struct DaoInfo {
pub proposer_limit: u64,
pub quorum: u64,
pub approval_ratio_quot: u64,
pub approval_ratio_base: u64,
pub gov_token_id: TokenId,
pub public_key: PublicKey,
pub bulla_blind: pallas::Base,
}
pub fn make_mint_call(
dao: &Dao,
dao_secret_key: &SecretKey,
dao_mint_zkbin: &ZkBinary,
dao_mint_pk: &ProvingKey,
) -> Result<(DaoMintParams, Vec<Proof>)> {
debug!(target: "contract::dao::client::mint", "Building DAO contract mint transaction");
let dao_proposer_limit = pallas::Base::from(dao.proposer_limit);
let dao_quorum = pallas::Base::from(dao.quorum);
let dao_approval_ratio_quot = pallas::Base::from(dao.approval_ratio_quot);
let dao_approval_ratio_base = pallas::Base::from(dao.approval_ratio_base);
let prover_witnesses = vec![
Witness::Base(halo2::Value::known(dao_proposer_limit)),
Witness::Base(halo2::Value::known(dao_quorum)),
Witness::Base(halo2::Value::known(dao_approval_ratio_quot)),
Witness::Base(halo2::Value::known(dao_approval_ratio_base)),
Witness::Base(halo2::Value::known(dao.gov_token_id.inner())),
Witness::Base(halo2::Value::known(dao_secret_key.inner())),
Witness::Base(halo2::Value::known(dao.bulla_blind.inner())),
];
let (pub_x, pub_y) = dao.public_key.xy();
let dao_bulla = dao.to_bulla();
let public = vec![pub_x, pub_y, dao_bulla.inner()];
let circuit = ZkCircuit::new(prover_witnesses, dao_mint_zkbin);
let proof = Proof::create(dao_mint_pk, &[circuit], &public, &mut OsRng)?;
let dao_mint_params = DaoMintParams { dao_bulla, dao_pubkey: dao.public_key };
Ok((dao_mint_params, vec![proof]))
}