|
@@ -20,6 +20,7 @@ use darkfi_sdk::{
|
|
|
crypto::{pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, SecretKey},
|
|
crypto::{pasta_prelude::*, pedersen_commitment_u64, poseidon_hash, SecretKey},
|
|
|
pasta::pallas,
|
|
pasta::pallas,
|
|
|
};
|
|
};
|
|
|
|
|
+use darkfi_money_contract::model::CoinParams;
|
|
|
|
|
|
|
|
use halo2_proofs::circuit::Value;
|
|
use halo2_proofs::circuit::Value;
|
|
|
use log::debug;
|
|
use log::debug;
|
|
@@ -31,12 +32,11 @@ use darkfi::{
|
|
|
Result,
|
|
Result,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-use super::{DaoInfo, DaoProposalInfo};
|
|
|
|
|
-use crate::model::{DaoBlindAggregateVote, DaoExecParams, DaoProposalBulla};
|
|
|
|
|
|
|
+use crate::model::{Dao, DaoProposal, DaoBlindAggregateVote, DaoExecParams, DaoProposalBulla};
|
|
|
|
|
|
|
|
pub struct DaoExecCall {
|
|
pub struct DaoExecCall {
|
|
|
- pub proposal: DaoProposalInfo,
|
|
|
|
|
- pub dao: DaoInfo,
|
|
|
|
|
|
|
+ pub proposal: DaoProposal,
|
|
|
|
|
+ pub dao: Dao,
|
|
|
pub yes_vote_value: u64,
|
|
pub yes_vote_value: u64,
|
|
|
pub all_vote_value: u64,
|
|
pub all_vote_value: u64,
|
|
|
pub yes_vote_blind: pallas::Scalar,
|
|
pub yes_vote_blind: pallas::Scalar,
|
|
@@ -73,63 +73,31 @@ impl DaoExecCall {
|
|
|
let user_spend_hook = pallas::Base::from(0);
|
|
let user_spend_hook = pallas::Base::from(0);
|
|
|
let user_data = pallas::Base::from(0);
|
|
let user_data = pallas::Base::from(0);
|
|
|
let input_value = pallas::Base::from(self.input_value);
|
|
let input_value = pallas::Base::from(self.input_value);
|
|
|
- let change = input_value - proposal_amount;
|
|
|
|
|
-
|
|
|
|
|
- let dao_bulla = poseidon_hash::<8>([
|
|
|
|
|
- dao_proposer_limit,
|
|
|
|
|
- dao_quorum,
|
|
|
|
|
- dao_approval_ratio_quot,
|
|
|
|
|
- dao_approval_ratio_base,
|
|
|
|
|
- self.dao.gov_token_id.inner(),
|
|
|
|
|
- dao_pub_x,
|
|
|
|
|
- dao_pub_y,
|
|
|
|
|
- self.dao.bulla_blind,
|
|
|
|
|
- ]);
|
|
|
|
|
-
|
|
|
|
|
- let proposal_bulla = DaoProposalBulla::from(poseidon_hash::<6>([
|
|
|
|
|
- proposal_dest_x,
|
|
|
|
|
- proposal_dest_y,
|
|
|
|
|
- proposal_amount,
|
|
|
|
|
- self.proposal.token_id.inner(),
|
|
|
|
|
- dao_bulla,
|
|
|
|
|
- self.proposal.blind,
|
|
|
|
|
- ]));
|
|
|
|
|
-
|
|
|
|
|
- let coin_0 = poseidon_hash::<7>([
|
|
|
|
|
- proposal_dest_x,
|
|
|
|
|
- proposal_dest_y,
|
|
|
|
|
- proposal_amount,
|
|
|
|
|
- self.proposal.token_id.inner(),
|
|
|
|
|
- self.user_serial,
|
|
|
|
|
- user_spend_hook,
|
|
|
|
|
- user_data,
|
|
|
|
|
- ]);
|
|
|
|
|
- debug!("created coin {:?}", coin_0);
|
|
|
|
|
- debug!(" proposal_dest_x: {:?}", proposal_dest_x);
|
|
|
|
|
- debug!(" proposal_dest_y: {:?}", proposal_dest_y);
|
|
|
|
|
- debug!(" proposal_amount: {:?}", proposal_amount);
|
|
|
|
|
- debug!(" proposal.token_id: {:?}", self.proposal.token_id.inner());
|
|
|
|
|
- debug!(" user_serial: {:?}", self.user_serial);
|
|
|
|
|
- debug!(" user_spend_hook: {:?}", user_spend_hook);
|
|
|
|
|
- debug!(" user_data: {:?}", user_data);
|
|
|
|
|
-
|
|
|
|
|
- let coin_1 = poseidon_hash::<7>([
|
|
|
|
|
- dao_pub_x,
|
|
|
|
|
- dao_pub_y,
|
|
|
|
|
- change,
|
|
|
|
|
- self.proposal.token_id.inner(),
|
|
|
|
|
- self.dao_serial,
|
|
|
|
|
- self.hook_dao_exec,
|
|
|
|
|
- dao_bulla,
|
|
|
|
|
- ]);
|
|
|
|
|
- debug!("created coin {:?}", coin_1);
|
|
|
|
|
- debug!(" dao_pub_x: {:?}", dao_pub_x);
|
|
|
|
|
- debug!(" dao_pub_y: {:?}", dao_pub_y);
|
|
|
|
|
- debug!(" change: {:?}", change);
|
|
|
|
|
- debug!(" proposal.token_id: {:?}", self.proposal.token_id.inner());
|
|
|
|
|
- debug!(" dao_serial: {:?}", self.dao_serial);
|
|
|
|
|
- debug!(" hook_dao_exec: {:?}", self.hook_dao_exec);
|
|
|
|
|
- debug!(" dao_bulla: {:?}", dao_bulla);
|
|
|
|
|
|
|
+ let change = self.input_value - self.proposal.amount;
|
|
|
|
|
+
|
|
|
|
|
+ let dao_bulla = self.dao.to_bulla();
|
|
|
|
|
+ assert_eq!(dao_bulla, self.proposal.dao_bulla);
|
|
|
|
|
+ let proposal_bulla = self.proposal.to_bulla();
|
|
|
|
|
+
|
|
|
|
|
+ let coin_0 = CoinParams {
|
|
|
|
|
+ public_key: self.proposal.dest,
|
|
|
|
|
+ value: self.proposal.amount,
|
|
|
|
|
+ token_id: self.proposal.token_id,
|
|
|
|
|
+ serial: self.user_serial,
|
|
|
|
|
+ spend_hook: user_spend_hook,
|
|
|
|
|
+ user_data: user_data,
|
|
|
|
|
+ }.to_coin();
|
|
|
|
|
+ debug!("created coin_0 {:?}", coin_0);
|
|
|
|
|
+
|
|
|
|
|
+ let coin_1 = CoinParams {
|
|
|
|
|
+ public_key: self.dao.public_key,
|
|
|
|
|
+ value: change,
|
|
|
|
|
+ token_id: self.proposal.token_id,
|
|
|
|
|
+ serial: self.dao_serial,
|
|
|
|
|
+ spend_hook: self.hook_dao_exec,
|
|
|
|
|
+ user_data: dao_bulla.inner(),
|
|
|
|
|
+ }.to_coin();
|
|
|
|
|
+ debug!("created coin_1 {:?}", coin_1);
|
|
|
|
|
|
|
|
let yes_vote_commit = pedersen_commitment_u64(self.yes_vote_value, self.yes_vote_blind);
|
|
let yes_vote_commit = pedersen_commitment_u64(self.yes_vote_value, self.yes_vote_blind);
|
|
|
let yes_vote_commit_coords = yes_vote_commit.to_affine().coordinates().unwrap();
|
|
let yes_vote_commit_coords = yes_vote_commit.to_affine().coordinates().unwrap();
|
|
@@ -174,14 +142,14 @@ impl DaoExecCall {
|
|
|
Witness::Base(Value::known(self.input_user_data_blind)),
|
|
Witness::Base(Value::known(self.input_user_data_blind)),
|
|
|
];
|
|
];
|
|
|
|
|
|
|
|
- let input_user_data_enc = poseidon_hash([dao_bulla, self.input_user_data_blind]);
|
|
|
|
|
|
|
+ let input_user_data_enc = poseidon_hash([dao_bulla.inner(), self.input_user_data_blind]);
|
|
|
debug!(target: "dao", "input_user_data_enc: {:?}", input_user_data_enc);
|
|
debug!(target: "dao", "input_user_data_enc: {:?}", input_user_data_enc);
|
|
|
|
|
|
|
|
debug!(target: "dao", "proposal_bulla: {:?}", proposal_bulla);
|
|
debug!(target: "dao", "proposal_bulla: {:?}", proposal_bulla);
|
|
|
let public_inputs = vec![
|
|
let public_inputs = vec![
|
|
|
proposal_bulla.inner(),
|
|
proposal_bulla.inner(),
|
|
|
- coin_0,
|
|
|
|
|
- coin_1,
|
|
|
|
|
|
|
+ coin_0.inner(),
|
|
|
|
|
+ coin_1.inner(),
|
|
|
*yes_vote_commit_coords.x(),
|
|
*yes_vote_commit_coords.x(),
|
|
|
*yes_vote_commit_coords.y(),
|
|
*yes_vote_commit_coords.y(),
|
|
|
*all_vote_commit_coords.x(),
|
|
*all_vote_commit_coords.x(),
|