From c3ec05b572787f11847355f2e4ebf6cce7996044 Mon Sep 17 00:00:00 2001 From: narodnik Date: Tue, 16 Aug 2022 07:13:38 +0200 Subject: [PATCH] be more strict at wallet/validate separation --- bin/daod/src/dao_contract/mint/mod.rs | 5 +-- .../mint/{builder.rs => wallet.rs} | 0 bin/daod/src/dao_contract/mod.rs | 4 ++ bin/daod/src/demo.rs | 45 +++++++++++++------ bin/daod/src/money_contract/transfer/mod.rs | 3 +- .../src/money_contract/transfer/validate.rs | 2 +- .../transfer/{ => wallet}/builder.rs | 0 .../transfer/{ => wallet}/partial.rs | 0 8 files changed, 39 insertions(+), 20 deletions(-) rename bin/daod/src/dao_contract/mint/{builder.rs => wallet.rs} (100%) rename bin/daod/src/money_contract/transfer/{ => wallet}/builder.rs (100%) rename bin/daod/src/money_contract/transfer/{ => wallet}/partial.rs (100%) diff --git a/bin/daod/src/dao_contract/mint/mod.rs b/bin/daod/src/dao_contract/mint/mod.rs index 8a9475162..6a9f7ec81 100644 --- a/bin/daod/src/dao_contract/mint/mod.rs +++ b/bin/daod/src/dao_contract/mint/mod.rs @@ -1,3 +1,4 @@ +pub mod validate; /// This is an anonymous contract function that mutates the internal DAO state. /// /// Corresponds to `mint(proposer_limit, quorum, approval_ratio, dao_pubkey, dao_blind)` @@ -32,6 +33,4 @@ /// ); /// let tx = builder.build(); /// ``` -pub mod builder; -pub mod validate; -pub use builder::Builder; +pub mod wallet; diff --git a/bin/daod/src/dao_contract/mint/builder.rs b/bin/daod/src/dao_contract/mint/wallet.rs similarity index 100% rename from bin/daod/src/dao_contract/mint/builder.rs rename to bin/daod/src/dao_contract/mint/wallet.rs diff --git a/bin/daod/src/dao_contract/mod.rs b/bin/daod/src/dao_contract/mod.rs index 28b76d5a0..444feb11b 100644 --- a/bin/daod/src/dao_contract/mod.rs +++ b/bin/daod/src/dao_contract/mod.rs @@ -1,6 +1,10 @@ #![allow(unused)] +// mint() pub mod mint; +// propose() +pub mod propose; + pub mod state; pub use state::{DaoBulla, State}; diff --git a/bin/daod/src/demo.rs b/bin/daod/src/demo.rs index 6f8146f58..30d9da5c0 100644 --- a/bin/daod/src/demo.rs +++ b/bin/daod/src/demo.rs @@ -268,7 +268,7 @@ pub async fn demo() -> Result<()> { let dao_bulla_blind = pallas::Base::random(&mut OsRng); // Create DAO mint tx - let builder = dao_contract::mint::Builder::new( + let builder = dao_contract::mint::wallet::Builder::new( dao_proposer_limit, dao_quorum, dao_approval_ratio, @@ -325,14 +325,14 @@ pub async fn demo() -> Result<()> { // In out case, it's the bulla for the DAO let user_data = dao_bulla.0; - let builder = money_contract::transfer::builder::Builder { - clear_inputs: vec![money_contract::transfer::builder::BuilderClearInputInfo { + let builder = money_contract::transfer::wallet::Builder { + clear_inputs: vec![money_contract::transfer::wallet::BuilderClearInputInfo { value: xdrk_supply, token_id: xdrk_token_id, signature_secret: cashier_signature_secret, }], inputs: vec![], - outputs: vec![money_contract::transfer::builder::BuilderOutputInfo { + outputs: vec![money_contract::transfer::wallet::BuilderOutputInfo { value: xdrk_supply, token_id: xdrk_token_id, public: dao_keypair.public, @@ -376,7 +376,7 @@ pub async fn demo() -> Result<()> { let output = &call_data.outputs[0]; let enc_note = &output.enc_note; // Try to decrypt the note - let note: money_contract::transfer::builder::Note = + let note: money_contract::transfer::wallet::Note = enc_note.decrypt(&dao_keypair.secret).unwrap(); // Check the actual coin received is valid before accepting it @@ -422,7 +422,7 @@ pub async fn demo() -> Result<()> { let spend_hook = DrkSpendHook::from(0); let user_data = DrkUserData::from(0); - let output1 = money_contract::transfer::builder::BuilderOutputInfo { + let output1 = money_contract::transfer::wallet::BuilderOutputInfo { value: 400000, token_id: gdrk_token_id, public: keypair1.public, @@ -430,7 +430,7 @@ pub async fn demo() -> Result<()> { user_data, }; - let output2 = money_contract::transfer::builder::BuilderOutputInfo { + let output2 = money_contract::transfer::wallet::BuilderOutputInfo { value: 400000, token_id: gdrk_token_id, public: keypair2.public, @@ -438,7 +438,7 @@ pub async fn demo() -> Result<()> { user_data, }; - let output3 = money_contract::transfer::builder::BuilderOutputInfo { + let output3 = money_contract::transfer::wallet::BuilderOutputInfo { value: 200000, token_id: gdrk_token_id, public: keypair3.public, @@ -448,8 +448,8 @@ pub async fn demo() -> Result<()> { assert!(2 * 400000 + 200000 == gdrk_supply); - let builder = money_contract::transfer::builder::Builder { - clear_inputs: vec![money_contract::transfer::builder::BuilderClearInputInfo { + let builder = money_contract::transfer::wallet::Builder { + clear_inputs: vec![money_contract::transfer::wallet::BuilderClearInputInfo { value: gdrk_supply, token_id: gdrk_token_id, signature_secret: cashier_signature_secret, @@ -477,7 +477,7 @@ pub async fn demo() -> Result<()> { tx.zk_verify(&zk_bins); // We need this to keep track of Notes - let mut notes: [Option; 3] = [None, None, None]; + let mut notes: [Option; 3] = [None, None, None]; //// Wallet stuff //// Holders read the money received from the encrypted note @@ -498,7 +498,7 @@ pub async fn demo() -> Result<()> { for output in &call_data.outputs { let enc_note = &output.enc_note; // Try to decrypt the note - let note: darkfi::Result = + let note: darkfi::Result = enc_note.decrypt(&key.secret); match note { @@ -517,7 +517,7 @@ pub async fn demo() -> Result<()> { ]); assert_eq!(coin, output.revealed.coin.0); - debug!("Holder{} received a coin worth {} xDRK", i, note.value); + debug!("Holder{} received a coin worth {} gDRK", i, note.value); notes[i] = Some(note); } @@ -528,7 +528,24 @@ pub async fn demo() -> Result<()> { } } - //let x = pallas::Base::from(0); + /////////////////////////////////////////////////// + // DAO rules: + // 1. gov token IDs must match on all inputs + // 2. proposals must be submitted by minimum amount + // 3. all votes >= quorum + // 4. outcome > approval_ratio + // 5. structure of outputs + // output 0: value and address + // output 1: change address + /////////////////////////////////////////////////// + + /////////////////////////////////////////////////// + // Propose the vote + // In order to make a valid vote, first the proposer must + // meet a criteria for a minimum number of gov tokens + /////////////////////////////////////////////////// + + // TODO: look into proposal expiry once time for voting has finished Ok(()) } diff --git a/bin/daod/src/money_contract/transfer/mod.rs b/bin/daod/src/money_contract/transfer/mod.rs index 9ae7dddd0..e2d447d65 100644 --- a/bin/daod/src/money_contract/transfer/mod.rs +++ b/bin/daod/src/money_contract/transfer/mod.rs @@ -1,3 +1,2 @@ -pub mod builder; -pub mod partial; pub mod validate; +pub mod wallet; diff --git a/bin/daod/src/money_contract/transfer/validate.rs b/bin/daod/src/money_contract/transfer/validate.rs index 2c98832fb..71fc06760 100644 --- a/bin/daod/src/money_contract/transfer/validate.rs +++ b/bin/daod/src/money_contract/transfer/validate.rs @@ -32,7 +32,7 @@ use crate::{ demo::{CallDataBase, StateRegistry, Transaction}, money_contract::{ state::State, - transfer::partial::{PartialClearInput, PartialInput}, + transfer::wallet::partial::{PartialClearInput, PartialInput}, }, note::EncryptedNote2, }; diff --git a/bin/daod/src/money_contract/transfer/builder.rs b/bin/daod/src/money_contract/transfer/wallet/builder.rs similarity index 100% rename from bin/daod/src/money_contract/transfer/builder.rs rename to bin/daod/src/money_contract/transfer/wallet/builder.rs diff --git a/bin/daod/src/money_contract/transfer/partial.rs b/bin/daod/src/money_contract/transfer/wallet/partial.rs similarity index 100% rename from bin/daod/src/money_contract/transfer/partial.rs rename to bin/daod/src/money_contract/transfer/wallet/partial.rs