diff --git a/example/dao/src/contract/dao/exec/validate.rs b/example/dao/src/contract/dao/exec/validate.rs index beb0dd783..aa08a9aab 100644 --- a/example/dao/src/contract/dao/exec/validate.rs +++ b/example/dao/src/contract/dao/exec/validate.rs @@ -172,9 +172,9 @@ pub fn state_transition( if money_transfer_call_data.outputs[0].revealed.coin != Coin(call_data.coin_0) { return Err(Error::InvalidOutput) } - if money_transfer_call_data.outputs[1].revealed.coin != Coin(call_data.coin_1) { - return Err(Error::InvalidOutput) - } + //if money_transfer_call_data.outputs[1].revealed.coin != Coin(call_data.coin_1) { + // return Err(Error::InvalidOutput) + //} // 2. sum of Money::transfer() calldata input_value_commits == our input value commit let mut input_value_commits = pallas::Point::identity(); diff --git a/example/dao/src/main.rs b/example/dao/src/main.rs index 17f452a58..554b995cf 100644 --- a/example/dao/src/main.rs +++ b/example/dao/src/main.rs @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -use std::{any::TypeId, time::Instant}; +use std::{any::{Any, TypeId}, time::Instant}; use incrementalmerkletree::Tree; use log::debug; @@ -29,6 +29,7 @@ use rand::rngs::OsRng; use darkfi::{ crypto::{ + coin::Coin, keypair::{Keypair, PublicKey, SecretKey}, proof::{ProvingKey, VerifyingKey}, types::{DrkSpendHook, DrkUserData, DrkValue}, @@ -1052,8 +1053,7 @@ async fn main() -> Result<()> { serial: dao_serial, coin_blind: dao_coin_blind, spend_hook: *dao::exec::FUNC_ID, - // TODO: should be DAO bulla - user_data: proposal_bulla, + user_data: dao_bulla.0, }, ], }; @@ -1062,7 +1062,7 @@ async fn main() -> Result<()> { let builder = dao::exec::wallet::Builder { proposal, - dao: dao_params, + dao: dao_params.clone(), yes_votes_value, all_votes_value, yes_votes_blind, @@ -1103,6 +1103,45 @@ async fn main() -> Result<()> { assert_eq!(input.revealed.spend_hook, *dao::exec::FUNC_ID); let user_data_enc = poseidon_hash::<2>([dao_bulla.0, user_data_blind]); assert_eq!(input.revealed.user_data_enc, user_data_enc); + + let dao_pubkey_coords = dao_params.public_key.0.to_affine().coordinates().unwrap(); + let coin_1 = Coin(poseidon_hash::<8>([ + *dao_pubkey_coords.x(), + *dao_pubkey_coords.y(), + pallas::Base::from(xdrk_supply - 1000), + xdrk_token_id, + dao_serial, + *dao::exec::FUNC_ID, + dao_bulla.0, + dao_coin_blind + ])); + debug!("coin_1: {:?}", coin_1); + + let money_transfer_call_data = tx.func_calls[0].call_data.as_any(); + let money_transfer_call_data = + money_transfer_call_data.downcast_ref::(); + let money_transfer_call_data = money_transfer_call_data.unwrap(); + assert_eq!( + money_transfer_call_data.type_id(), + TypeId::of::() + ); + assert_eq!(money_transfer_call_data.outputs.len(), 2); + let money_transfer_coin_1 = &money_transfer_call_data.outputs[1].revealed.coin; + debug!("money::transfer() coin 1 = {:?}", money_transfer_coin_1); + + let dao_exec_call_data = tx.func_calls[1].call_data.as_any(); + let dao_exec_call_data = + dao_exec_call_data.downcast_ref::(); + let dao_exec_call_data = dao_exec_call_data.unwrap(); + assert_eq!( + dao_exec_call_data.type_id(), + TypeId::of::() + ); + let dao_exec_coin_1 = &dao_exec_call_data.coin_1; + debug!("dao::exec() coin 1 = {:?}", dao_exec_coin_1); + + assert_eq!(coin_1, *money_transfer_coin_1); + assert_eq!(coin_1, Coin(*dao_exec_coin_1)); } //// Validator