|
@@ -420,6 +420,33 @@ impl WalletDb {
|
|
|
|
|
|
|
|
Ok(())
|
|
Ok(())
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ pub async fn get_balance(&self, token_id: DrkTokenId) -> Result<Option<Balance>> {
|
|
|
|
|
+ debug!("Getting balance of token ID");
|
|
|
|
|
+
|
|
|
|
|
+ let is_spent = 0;
|
|
|
|
|
+ let id = serialize(&token_id);
|
|
|
|
|
+
|
|
|
|
|
+ let mut conn = self.conn.acquire().await?;
|
|
|
|
|
+ let row =
|
|
|
|
|
+ sqlx::query("SELECT value, token_id, nullifier FROM coins WHERE token_id = ?1 AND is_spent = ?2;")
|
|
|
|
|
+ .bind(id)
|
|
|
|
|
+ .bind(is_spent)
|
|
|
|
|
+ .fetch_optional(&mut conn)
|
|
|
|
|
+ .await?;
|
|
|
|
|
+
|
|
|
|
|
+ let balance = match row {
|
|
|
|
|
+ Some(b) => {
|
|
|
|
|
+ let value = deserialize(b.get("value"))?;
|
|
|
|
|
+ let token_id = deserialize(b.get("token_id"))?;
|
|
|
|
|
+ let nullifier = deserialize(b.get("nullifier"))?;
|
|
|
|
|
+ Some(Balance { token_id, value, nullifier })
|
|
|
|
|
+ }
|
|
|
|
|
+ None => None,
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ Ok(balance)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
pub async fn get_balances(&self) -> Result<Balances> {
|
|
pub async fn get_balances(&self) -> Result<Balances> {
|
|
|
debug!("Getting tokens and balances");
|
|
debug!("Getting tokens and balances");
|
|
@@ -573,6 +600,10 @@ mod tests {
|
|
|
assert_eq!(i, token_id);
|
|
assert_eq!(i, token_id);
|
|
|
assert!(wallet.token_id_exists(i).await?);
|
|
assert!(wallet.token_id_exists(i).await?);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // get_balance()
|
|
|
|
|
+ let balance = wallet.get_balance(token_id).await?;
|
|
|
|
|
+ assert_eq!(balance.unwrap().value, 69);
|
|
|
|
|
|
|
|
// get_balances()
|
|
// get_balances()
|
|
|
let balances = wallet.get_balances().await?;
|
|
let balances = wallet.get_balances().await?;
|