Преглед изворни кода

fix bugs in the process of withdrawing

ghassmo пре 5 година
родитељ
комит
59436a1197
5 измењених фајлова са 36 додато и 30 уклоњено
  1. 2 3
      res/cashier.sql
  2. 1 1
      src/client/client.rs
  3. 29 22
      src/rpc/adapters/user_adapter.rs
  4. 3 3
      src/service/cashier.rs
  5. 1 1
      src/wallet/cashierdb.rs

+ 2 - 3
res/cashier.sql

@@ -10,8 +10,7 @@ CREATE TABLE IF NOT EXISTS keypairs(
     txid BLOB
     txid BLOB
 );
 );
 CREATE TABLE IF NOT EXISTS withdraw_keypairs(
 CREATE TABLE IF NOT EXISTS withdraw_keypairs(
-    btc_key_id INTEGER PRIMARY KEY NOT NULL,
+    btc_key_id BLOB PRIMARY KEY NOT NULL,
 	d_key_private BLOB NOT NULL,
 	d_key_private BLOB NOT NULL,
-    d_key_public BLOB NOT NULL, 
-    txid BLOB
+    d_key_public BLOB NOT NULL
 );
 );

+ 1 - 1
src/client/client.rs

@@ -198,7 +198,7 @@ impl Client {
                         if let Some(drk_addr) = drk_public? {
                         if let Some(drk_addr) = drk_public? {
                             withdraw_rep.send(Ok(drk_addr)).await?;
                             withdraw_rep.send(Ok(drk_addr)).await?;
                         }else {
                         }else {
-                            withdraw_rep.send(Err(ClientFailed::UnableToGetDepositAddress)).await?;
+                            withdraw_rep.send(Err(ClientFailed::UnableToGetWithdrawAddress)).await?;
                         }
                         }
                     }
                     }
                 }
                 }

+ 29 - 22
src/rpc/adapters/user_adapter.rs

@@ -8,7 +8,6 @@ use crate::{Error, Result};
 use log::*;
 use log::*;
 
 
 use async_std::sync::Arc;
 use async_std::sync::Arc;
-use std::string::ToString;
 
 
 pub type UserAdapterPtr = Arc<UserAdapter>;
 pub type UserAdapterPtr = Arc<UserAdapter>;
 
 
