darkfi_money_contract/client/
auth_token_freeze_v1.rs1use darkfi::{
20 zk::{halo2::Value, Proof, ProvingKey, Witness, ZkCircuit},
21 zkas::ZkBinary,
22 Result,
23};
24use darkfi_sdk::crypto::Keypair;
25use log::debug;
26use rand::rngs::OsRng;
27
28use crate::model::{MoneyAuthTokenFreezeParamsV1, TokenAttributes};
29
30pub struct AuthTokenFreezeCallDebris {
31 pub params: MoneyAuthTokenFreezeParamsV1,
32 pub proofs: Vec<Proof>,
33}
34
35pub struct AuthTokenFreezeCallBuilder {
37 pub mint_keypair: Keypair,
39 pub token_attrs: TokenAttributes,
40 pub auth_mint_zkbin: ZkBinary,
42 pub auth_mint_pk: ProvingKey,
44}
45
46impl AuthTokenFreezeCallBuilder {
47 pub fn build(&self) -> Result<AuthTokenFreezeCallDebris> {
48 debug!(target: "contract::money::client::auth_token_freeze", "Building Money::AuthTokenFreezeV1 contract call");
49
50 let prover_witnesses = vec![
53 Witness::Base(Value::known(self.token_attrs.auth_parent.inner())),
55 Witness::Base(Value::known(self.token_attrs.blind.inner())),
56 Witness::Base(Value::known(self.mint_keypair.secret.inner())),
58 ];
59
60 let mint_pubkey = self.mint_keypair.public;
61 let token_id = self.token_attrs.to_token_id();
62
63 let public_inputs = vec![mint_pubkey.x(), mint_pubkey.y(), token_id.inner()];
64 let circuit = ZkCircuit::new(prover_witnesses, &self.auth_mint_zkbin);
66 let proof = Proof::create(&self.auth_mint_pk, &[circuit], &public_inputs, &mut OsRng)?;
67
68 let params =
69 MoneyAuthTokenFreezeParamsV1 { mint_public: self.mint_keypair.public, token_id };
70 let debris = AuthTokenFreezeCallDebris { params, proofs: vec![proof] };
71 Ok(debris)
72 }
73}