client_adapter.rs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. use crate::client::{Client, ClientFailed};
  2. use crate::serial::{deserialize, serialize, Decodable};
  3. use crate::service::CashierClient;
  4. use crate::{Error, Result};
  5. use jsonrpc_core::BoxFuture;
  6. use jsonrpc_derive::rpc;
  7. use log::*;
  8. use async_std::sync::{Arc, Mutex};
  9. use futures::FutureExt;
  10. /// Rpc trait
  11. #[rpc(server)]
  12. pub trait RpcClient {
  13. /// say hello
  14. #[rpc(name = "say_hello")]
  15. fn say_hello(&self) -> Result<String>;
  16. /// get key
  17. #[rpc(name = "get_key")]
  18. fn get_key(&self) -> BoxFuture<Result<String>>;
  19. /// create wallet
  20. #[rpc(name = "create_wallet")]
  21. fn create_wallet(&self) -> BoxFuture<Result<String>>;
  22. /// key gen
  23. #[rpc(name = "key_gen")]
  24. fn key_gen(&self) -> BoxFuture<Result<String>>;
  25. /// transfer
  26. #[rpc(name = "transfer")]
  27. fn transfer(&self, asset_id: u64, pub_key: Vec<u8>, amount: f64) -> BoxFuture<Result<String>>;
  28. /// withdraw
  29. #[rpc(name = "withdraw")]
  30. fn withdraw(&self, asset_id: u64, pub_key: Vec<u8>, amount: f64) -> BoxFuture<Result<String>>;
  31. /// deposit
  32. #[rpc(name = "deposit")]
  33. fn deposit(&self, asset_id: u64) -> BoxFuture<Result<String>>;
  34. }
  35. pub struct RpcClientAdapter {
  36. client: Arc<Mutex<Client>>,
  37. cashier_client: Arc<Mutex<CashierClient>>,
  38. }
  39. impl RpcClientAdapter {
  40. pub fn new(client: Arc<Mutex<Client>>, cashier_client: Arc<Mutex<CashierClient>>) -> Self {
  41. Self {
  42. client,
  43. cashier_client,
  44. }
  45. }
  46. async fn get_key_process(client: Arc<Mutex<Client>>) -> Result<String> {
  47. let key_public = client.lock().await.state.wallet.get_public_keys()?[0];
  48. let bs58_address = bs58::encode(serialize(&key_public)).into_string();
  49. Ok(bs58_address)
  50. }
  51. async fn create_wallet_process(client: Arc<Mutex<Client>>) -> Result<String> {
  52. client.lock().await.state.wallet.init_db()?;
  53. Ok("wallet creation successful".into())
  54. }
  55. async fn key_gen_process(client: Arc<Mutex<Client>>) -> Result<String> {
  56. debug!(target: "RPC USER ADAPTER", "Generating keypair...");
  57. debug!(target: "RPC USER ADAPTER", "Attempting to write to database...");
  58. client.lock().await.state.wallet.key_gen()?;
  59. Ok("key generation successful".into())
  60. }
  61. async fn transfer_process(
  62. client: Arc<Mutex<Client>>,
  63. asset_id: u64,
  64. address: Vec<u8>,
  65. amount: f64,
  66. ) -> Result<String> {
  67. let pub_key: String = deserialize(&address)?;
  68. let address = bs58::decode(pub_key.clone())
  69. .into_vec()
  70. .map_err(|_| ClientFailed::UnvalidAddress(pub_key.clone()))?;
  71. let address: jubjub::SubgroupPoint =
  72. deserialize(&address).map_err(|_| ClientFailed::UnvalidAddress(pub_key))?;
  73. client
  74. .lock()
  75. .await
  76. .transfer(asset_id, address.clone(), amount)
  77. .await?;
  78. Ok(format!("transfered {} DRK to {}", amount, address))
  79. }
  80. async fn withdraw_process(
  81. client: Arc<Mutex<Client>>,
  82. cashier_client: Arc<Mutex<CashierClient>>,
  83. asset_id: u64,
  84. address: Vec<u8>,
  85. amount: f64,
  86. ) -> Result<String> {
  87. let drk_public = cashier_client
  88. .lock()
  89. .await
  90. .withdraw(asset_id, address)
  91. .await
  92. .map_err(|err| ClientFailed::from(err))?;
  93. if let Some(drk_addr) = drk_public {
  94. client
  95. .lock()
  96. .await
  97. .transfer(asset_id, drk_addr.clone(), amount)
  98. .await?;
  99. return Ok(format!(
  100. "sending {} drk to provided address for withdrawing: {} ",
  101. amount, drk_addr
  102. ));
  103. } else {
  104. return Err(Error::from(ClientFailed::UnableToGetWithdrawAddress));
  105. }
  106. }
  107. async fn deposit_process<T>(
  108. client: Arc<Mutex<Client>>,
  109. cashier_client: Arc<Mutex<CashierClient>>,
  110. asset_id: u64,
  111. ) -> Result<String>
  112. where
  113. T: Decodable + ToString,
  114. {
  115. let deposit_addr = client.lock().await.state.wallet.get_public_keys()?[0];
  116. let coin_public = cashier_client
  117. .lock()
  118. .await
  119. .get_address(asset_id, deposit_addr)
  120. .await
  121. .map_err(|err| ClientFailed::from(err))?;
  122. if let Some(coin_addr) = coin_public {
  123. let pub_k: T = deserialize(&coin_addr)?;
  124. return Ok(pub_k.to_string());
  125. } else {
  126. return Err(Error::from(ClientFailed::UnableToGetDepositAddress));
  127. }
  128. }
  129. }
  130. impl RpcClient for RpcClientAdapter {
  131. fn say_hello(&self) -> Result<String> {
  132. debug!(target: "RPC USER ADAPTER", "say_hello() [START]");
  133. Ok(String::from("hello world"))
  134. }
  135. fn get_key(&self) -> BoxFuture<Result<String>> {
  136. debug!(target: "RPC USER ADAPTER", "get_key() [START]");
  137. Self::get_key_process(self.client.clone()).boxed()
  138. }
  139. fn create_wallet(&self) -> BoxFuture<Result<String>> {
  140. debug!(target: "RPC USER ADAPTER", "create_wallet() [START]");
  141. Self::create_wallet_process(self.client.clone()).boxed()
  142. }
  143. fn key_gen(&self) -> BoxFuture<Result<String>> {
  144. debug!(target: "RPC USER ADAPTER", "key_gen() [START]");
  145. Self::key_gen_process(self.client.clone()).boxed()
  146. }
  147. fn transfer(&self, asset_id: u64, pub_key: Vec<u8>, amount: f64) -> BoxFuture<Result<String>> {
  148. debug!(target: "RPC USER ADAPTER", "transfer() [START]");
  149. Self::transfer_process(self.client.clone(), asset_id, pub_key, amount).boxed()
  150. }
  151. fn withdraw(&self, asset_id: u64, pub_key: Vec<u8>, amount: f64) -> BoxFuture<Result<String>> {
  152. debug!(target: "RPC USER ADAPTER", "withdraw() [START]");
  153. Self::withdraw_process(
  154. self.client.clone(),
  155. self.cashier_client.clone(),
  156. asset_id,
  157. pub_key,
  158. amount,
  159. )
  160. .boxed()
  161. }
  162. fn deposit(&self, asset_id: u64) -> BoxFuture<Result<String>> {
  163. debug!(target: "RPC USER ADAPTER", "deposit() [START]");
  164. #[cfg(feature = "default")]
  165. Self::deposit_process::<bitcoin::PublicKey>(
  166. self.client.clone(),
  167. self.cashier_client.clone(),
  168. asset_id,
  169. )
  170. .boxed()
  171. }
  172. }