@@ -144,11 +143,10 @@ impl UserAdapter {
             let self2 = self1.clone();
             let self2 = self1.clone();
             async move {
             async move {
                 let parsed: WithdrawParams = params.parse().unwrap();
                 let parsed: WithdrawParams = params.parse().unwrap();
-                let amount = parsed.amount.clone();
-                let address = parsed.pub_key.clone();
-                self2.withdraw(parsed).await?;
+                let amount = parsed.amount;
+                let address = self2.withdraw(parsed).await?;
                 Ok(jsonrpc_core::Value::String(format!(
                 Ok(jsonrpc_core::Value::String(format!(
-                    "withdrawing {} BTC to {}...",
+                    "sending {} dbtc to provided address for withdrawing: {} ",
                     amount, address
                     amount, address
                 )))
                 )))
             }
             }
@@ -187,7 +185,7 @@ impl UserAdapter {
     }
     }
 
 
     pub async fn deposit(&self) -> Result<PubAddress> {
     pub async fn deposit(&self) -> Result<PubAddress> {
-        debug!(target: "deposit", "deposit: START");
+        debug!(target: "adapter", "deposit: START");
         let (public, private) = self.wallet.key_gen();
         let (public, private) = self.wallet.key_gen();
         self.wallet.put_keypair(public, private)?;
         self.wallet.put_keypair(public, private)?;
         let dkey = self.wallet.get_public()?;
         let dkey = self.wallet.get_public()?;
@@ -209,26 +207,35 @@ impl UserAdapter {
             .map_err(|err| Error::from(err))
             .map_err(|err| Error::from(err))
     }
     }
 
 
-    async fn withdraw(&self, withdraw_params: WithdrawParams) -> Result<()> {
-        debug!(target: "withdraw", "withdraw: START");
-        // do the key exchange
+    async fn withdraw(&self, withdraw_params: WithdrawParams) -> Result<String> {
+        debug!(target: "adapter", "withdraw: START");
         self.withdraw_channel
         self.withdraw_channel
             .0
             .0
             .send(withdraw_params.pub_key)
             .send(withdraw_params.pub_key)
             .await?;
             .await?;
-        // send the drk
-        if let Ok(key) = self.withdraw_channel.1.recv().await? {
-            let mut transfer_params = TransferParams::new();
-            transfer_params.pub_key = key.to_string();
-            transfer_params.amount = withdraw_params.amount;
-            self.transfer_channel.0.send(transfer_params).await?;
-            self.transfer_channel
-                .1
-                .recv()
-                .await?
-                .map_err(|err| Error::from(err))?;
-        }
-        Ok(())
+
+        // receive dbtc address
+        let key = self
+            .withdraw_channel
+            .1
+            .recv()
+            .await?
+            .map_err(|err| Error::from(err))?;
+
+
+        // transfer the dbtc
+        let key = bs58::encode(serialize(&key)).into_string();
+        let mut transfer_params = TransferParams::new();
+        transfer_params.pub_key = key.clone();
+        transfer_params.amount = withdraw_params.amount;
+        self.transfer_channel.0.send(transfer_params).await?;
+        self.transfer_channel
+            .1
+            .recv()
+            .await?
+            .map_err(|err| Error::from(err))?;
+
+        Ok(key)
     }
     }
 
 
     pub fn get_info(&self) {}
     pub fn get_info(&self) {}

+ 3 - 3
src/service/cashier.rs

@@ -10,7 +10,6 @@ use ff::Field;
 use rand::rngs::OsRng;
 use rand::rngs::OsRng;
 
 
 use async_executor::Executor;
 use async_executor::Executor;
-
 use electrum_client::Client as ElectrumClient;
 use electrum_client::Client as ElectrumClient;
 use log::*;
 use log::*;
 
 
@@ -234,6 +233,7 @@ impl CashierService {
                     let cashier_secret = jubjub::Fr::random(&mut OsRng);
                     let cashier_secret = jubjub::Fr::random(&mut OsRng);
                     cashier_public =
                     cashier_public =
                         zcash_primitives::constants::SPENDING_KEY_GENERATOR * cashier_secret;
                         zcash_primitives::constants::SPENDING_KEY_GENERATOR * cashier_secret;
+
                     cashier_wallet.put_withdraw_keys(
                     cashier_wallet.put_withdraw_keys(
                         btc_address,
                         btc_address,
                         serialize(&cashier_secret),
                         serialize(&cashier_secret),
@@ -287,8 +287,8 @@ impl CashierClient {
             .await?;
             .await?;
 
 
         if let Some(key) = rep {
         if let Some(key) = rep {
-            let address = deserialize(&key)?;
-            return Ok(address);
+            let address: jubjub::SubgroupPoint = deserialize(&key)?;
+            return Ok(Some(address));
         }
         }
         Ok(None)
         Ok(None)
     }
     }

+ 1 - 1
src/wallet/cashierdb.rs

@@ -150,7 +150,7 @@ impl CashierDb {
         conn.pragma_update(None, "key", &self.password)?;
         conn.pragma_update(None, "key", &self.password)?;
 
 
         conn.execute(
         conn.execute(
-            "INSERT withdraw_keypairs(btc_key_id, d_key_private, d_key_public)
+            "INSERT INTO withdraw_keypairs(btc_key_id, d_key_private, d_key_public) 
             VALUES (:btc_key_id, :d_key_private, :d_key_public)",
             VALUES (:btc_key_id, :d_key_private, :d_key_public)",
             named_params! {
             named_params! {
                 ":btc_key_id": btc_key_id,
                 ":btc_key_id": btc_key_id,