Bladeren bron

drk: dao_import stub.

parazyd 3 jaren geleden
bovenliggende
commit
44579ebcba
6 gewijzigde bestanden met toevoegingen van 85 en 6 verwijderingen
  1. 1 0
      Cargo.lock
  2. 1 0
      bin/drk/Cargo.toml
  3. 28 0
      bin/drk/src/dao.rs
  4. 25 5
      bin/drk/src/main.rs
  5. 29 0
      bin/drk/src/rpc_dao.rs
  6. 1 1
      src/contract/dao/wallet.sql

+ 1 - 0
Cargo.lock

@@ -1577,6 +1577,7 @@ version = "0.3.0"
 dependencies = [
  "anyhow",
  "async-std",
+ "blake3",
  "bs58",
  "clap 4.0.32",
  "darkfi",

+ 1 - 0
bin/drk/Cargo.toml

@@ -14,6 +14,7 @@ pkg-config = "0.3.26"
 [dependencies]
 anyhow = "1.0.68"
 async-std = {version = "1.12.0", features = ["attributes"]}
+blake3 = "1.3.3"
 bs58 = "0.4.0"
 clap = {version = "4.0.32", features = ["derive"]}
 darkfi = {path = "../../", features = ["blockchain", "rpc", "util", "wallet"]}

+ 28 - 0
bin/drk/src/dao.rs

@@ -18,11 +18,13 @@
 
 use darkfi_sdk::{
     crypto::{SecretKey, TokenId},
+    incrementalmerkletree::Position,
     pasta::pallas,
 };
 use darkfi_serial::{SerialDecodable, SerialEncodable};
 
 #[derive(Debug, Clone, SerialEncodable, SerialDecodable)]
+/// Parameters representing a DAO to be initialized
 pub struct DaoParams {
     /// The minimum amount of governance tokens needed to open a proposal
     pub proposer_limit: u64,
@@ -38,3 +40,29 @@ pub struct DaoParams {
     /// DAO bulla blind
     pub bulla_blind: pallas::Base,
 }
+
+#[derive(Debug, Clone)]
+/// Parameters representing an intialized DAO, optionally deployed on-chain
+pub struct Dao {
+    /// Named identifier for the DAO
+    pub name: String,
+    /// The minimum amount of governance tokens needed to open a proposal
+    pub proposer_limit: u64,
+    /// Minimal threshold of participating total tokens needed for a proposal to pass
+    pub quorum: u64,
+    /// The ratio of winning/total votes needed for a proposal to pass
+    pub approval_ratio_base: u64,
+    pub approval_ratio_quot: u64,
+    /// DAO's governance token ID
+    pub gov_token_id: TokenId,
+    /// Secret key for the DAO
+    pub secret_key: SecretKey,
+    /// DAO bulla blind
+    pub bulla_blind: pallas::Base,
+    /// Leaf position of the DAO in the Merkle tree of DAOs
+    pub leaf_position: Option<Position>,
+    /// The transaction hash where the DAO was deployed
+    pub tx_hash: Option<blake3::Hash>,
+    /// The call index in the transaction where the DAO was deployed
+    pub call_index: Option<u32>,
+}

+ 25 - 5
bin/drk/src/main.rs

@@ -57,6 +57,9 @@ mod rpc_transfer;
 mod rpc_swap;
 use rpc_swap::PartialSwapData;
 
+/// DAO methods
+mod rpc_dao;
+
 /// Blockchain methods
 mod rpc_blockchain;
 
@@ -238,16 +241,16 @@ enum DaoSubcmd {
     /// View DAO data from stdin
     View,
 
-    /// List imported DAOs
-    List,
-
     /// Import DAO data from stdin
     Import {
         /// Named identifier for the DAO
         dao_name: String,
     },
 
-    /// Mint a DAO on-chain
+    /// List imported DAOs
+    List,
+
+    /// Mint an imported DAO on-chain
     Mint {
         /// Named identifier for the DAO
         dao_name: String,
@@ -737,7 +740,24 @@ async fn main() -> Result<()> {
                 Ok(())
             }
 
-            DaoSubcmd::Import { dao_name } => todo!(),
+            DaoSubcmd::Import { dao_name } => {
+                let mut buf = String::new();
+                stdin().read_to_string(&mut buf)?;
+                let bytes = bs58::decode(&buf.trim()).into_vec()?;
+                let dao_params: DaoParams = deserialize(&bytes)?;
+
+                let rpc_client = RpcClient::new(args.endpoint.clone())
+                    .await
+                    .with_context(|| "Could not connect to darkfid RPC endpoint")?;
+
+                let drk = Drk { rpc_client };
+
+                drk.dao_import(dao_name, dao_params)
+                    .await
+                    .with_context(|| "Failed to import DAO")?;
+
+                Ok(())
+            }
 
             DaoSubcmd::List => todo!(),
 

+ 29 - 0
bin/drk/src/rpc_dao.rs

@@ -0,0 +1,29 @@
+/* This file is part of DarkFi (https://dark.fi)
+ *
+ * Copyright (C) 2020-2023 Dyne.org foundation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+use anyhow::Result;
+
+use super::Drk;
+use crate::DaoParams;
+
+impl Drk {
+    /// Import given DAO into the wallet
+    pub async fn dao_import(&self, dao_name: String, dao_params: DaoParams) -> Result<()> {
+        Ok(())
+    }
+}

+ 1 - 1
src/contract/dao/wallet.sql

@@ -103,7 +103,7 @@
 
 CREATE TABLE IF NOT EXISTS dao_daos (
 	dao_id INTEGER PRIMARY KEY NOT NULL,
-    name VARCHAR UNIQUE NOT NULL,
+    name BLOB UNIQUE NOT NULL,
     proposer_limit INTEGER NOT NULL,
     -- minimum threshold for total number of votes for proposal to pass.
     -- If there's too little activity then it cannot pass.