Ver Fonte

daod: change dao_approval_ratio to two values, ratio_quot and ratio_base. check ratio_quot/ratio_base <= yes_votes/all_votes in dao_exec

lunar-mining há 3 anos atrás
pai
commit
ef20403c22

+ 12 - 13
bin/daod/proof/dao-exec.zk

@@ -15,7 +15,8 @@ contract "DaoExec" {
     # DAO params
     Base dao_proposer_limit,
     Base dao_quorum,
-    Base dao_approval_ratio,
+    Base dao_approval_ratio_quot,
+    Base dao_approval_ratio_base,
     Base gov_token_id,
     Base dao_public_x,
     Base dao_public_y,
@@ -45,13 +46,12 @@ circuit "DaoExec" {
     dao_bulla = poseidon_hash(
         dao_proposer_limit,
         dao_quorum,
-        dao_approval_ratio,
+        dao_approval_ratio_quot,
+        dao_approval_ratio_base,
         gov_token_id,
         dao_public_x,
         dao_public_y,
         dao_bulla_blind,
-        # @tmp-workaround
-        dao_bulla_blind,
     );
     # Proposal bulla is valid means DAO bulla is also valid
     # because of dao-propose-main.zk, already checks that when
@@ -139,19 +139,18 @@ circuit "DaoExec" {
     all_votes_value_1 = base_add(all_votes_value, one);
     less_than(dao_quorum, all_votes_value_1);
 
-    # win_votes / total_votes >= approval_ratio_quot / approval_ratio_base
+    # approval_ratio_quot / approval_ratio_base <= yes_votes / all_votes
     #
     # The above is also equivalent to this:
     #
-    # win_votes * approval_ratio_base >= total_votes * approval_ratio_quot
-    #
-    # TODO: waiting on this opcode in zkas
-    #
-    #     lhs = base_mul(win_votes, approval_ratio_base);
-    #     rhs = base_mul(total_votes, approval_ratio_quot);
-    #     greater_than_or_equal(lhs, rhs);
-    #
+    # all_votes * approval_ratio_quot <= yes_votes * approval_ratio_base
+
+    rhs = base_mul(all_votes_value, dao_approval_ratio_quot);
+    lhs = base_mul(yes_votes_value, dao_approval_ratio_base);
 
+    lhs_1 = base_add(lhs, one);
+    less_than(rhs, lhs_1);
+    
     ####
 
     # Create coin 0

+ 4 - 4
bin/daod/proof/dao-mint.zk

@@ -4,7 +4,8 @@ constant "DaoMint" {
 contract "DaoMint" {
     Base dao_proposer_limit,
     Base dao_quorum,
-    Base dao_approval_ratio,
+    Base dao_approval_ratio_quot,
+    Base dao_approval_ratio_base,
     Base gdrk_token_id,
     Base dao_public_x,
     Base dao_public_y,
@@ -19,13 +20,12 @@ circuit "DaoMint" {
     bulla = poseidon_hash(
         dao_proposer_limit,
         dao_quorum,
-        dao_approval_ratio,
+        dao_approval_ratio_quot,
+        dao_approval_ratio_base,
         gdrk_token_id,
         dao_public_x,
         dao_public_y,
         dao_bulla_blind,
-        # @tmp-workaround
-        dao_bulla_blind,
     );
     constrain_instance(bulla);
 }

+ 4 - 4
bin/daod/proof/dao-propose-main.zk

@@ -22,7 +22,8 @@ contract "DaoProposeMain" {
     # DAO params
     Base dao_proposer_limit,
     Base dao_quorum,
-    Base dao_approval_ratio,
+    Base dao_approval_ratio_quot,
+    Base dao_approval_ratio_base,
     Base gov_token_id,
     Base dao_public_x,
     Base dao_public_y,
@@ -39,13 +40,12 @@ circuit "DaoProposeMain" {
     dao_bulla = poseidon_hash(
         dao_proposer_limit,
         dao_quorum,
-        dao_approval_ratio,
+        dao_approval_ratio_quot,
+        dao_approval_ratio_base,
         gov_token_id,
         dao_public_x,
         dao_public_y,
         dao_bulla_blind,
-        # @tmp-workaround
-        dao_bulla_blind,
     );
 	dao_root = merkle_root(dao_leaf_pos, dao_path, dao_bulla);
 	constrain_instance(dao_root);

+ 4 - 4
bin/daod/proof/dao-vote-main.zk

@@ -15,7 +15,8 @@ contract "DaoVoteMain" {
     # DAO params
     Base dao_proposer_limit,
     Base dao_quorum,
-    Base dao_approval_ratio,
+    Base dao_approval_ratio_quot,
+    Base dao_approval_ratio_base,
     Base gov_token_id,
     Base dao_public_x,
     Base dao_public_y,
@@ -40,13 +41,12 @@ circuit "DaoVoteMain" {
     dao_bulla = poseidon_hash(
         dao_proposer_limit,
         dao_quorum,
-        dao_approval_ratio,
+        dao_approval_ratio_quot,
+        dao_approval_ratio_base,
         gov_token_id,
         dao_public_x,
         dao_public_y,
         dao_bulla_blind,
-        # @tmp-workaround
-        dao_bulla_blind,
     );
     # Proposal bulla is valid means DAO bulla is also valid
     # because of dao-propose-main.zk, already checks that when

+ 6 - 5
bin/daod/src/dao_contract/exec/wallet.rs

@@ -49,7 +49,8 @@ impl Builder {
 
         let dao_proposer_limit = pallas::Base::from(self.dao.proposer_limit);
         let dao_quorum = pallas::Base::from(self.dao.quorum);
-        let dao_approval_ratio = pallas::Base::from(self.dao.approval_ratio);
+        let dao_approval_ratio_quot = pallas::Base::from(self.dao.approval_ratio_quot);
+        let dao_approval_ratio_base = pallas::Base::from(self.dao.approval_ratio_base);
 
         let dao_pubkey_coords = self.dao.public_key.0.to_affine().coordinates().unwrap();
 
@@ -61,13 +62,12 @@ impl Builder {
         let dao_bulla = poseidon_hash::<8>([
             dao_proposer_limit,
             dao_quorum,
-            dao_approval_ratio,
+            dao_approval_ratio_quot,
+            dao_approval_ratio_base,
             self.dao.gov_token_id,
             *dao_pubkey_coords.x(),
             *dao_pubkey_coords.y(),
             self.dao.bulla_blind,
-            // @tmp-workaround
-            self.dao.bulla_blind,
         ]);
 
         let proposal_bulla = poseidon_hash::<8>([
@@ -133,7 +133,8 @@ impl Builder {
             // DAO params
             Witness::Base(Value::known(dao_proposer_limit)),
             Witness::Base(Value::known(dao_quorum)),
-            Witness::Base(Value::known(dao_approval_ratio)),
+            Witness::Base(Value::known(dao_approval_ratio_quot)),
+            Witness::Base(Value::known(dao_approval_ratio_base)),
             Witness::Base(Value::known(self.dao.gov_token_id)),
             Witness::Base(Value::known(*dao_pubkey_coords.x())),
             Witness::Base(Value::known(*dao_pubkey_coords.y())),

+ 10 - 7
bin/daod/src/dao_contract/mint/wallet.rs

@@ -21,7 +21,8 @@ use crate::{
 pub struct DaoParams {
     pub proposer_limit: u64,
     pub quorum: u64,
-    pub approval_ratio: u64,
+    pub approval_ratio_quot: u64,
+    pub approval_ratio_base: u64,
     pub gov_token_id: pallas::Base,
     pub public_key: PublicKey,
     pub bulla_blind: pallas::Base,
@@ -30,7 +31,8 @@ pub struct DaoParams {
 pub struct Builder {
     pub dao_proposer_limit: u64,
     pub dao_quorum: u64,
-    pub dao_approval_ratio: u64,
+    pub dao_approval_ratio_quot: u64,
+    pub dao_approval_ratio_base: u64,
     pub gov_token_id: pallas::Base,
     pub dao_pubkey: PublicKey,
     pub dao_bulla_blind: pallas::Base,
@@ -43,20 +45,20 @@ impl Builder {
         // Dao bulla
         let dao_proposer_limit = pallas::Base::from(self.dao_proposer_limit);
         let dao_quorum = pallas::Base::from(self.dao_quorum);
-        let dao_approval_ratio = pallas::Base::from(self.dao_approval_ratio);
+        let dao_approval_ratio_quot = pallas::Base::from(self.dao_approval_ratio_quot);
+        let dao_approval_ratio_base = pallas::Base::from(self.dao_approval_ratio_base);
 
         let dao_pubkey_coords = self.dao_pubkey.0.to_affine().coordinates().unwrap();
 
         let dao_bulla = poseidon_hash::<8>([
             dao_proposer_limit,
             dao_quorum,
-            dao_approval_ratio,
+            dao_approval_ratio_quot,
+            dao_approval_ratio_base,
             self.gov_token_id,
             *dao_pubkey_coords.x(),
             *dao_pubkey_coords.y(),
             self.dao_bulla_blind,
-            // @tmp-workaround
-            self.dao_bulla_blind,
         ]);
         let dao_bulla = DaoBulla(dao_bulla);
 
@@ -71,7 +73,8 @@ impl Builder {
         let prover_witnesses = vec![
             Witness::Base(Value::known(dao_proposer_limit)),
             Witness::Base(Value::known(dao_quorum)),
-            Witness::Base(Value::known(dao_approval_ratio)),
+            Witness::Base(Value::known(dao_approval_ratio_quot)),
+            Witness::Base(Value::known(dao_approval_ratio_base)),
             Witness::Base(Value::known(self.gov_token_id)),
             Witness::Base(Value::known(*dao_pubkey_coords.x())),
             Witness::Base(Value::known(*dao_pubkey_coords.y())),

+ 6 - 5
bin/daod/src/dao_contract/propose/wallet.rs

@@ -172,20 +172,20 @@ impl Builder {
 
         let dao_proposer_limit = pallas::Base::from(self.dao.proposer_limit);
         let dao_quorum = pallas::Base::from(self.dao.quorum);
-        let dao_approval_ratio = pallas::Base::from(self.dao.approval_ratio);
+        let dao_approval_ratio_quot = pallas::Base::from(self.dao.approval_ratio_quot);
+        let dao_approval_ratio_base = pallas::Base::from(self.dao.approval_ratio_base);
 
         let dao_pubkey_coords = self.dao.public_key.0.to_affine().coordinates().unwrap();
 
         let dao_bulla = poseidon_hash::<8>([
             dao_proposer_limit,
             dao_quorum,
-            dao_approval_ratio,
+            dao_approval_ratio_quot,
+            dao_approval_ratio_base,
             self.dao.gov_token_id,
             *dao_pubkey_coords.x(),
             *dao_pubkey_coords.y(),
             self.dao.bulla_blind,
-            // @tmp-workaround
-            self.dao.bulla_blind,
         ]);
 
         let dao_leaf_position: u64 = self.dao_leaf_position.into();
@@ -225,7 +225,8 @@ impl Builder {
             // DAO params
             Witness::Base(Value::known(dao_proposer_limit)),
             Witness::Base(Value::known(dao_quorum)),
-            Witness::Base(Value::known(dao_approval_ratio)),
+            Witness::Base(Value::known(dao_approval_ratio_quot)),
+            Witness::Base(Value::known(dao_approval_ratio_base)),
             Witness::Base(Value::known(self.dao.gov_token_id)),
             Witness::Base(Value::known(*dao_pubkey_coords.x())),
             Witness::Base(Value::known(*dao_pubkey_coords.y())),

+ 6 - 5
bin/daod/src/dao_contract/vote/wallet.rs

@@ -181,20 +181,20 @@ impl Builder {
 
         let dao_proposer_limit = pallas::Base::from(self.dao.proposer_limit);
         let dao_quorum = pallas::Base::from(self.dao.quorum);
-        let dao_approval_ratio = pallas::Base::from(self.dao.approval_ratio);
+        let dao_approval_ratio_quot = pallas::Base::from(self.dao.approval_ratio_quot);
+        let dao_approval_ratio_base = pallas::Base::from(self.dao.approval_ratio_base);
 
         let dao_pubkey_coords = self.dao.public_key.0.to_affine().coordinates().unwrap();
 
         let dao_bulla = poseidon_hash::<8>([
             dao_proposer_limit,
             dao_quorum,
-            dao_approval_ratio,
+            dao_approval_ratio_quot,
+            dao_approval_ratio_base,
             self.dao.gov_token_id,
             *dao_pubkey_coords.x(),
             *dao_pubkey_coords.y(),
             self.dao.bulla_blind,
-            // @tmp-workaround
-            self.dao.bulla_blind,
         ]);
 
         let proposal_bulla = poseidon_hash::<8>([
@@ -238,7 +238,8 @@ impl Builder {
             // DAO params
             Witness::Base(Value::known(dao_proposer_limit)),
             Witness::Base(Value::known(dao_quorum)),
-            Witness::Base(Value::known(dao_approval_ratio)),
+            Witness::Base(Value::known(dao_approval_ratio_quot)),
+            Witness::Base(Value::known(dao_approval_ratio_base)),
             Witness::Base(Value::known(self.dao.gov_token_id)),
             Witness::Base(Value::known(*dao_pubkey_coords.x())),
             Witness::Base(Value::known(*dao_pubkey_coords.y())),

+ 6 - 4
bin/daod/src/demo.rs

@@ -315,8 +315,8 @@ pub async fn demo() -> Result<()> {
     // DAO parameters
     let dao_proposer_limit = 110;
     let dao_quorum = 110;
-    // TODO: should be 2:1
-    let dao_approval_ratio = 2;
+    let dao_approval_ratio_quot = 1;
+    let dao_approval_ratio_base = 2;
 
     // Lookup table for smart contract states
     let mut states = StateRegistry::new();
@@ -400,7 +400,8 @@ pub async fn demo() -> Result<()> {
     let builder = dao_contract::mint::wallet::Builder {
         dao_proposer_limit,
         dao_quorum,
-        dao_approval_ratio,
+        dao_approval_ratio_quot,
+        dao_approval_ratio_base,
         gov_token_id: gdrk_token_id,
         dao_pubkey: dao_keypair.public,
         dao_bulla_blind,
@@ -755,7 +756,8 @@ pub async fn demo() -> Result<()> {
     let dao_params = dao_contract::mint::wallet::DaoParams {
         proposer_limit: dao_proposer_limit,
         quorum: dao_quorum,
-        approval_ratio: dao_approval_ratio,
+        approval_ratio_base: dao_approval_ratio_base,
+        approval_ratio_quot: dao_approval_ratio_quot,
         gov_token_id: gdrk_token_id,
         public_key: dao_keypair.public,
         bulla_blind: dao_bulla_blind,