From 48206a0eaa8a9374dbad7d57673d7a559804c44e Mon Sep 17 00:00:00 2001 From: parazyd Date: Tue, 10 Jan 2023 14:13:45 +0100 Subject: [PATCH] drk: DAO import. --- bin/drk/src/main.rs | 9 ++++--- bin/drk/src/rpc_dao.rs | 57 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/bin/drk/src/main.rs b/bin/drk/src/main.rs index 2bb452f6e..dd5ca1875 100644 --- a/bin/drk/src/main.rs +++ b/bin/drk/src/main.rs @@ -247,8 +247,11 @@ enum DaoSubcmd { dao_name: String, }, - /// List imported DAOs - List, + /// List imported DAOs (or info about a specific one) + List { + /// Named identifier for the DAO (optional) + dao_name: Option, + }, /// Mint an imported DAO on-chain Mint { @@ -759,7 +762,7 @@ async fn main() -> Result<()> { Ok(()) } - DaoSubcmd::List => todo!(), + DaoSubcmd::List { dao_name } => todo!(), DaoSubcmd::Mint { dao_name } => todo!(), diff --git a/bin/drk/src/rpc_dao.rs b/bin/drk/src/rpc_dao.rs index b3280235b..024538437 100644 --- a/bin/drk/src/rpc_dao.rs +++ b/bin/drk/src/rpc_dao.rs @@ -16,7 +16,15 @@ * along with this program. If not, see . */ -use anyhow::Result; +use anyhow::{anyhow, Result}; +use darkfi::{rpc::jsonrpc::JsonRequest, wallet::walletdb::QueryType}; +use darkfi_dao_contract::dao_client::{ + DAO_DAOS_COL_APPROVAL_RATIO_BASE, DAO_DAOS_COL_APPROVAL_RATIO_QUOT, DAO_DAOS_COL_BULLA_BLIND, + DAO_DAOS_COL_DAO_ID, DAO_DAOS_COL_GOV_TOKEN_ID, DAO_DAOS_COL_NAME, DAO_DAOS_COL_PROPOSER_LIMIT, + DAO_DAOS_COL_QUORUM, DAO_DAOS_COL_SECRET, DAO_DAOS_TABLE, +}; +use darkfi_serial::serialize; +use serde_json::json; use super::Drk; use crate::DaoParams; @@ -24,6 +32,53 @@ use crate::DaoParams; impl Drk { /// Import given DAO into the wallet pub async fn dao_import(&self, dao_name: String, dao_params: DaoParams) -> Result<()> { + // First let's check if we've imported this DAO before. We use the name + // as the identifier. + let query = format!( + "SELECT {} FROM {} WHERE {} = {}", + DAO_DAOS_COL_DAO_ID, DAO_DAOS_TABLE, DAO_DAOS_COL_NAME, dao_name + ); + let params = json!([query, QueryType::Integer as u8, DAO_DAOS_COL_DAO_ID]); + let req = JsonRequest::new("wallet.query_row_single", params); + + if (self.rpc_client.request(req).await).is_ok() { + return Err(anyhow!("DAO \"{}\" already imported in wallet.", dao_name)) + } + + eprintln!("Importing \"{}\" DAO into wallet", dao_name); + + let query = format!( + "INSERT INTO {} ({}, {}, {}, {}, {}, {}, {}, {}) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8);", + DAO_DAOS_TABLE, DAO_DAOS_COL_NAME, DAO_DAOS_COL_PROPOSER_LIMIT, + DAO_DAOS_COL_QUORUM, DAO_DAOS_COL_APPROVAL_RATIO_BASE, DAO_DAOS_COL_APPROVAL_RATIO_QUOT, + DAO_DAOS_COL_GOV_TOKEN_ID, DAO_DAOS_COL_SECRET, DAO_DAOS_COL_BULLA_BLIND, + ); + + let params = json!([ + query, + QueryType::Blob as u8, + serialize(&dao_name), + QueryType::Integer as u8, + dao_params.proposer_limit, + QueryType::Integer as u8, + dao_params.quorum, + QueryType::Integer as u8, + dao_params.approval_ratio_base, + QueryType::Integer as u8, + dao_params.approval_ratio_quot, + QueryType::Blob as u8, + serialize(&dao_params.gov_token_id), + QueryType::Blob as u8, + serialize(&dao_params.secret_key), + QueryType::Blob as u8, + serialize(&dao_params.bulla_blind), + ]); + + eprintln!("Executing JSON-RPC request to add DAO to wallet"); + let req = JsonRequest::new("wallet.exec_sql", params); + self.rpc_client.request(req).await?; + eprintln!("DAO imported successfully"); + Ok(()) } }