diff --git a/sql/cashier.sql b/sql/cashier.sql index 246ecdba9..9076ce555 100644 --- a/sql/cashier.sql +++ b/sql/cashier.sql @@ -12,6 +12,7 @@ CREATE TABLE IF NOT EXISTS deposit_keypairs( token_key_public BLOB NOT NULL, network BLOB NOT NULL, token_id BLOB NOT NULL, + mint_address BLOB NOT NULL, confirm BLOB NOT NULL ); @@ -22,5 +23,6 @@ CREATE TABLE IF NOT EXISTS withdraw_keypairs( d_key_public BLOB NOT NULL, network BLOB NOT NULL, token_id BLOB NOT NULL, + mint_address BLOB NOT NULL, confirm BLOB NOT NULL ); diff --git a/src/wallet/cashierdb.rs b/src/wallet/cashierdb.rs index e49015bad..a0fcd9e1e 100644 --- a/src/wallet/cashierdb.rs +++ b/src/wallet/cashierdb.rs @@ -123,6 +123,7 @@ impl CashierDb { d_key_private: &jubjub::Fr, network: &NetworkName, token_id: &jubjub::Fr, + mint_address: &String, ) -> Result<()> { debug!(target: "CASHIERDB", "Put withdraw keys"); @@ -131,6 +132,7 @@ impl CashierDb { let network = self.get_value_serialized(network)?; let token_id = self.get_value_serialized(token_id)?; let confirm = self.get_value_serialized(&false)?; + let mint_address = self.get_value_serialized(mint_address)?; // open connection let conn = Connection::open(&self.path)?; @@ -139,15 +141,16 @@ impl CashierDb { conn.execute( "INSERT INTO withdraw_keypairs - (token_key_public, d_key_private, d_key_public, network, token_id, confirm) + (token_key_public, d_key_private, d_key_public, network, token_id, mint_address, confirm) VALUES - (:token_key_public, :d_key_private, :d_key_public,:network, :token_id, :confirm);", + (:token_key_public, :d_key_private, :d_key_public,:network, :token_id, :mint_address, :confirm);", named_params! { ":token_key_public": token_key_public, ":d_key_private": d_key_private, ":d_key_public": d_key_public, ":network": network, ":token_id": token_id, + ":mint_address": mint_address, ":confirm": confirm, }, )?; @@ -161,6 +164,7 @@ impl CashierDb { token_key_public: &[u8], network: &NetworkName, token_id: &jubjub::Fr, + mint_address: &String, ) -> Result<()> { debug!(target: "CASHIERDB", "Put exchange keys"); @@ -174,17 +178,20 @@ impl CashierDb { 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( "INSERT INTO deposit_keypairs - (d_key_public, token_key_private, token_key_public, network, token_id, confirm) + (d_key_public, token_key_private, token_key_public, network, token_id, mint_address, confirm) VALUES - (:d_key_public, :token_key_private, :token_key_public, :network, :token_id, :confirm)", + (:d_key_public, :token_key_private, :token_key_public, :network, :token_id, :mint_address, :confirm)", named_params! { ":d_key_public": &d_key_public, ":token_key_private": token_key_private, ":token_key_public": token_key_public, ":network": &network, ":token_id": &token_id, + ":mint_address": &mint_address, ":confirm": &confirm, }, )?; @@ -222,7 +229,7 @@ impl CashierDb { pub fn get_withdraw_token_public_key_by_dkey_public( &self, pub_key: &jubjub::SubgroupPoint, - ) -> Result, NetworkName, jubjub::Fr)>> { + ) -> Result, NetworkName, jubjub::Fr, String)>> { debug!(target: "CASHIERDB", "Get token address by pub_key"); // open connection let conn = Connection::open(&self.path)?; @@ -234,13 +241,13 @@ impl CashierDb { let confirm = self.get_value_serialized(&false)?; let mut stmt = conn.prepare( - "SELECT token_key_public, network, token_id + "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| Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?)), )?; let mut token_addresses = vec![]; @@ -250,7 +257,8 @@ impl CashierDb { let token_key_public = addr.0; let network: NetworkName = self.get_value_deserialized(addr.1)?; let token_id: jubjub::Fr = self.get_value_deserialized(addr.2)?; - token_addresses.push((token_key_public, network, token_id)); + let mint_address: String = self.get_value_deserialized(addr.3)?; + token_addresses.push((token_key_public, network, token_id, mint_address)); } Ok(token_addresses.pop()) @@ -297,11 +305,11 @@ impl CashierDb { Ok(keys) } - // return private and public keys as a tuple + // return private key, public key, token_id, and mint_address as a tuple pub fn get_deposit_token_keys_by_network( &self, network: &NetworkName, - ) -> Result, Vec)>> { + ) -> Result, Vec, jubjub::Fr, String)>> { debug!(target: "CASHIERDB", "Check for existing dkey"); // open connection let conn = Connection::open(&self.path)?; @@ -312,20 +320,25 @@ impl CashierDb { let confirm = self.get_value_serialized(&false)?; let mut stmt = conn.prepare( - "SELECT token_key_private, token_key_public + "SELECT 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::<(Vec, Vec), _, _>( - &[(":network", &network), (":confirm", &confirm)], - |row| Ok((row.get(0)?, row.get(1)?)), - )?; + let keys_iter = stmt + .query_map(&[(":network", &network), (":confirm", &confirm)], |row| { + Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?)) + })?; let mut keys = vec![]; - for k in keys_iter { - keys.push(k?); + for key in keys_iter { + let key = key?; + let private_key = key.0; + let pub_key = key.1; + let token_id: jubjub::Fr = self.get_value_deserialized(key.2)?; + let mint_address: String = self.get_value_deserialized(key.3)?; + keys.push((private_key, pub_key, token_id, mint_address)); } Ok(keys) @@ -505,6 +518,7 @@ mod tests { &token_addr, &network, &token_id, + &String::new(), )?; let keys = wallet.get_deposit_token_keys_by_dkey_public(&public2, &network)?; @@ -541,7 +555,14 @@ mod tests { let network = NetworkName::Bitcoin; - wallet.put_withdraw_keys(&token_addr, &public2, &secret2, &network, &token_id)?; + wallet.put_withdraw_keys( + &token_addr, + &public2, + &secret2, + &network, + &token_id, + &String::new(), + )?; let addr = wallet.get_withdraw_keys_by_token_public_key(&token_addr, &network)?;