rpc.rs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. use std::sync::Arc;
  2. use async_std::sync::Mutex;
  3. use async_trait::async_trait;
  4. use log::debug;
  5. use pasta_curves::{group::ff::PrimeField, pallas};
  6. use std::str::FromStr;
  7. use serde_json::{json, Value};
  8. use darkfi::{
  9. crypto::keypair::PublicKey,
  10. rpc::{
  11. jsonrpc::{ErrorCode::*, JsonError, JsonRequest, JsonResponse, JsonResult},
  12. server::RequestHandler,
  13. },
  14. };
  15. use crate::{
  16. util::{parse_b58, GDRK_ID, XDRK_ID},
  17. Client,
  18. };
  19. pub struct JsonRpcInterface {
  20. client: Arc<Mutex<Client>>,
  21. }
  22. #[async_trait]
  23. impl RequestHandler for JsonRpcInterface {
  24. async fn handle_request(&self, req: JsonRequest) -> JsonResult {
  25. if !req.params.is_array() {
  26. return JsonError::new(InvalidParams, None, req.id).into()
  27. }
  28. let params = req.params.as_array().unwrap();
  29. debug!(target: "RPC", "--> {}", serde_json::to_string(&req).unwrap());
  30. match req.method.as_str() {
  31. Some("create") => return self.create_dao(req.id, params).await,
  32. Some("get_dao_addr") => return self.get_dao_addr(req.id, params).await,
  33. Some("dao_balance") => return self.dao_balance(req.id, params).await,
  34. Some("dao_bulla") => return self.dao_bulla(req.id, params).await,
  35. Some("user_balance") => return self.user_balance(req.id, params).await,
  36. Some("mint") => return self.mint_treasury(req.id, params).await,
  37. Some("keygen") => return self.keygen(req.id, params).await,
  38. Some("airdrop") => return self.airdrop_tokens(req.id, params).await,
  39. Some("propose") => return self.create_proposal(req.id, params).await,
  40. Some("vote") => return self.vote(req.id, params).await,
  41. Some("exec") => return self.execute(req.id, params).await,
  42. Some(_) | None => return JsonError::new(MethodNotFound, None, req.id).into(),
  43. }
  44. }
  45. }
  46. impl JsonRpcInterface {
  47. pub fn new(client: Client) -> Self {
  48. let client = Arc::new(Mutex::new(client));
  49. Self { client }
  50. }
  51. // --> {"method": "create", "params": []}
  52. // <-- {"result": "creating dao..."}
  53. async fn create_dao(&self, id: Value, params: &[Value]) -> JsonResult {
  54. let dao_proposer_limit = params[0].as_u64().unwrap();
  55. let dao_quorum = params[1].as_u64().unwrap();
  56. let dao_approval_ratio_quot = params[2].as_u64().unwrap();
  57. let dao_approval_ratio_base = params[3].as_u64().unwrap();
  58. let mut client = self.client.lock().await;
  59. let dao_bulla = client
  60. .create_dao(
  61. dao_proposer_limit,
  62. dao_quorum,
  63. dao_approval_ratio_quot,
  64. dao_approval_ratio_base,
  65. *GDRK_ID,
  66. )
  67. .unwrap();
  68. let bulla: String = bs58::encode(dao_bulla.to_repr()).into_string();
  69. JsonResponse::new(json!(bulla), id).into()
  70. }
  71. // --> {"method": "get_dao_addr", "params": []}
  72. // <-- {"result": "getting dao public addr..."}
  73. async fn get_dao_addr(&self, id: Value, params: &[Value]) -> JsonResult {
  74. let mut client = self.client.lock().await;
  75. let pubkey = client.dao_wallet.get_public_key();
  76. let addr: String = bs58::encode(pubkey.to_bytes()).into_string();
  77. JsonResponse::new(json!(addr), id).into()
  78. }
  79. async fn dao_balance(&self, id: Value, params: &[Value]) -> JsonResult {
  80. let mut client = self.client.lock().await;
  81. let balance = client.dao_wallet.balances().unwrap();
  82. JsonResponse::new(json!(balance), id).into()
  83. }
  84. async fn dao_bulla(&self, id: Value, params: &[Value]) -> JsonResult {
  85. let mut client = self.client.lock().await;
  86. let dao_bullas = client.dao_wallet.bullas.clone();
  87. let mut bulla_vec = Vec::new();
  88. for bulla in dao_bullas {
  89. let dao_bulla: String = bs58::encode(bulla.0.to_repr()).into_string();
  90. bulla_vec.push(dao_bulla);
  91. }
  92. JsonResponse::new(json!(bulla_vec), id).into()
  93. }
  94. async fn user_balance(&self, id: Value, params: &[Value]) -> JsonResult {
  95. let mut client = self.client.lock().await;
  96. let nym = params[0].as_str().unwrap().to_string();
  97. let wallet = client.money_wallets.get(&nym).unwrap();
  98. let balance = wallet.balances().unwrap();
  99. JsonResponse::new(json!(balance), id).into()
  100. }
  101. // --> {"method": "mint_treasury", "params": []}
  102. // <-- {"result": "minting treasury..."}
  103. async fn mint_treasury(&self, id: Value, params: &[Value]) -> JsonResult {
  104. let mut client = self.client.lock().await;
  105. let token_supply = params[0].as_u64().unwrap();
  106. let addr = params[1].as_str().unwrap();
  107. let dao_addr = PublicKey::from_str(addr).unwrap();
  108. client.mint_treasury(*XDRK_ID, token_supply, dao_addr).unwrap();
  109. //let balance = client.query_dao_balance().unwrap();
  110. JsonResponse::new(json!("minted treasury"), id).into()
  111. }
  112. // Create a new wallet for governance tokens.
  113. async fn keygen(&self, id: Value, params: &[Value]) -> JsonResult {
  114. debug!(target: "dao-demo::rpc::keygen()", "Received keygen request");
  115. let mut client = self.client.lock().await;
  116. let nym = params[0].as_str().unwrap().to_string();
  117. client.new_money_wallet(nym.clone());
  118. let wallet = client.money_wallets.get(&nym).unwrap();
  119. let pubkey = wallet.get_public_key();
  120. let addr: String = bs58::encode(pubkey.to_bytes()).into_string();
  121. JsonResponse::new(json!(addr), id).into()
  122. }
  123. // --> {"method": "airdrop_tokens", "params": []}
  124. // <-- {"result": "airdropping tokens..."}
  125. async fn airdrop_tokens(&self, id: Value, params: &[Value]) -> JsonResult {
  126. let mut client = self.client.lock().await;
  127. let zk_bins = &client.zk_bins;
  128. let nym = params[0].as_str().unwrap().to_string();
  129. let value = params[1].as_u64().unwrap();
  130. client.airdrop_user(value, *GDRK_ID, nym.clone()).unwrap();
  131. //let balance = client.query_balance(nym.clone()).unwrap();
  132. JsonResponse::new(json!("tokens airdropped"), id).into()
  133. }
  134. // --> {"method": "create_proposal", "params": []}
  135. // <-- {"result": "creating proposal..."}
  136. // TODO: pass string 'alice' and dao bulla
  137. async fn create_proposal(&self, id: Value, params: &[Value]) -> JsonResult {
  138. let mut client = self.client.lock().await;
  139. let sender = params[0].as_str().unwrap().to_string();
  140. let recipient = params[1].as_str().unwrap();
  141. let amount = params[2].as_u64().unwrap();
  142. let recv_addr = PublicKey::from_str(recipient).unwrap();
  143. let (proposal, proposal_bulla) =
  144. client.propose(recv_addr, *XDRK_ID, amount, sender).unwrap();
  145. let bulla: String = bs58::encode(proposal_bulla.to_repr()).into_string();
  146. let token_id: String = bs58::encode(proposal.token_id.to_repr()).into_string();
  147. let addr: String = bs58::encode(proposal.dest.to_bytes()).into_string();
  148. let mut proposal_vec = Vec::new();
  149. proposal_vec.push("Proposal now active!".to_string());
  150. proposal_vec.push(format!("destination: {:?}", addr.to_string()));
  151. proposal_vec.push(format!("amount: {:?}", proposal.amount.to_string()));
  152. proposal_vec.push(format!("token_id: {:?}", token_id));
  153. proposal_vec.push(format!("bulla: {:?}", bulla));
  154. JsonResponse::new(json!(proposal_vec), id).into()
  155. }
  156. // --> {"method": "vote", "params": []}
  157. // <-- {"result": "voting..."}
  158. // TODO: pass string 'alice', dao bulla, and Proposal
  159. // TODO: must pass yes or no, convert to bool
  160. async fn vote(&self, id: Value, _params: &[Value]) -> JsonResult {
  161. let mut client = self.client.lock().await;
  162. // let dao_params = self.client.client.dao_wallet.params.get(bulla);
  163. // let dao_key = self.client.client.dao_wallet.keypair.private;
  164. //
  165. // client.client.money_wallets.get(alice) {
  166. // Some(wallet) => {
  167. // wallet.vote(dao_params)
  168. // let tx = wallet.vote(dao_params, vote_option, proposal)
  169. // client.client.validate(tx);
  170. // client.client.dao_wallet.read_vote(tx);
  171. // }
  172. // }
  173. //
  174. JsonResponse::new(json!("voted"), id).into()
  175. }
  176. // --> {"method": "execute", "params": []}
  177. // <-- {"result": "executing..."}
  178. async fn execute(&self, id: Value, _params: &[Value]) -> JsonResult {
  179. let mut client = self.client.lock().await;
  180. // client.client.dao_wallet.build_exec_tx(proposal, proposal_bulla)
  181. //client.exec().unwrap();
  182. JsonResponse::new(json!("executed"), id).into()
  183. }
  184. }