|
|
@@ -1,7 +1,7 @@
|
|
|
-use std::path::{Path, PathBuf};
|
|
|
+use std::path::Path;
|
|
|
|
|
|
use async_std::sync::{Arc, Mutex};
|
|
|
-use log::debug;
|
|
|
+use log::{debug, error, info};
|
|
|
use rusqlite::{named_params, params, Connection};
|
|
|
|
|
|
use super::{Keypair, WalletApi};
|
|
|
@@ -12,8 +12,7 @@ use crate::{types::*, Error, Result};
|
|
|
pub type CashierDbPtr = Arc<CashierDb>;
|
|
|
|
|
|
pub struct CashierDb {
|
|
|
- pub path: PathBuf,
|
|
|
- pub password: String,
|
|
|
+ pub conn: Connection,
|
|
|
pub initialized: Mutex<bool>,
|
|
|
}
|
|
|
|
|
|
@@ -37,59 +36,43 @@ pub struct DepositToken {
|
|
|
pub mint_address: String,
|
|
|
}
|
|
|
|
|
|
-impl WalletApi for CashierDb {
|
|
|
- fn get_password(&self) -> String {
|
|
|
- self.password.to_owned()
|
|
|
- }
|
|
|
- fn get_path(&self) -> PathBuf {
|
|
|
- self.path.to_owned()
|
|
|
- }
|
|
|
-}
|
|
|
+impl WalletApi for CashierDb {}
|
|
|
|
|
|
impl CashierDb {
|
|
|
pub fn new(path: &Path, password: String) -> Result<CashierDbPtr> {
|
|
|
debug!(target: "CASHIERDB", "new() Constructor called");
|
|
|
+ if password.trim().is_empty() {
|
|
|
+ error!(target: "CASHIERDB", "Password is empty. You must set a password to use the wallet.");
|
|
|
+ return Err(Error::from(ClientFailed::EmptyPassword));
|
|
|
+ }
|
|
|
+
|
|
|
+ let conn = Connection::open(path)?;
|
|
|
+ conn.pragma_update(None, "key", &password)?;
|
|
|
+ info!(target: "CASHIERDB", "Opened connection at path: {:?}", path);
|
|
|
+
|
|
|
Ok(Arc::new(Self {
|
|
|
- path: path.to_owned(),
|
|
|
- password,
|
|
|
+ conn,
|
|
|
initialized: Mutex::new(false),
|
|
|
}))
|
|
|
}
|
|
|
|
|
|
pub async fn init_db(&self) -> Result<()> {
|
|
|
if !*self.initialized.lock().await {
|
|
|
- if !self.password.trim().is_empty() {
|
|
|
- let contents = include_str!("../../sql/cashier.sql");
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- debug!(target: "CASHIERDB", "Opened connection at path {:?}", self.path);
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
- conn.execute_batch(contents)?;
|
|
|
- *self.initialized.lock().await = true;
|
|
|
- } else {
|
|
|
- debug!(
|
|
|
- target: "CASHIERDB",
|
|
|
- "Password is empty. You must set a password to use the wallet."
|
|
|
- );
|
|
|
- return Err(Error::from(ClientFailed::EmptyPassword));
|
|
|
- }
|
|
|
- } else {
|
|
|
- debug!(target: "WALLETDB", "Wallet already initialized.");
|
|
|
- return Err(Error::from(ClientFailed::WalletInitialized));
|
|
|
+ let contents = include_str!("../../sql/cashier.sql");
|
|
|
+ self.conn.execute_batch(contents)?;
|
|
|
+ *self.initialized.lock().await = true;
|
|
|
+ return Ok(());
|
|
|
}
|
|
|
- Ok(())
|
|
|
+
|
|
|
+ error!(target: "WALLETDB", "Wallet already initialized.");
|
|
|
+ Err(Error::from(ClientFailed::WalletInitialized))
|
|
|
}
|
|
|
|
|
|
pub fn put_main_keys(&self, token_key: &TokenKey, network: &NetworkName) -> Result<()> {
|
|
|
debug!(target: "CASHIERDB", "Put main keys");
|
|
|
-
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
|
|
|
- conn.execute(
|
|
|
+ self.conn.execute(
|
|
|
"INSERT INTO main_keypairs
|
|
|
(token_key_private, token_key_public, network)
|
|
|
VALUES
|
|
|
@@ -100,23 +83,20 @@ impl CashierDb {
|
|
|
":network": &network,
|
|
|
},
|
|
|
)?;
|
|
|
+
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
pub fn get_main_keys(&self, network: &NetworkName) -> Result<Vec<TokenKey>> {
|
|
|
debug!(target: "CASHIERDB", "Get main keys");
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT token_key_private, token_key_public
|
|
|
FROM main_keypairs
|
|
|
WHERE network = :network ;",
|
|
|
)?;
|
|
|
+
|
|
|
let keys_iter = stmt
|
|
|
.query_map::<(Vec<u8>, Vec<u8>), _, _>(&[(":network", &network)], |row| {
|
|
|
Ok((row.get(0)?, row.get(1)?))
|
|
|
@@ -137,14 +117,8 @@ impl CashierDb {
|
|
|
|
|
|
pub fn remove_withdraw_and_deposit_keys(&self) -> Result<()> {
|
|
|
debug!(target: "CASHIERDB", "Remove withdraw and deposit keys");
|
|
|
-
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
- conn.execute("DROP TABLE deposit_keypairs;", [])?;
|
|
|
- conn.execute("DROP TABLE withdraw_keypairs;", [])?;
|
|
|
+ self.conn.execute("DROP TABLE deposit_keypairs;", [])?;
|
|
|
+ self.conn.execute("DROP TABLE withdraw_keypairs;", [])?;
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
@@ -166,12 +140,7 @@ impl CashierDb {
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
let mint_address = self.get_value_serialized(&mint_address)?;
|
|
|
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
- conn.execute(
|
|
|
+ self.conn.execute(
|
|
|
"INSERT INTO withdraw_keypairs
|
|
|
(token_key_public, d_key_private, d_key_public, network, token_id, mint_address, confirm)
|
|
|
VALUES
|
|
|
@@ -186,6 +155,7 @@ impl CashierDb {
|
|
|
":confirm": confirm,
|
|
|
},
|
|
|
)?;
|
|
|
+
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
@@ -200,19 +170,13 @@ impl CashierDb {
|
|
|
) -> Result<()> {
|
|
|
debug!(target: "CASHIERDB", "Put exchange keys");
|
|
|
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let d_key_public = self.get_value_serialized(d_key_public)?;
|
|
|
let token_id = self.get_value_serialized(token_id)?;
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
-
|
|
|
let mint_address = self.get_value_serialized(&mint_address)?;
|
|
|
|
|
|
- conn.execute(
|
|
|
+ self.conn.execute(
|
|
|
"INSERT INTO deposit_keypairs
|
|
|
(d_key_public, token_key_private, token_key_public, network, token_id, mint_address, confirm)
|
|
|
VALUES
|
|
|
@@ -227,19 +191,15 @@ impl CashierDb {
|
|
|
":confirm": &confirm,
|
|
|
},
|
|
|
)?;
|
|
|
+
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
pub fn get_withdraw_private_keys(&self) -> Result<Vec<DrkSecretKey>> {
|
|
|
debug!(target: "CASHIERDB", "Get withdraw private keys");
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT d_key_private
|
|
|
FROM withdraw_keypairs
|
|
|
WHERE confirm = :confirm",
|
|
|
@@ -262,20 +222,15 @@ impl CashierDb {
|
|
|
pub_key: &DrkPublicKey,
|
|
|
) -> Result<Option<WithdrawToken>> {
|
|
|
debug!(target: "CASHIERDB", "Get token address by pub_key");
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let d_key_public = self.get_value_serialized(pub_key)?;
|
|
|
-
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT token_key_public, network, token_id, mint_address
|
|
|
FROM withdraw_keypairs
|
|
|
WHERE d_key_public = :d_key_public AND confirm = :confirm;",
|
|
|
)?;
|
|
|
+
|
|
|
let addr_iter = stmt.query_map(
|
|
|
&[(":d_key_public", &d_key_public), (":confirm", &confirm)],
|
|
|
|row| Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?)),
|
|
|
@@ -307,21 +262,17 @@ impl CashierDb {
|
|
|
) -> Result<Vec<TokenKey>> {
|
|
|
debug!(target: "CASHIERDB", "Check for existing dkey");
|
|
|
let d_key_public = self.get_value_serialized(d_key_public)?;
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT token_key_private, token_key_public
|
|
|
FROM deposit_keypairs
|
|
|
WHERE d_key_public = :d_key_public
|
|
|
AND network = :network
|
|
|
AND confirm = :confirm ;",
|
|
|
)?;
|
|
|
+
|
|
|
let keys_iter = stmt.query_map::<(Vec<u8>, Vec<u8>), _, _>(
|
|
|
&[
|
|
|
(":d_key_public", &d_key_public),
|
|
|
@@ -349,20 +300,16 @@ impl CashierDb {
|
|
|
network: &NetworkName,
|
|
|
) -> Result<Vec<DepositToken>> {
|
|
|
debug!(target: "CASHIERDB", "Check for existing dkey");
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT d_key_public, token_key_private, token_key_public, token_id, mint_address
|
|
|
FROM deposit_keypairs
|
|
|
WHERE network = :network
|
|
|
AND confirm = :confirm ;",
|
|
|
)?;
|
|
|
+
|
|
|
let keys_iter =
|
|
|
stmt.query_map(&[(":network", &network), (":confirm", &confirm)], |row| {
|
|
|
Ok((
|
|
|
@@ -403,16 +350,10 @@ impl CashierDb {
|
|
|
network: &NetworkName,
|
|
|
) -> Result<Option<Keypair>> {
|
|
|
debug!(target: "CASHIERDB", "Check for existing token address");
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let confirm = self.get_value_serialized(&false)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
|
|
|
- let mut stmt = conn.prepare(
|
|
|
+ let mut stmt = self.conn.prepare(
|
|
|
"SELECT d_key_private, d_key_public FROM withdraw_keypairs
|
|
|
WHERE token_key_public = :token_key_public
|
|
|
AND network = :network
|
|
|
@@ -447,16 +388,10 @@ impl CashierDb {
|
|
|
network: &NetworkName,
|
|
|
) -> Result<()> {
|
|
|
debug!(target: "CASHIERDB", "Confirm withdraw keys");
|
|
|
-
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
let confirm = self.get_value_serialized(&true)?;
|
|
|
|
|
|
- conn.execute(
|
|
|
+ self.conn.execute(
|
|
|
"UPDATE withdraw_keypairs
|
|
|
SET confirm = ?1
|
|
|
WHERE token_key_public = ?2
|
|
|
@@ -473,17 +408,11 @@ impl CashierDb {
|
|
|
network: &NetworkName,
|
|
|
) -> Result<()> {
|
|
|
debug!(target: "CASHIERDB", "Confirm withdraw keys");
|
|
|
-
|
|
|
- // open connection
|
|
|
- let conn = Connection::open(&self.path)?;
|
|
|
- // unlock database
|
|
|
- conn.pragma_update(None, "key", &self.password)?;
|
|
|
-
|
|
|
let network = self.get_value_serialized(network)?;
|
|
|
let confirm = self.get_value_serialized(&true)?;
|
|
|
let d_key_public = self.get_value_serialized(d_key_public)?;
|
|
|
|
|
|
- conn.execute(
|
|
|
+ self.conn.execute(
|
|
|
"UPDATE deposit_keypairs
|
|
|
SET confirm = ?1
|
|
|
WHERE d_key_public = ?2
|