From 8dc824860c93d74dbdd5ba4e2080c358e63eeff4 Mon Sep 17 00:00:00 2001 From: Dagur Valberg Johannsson Date: Tue, 19 Aug 2025 11:38:05 +0200 Subject: [PATCH] bug: Fix volume for periods with no trades Return 0 in volume rather than query error. --- src/db/cauldron/pool.rs | 38 +++++++++++++++++++++++++++++++--- src/db/cauldron/poolvisitor.rs | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/db/cauldron/pool.rs b/src/db/cauldron/pool.rs index f4f65b3..8a22f80 100644 --- a/src/db/cauldron/pool.rs +++ b/src/db/cauldron/pool.rs @@ -538,7 +538,7 @@ pub fn get_total_volume_sats( ) -> anyhow::Result { let sql = " SELECT - SUM(ABS(phe.sats_delta)) AS total_volume_sats + COALESCE(SUM(ABS(phe.sats_delta)), 0) AS total_volume_sats FROM pool_history_entry phe JOIN pool p ON phe.pool = p.creation_utxo JOIN tx ON phe.txid = tx.txid @@ -560,8 +560,8 @@ pub fn get_token_volume_sats( ) -> anyhow::Result<(i64, i64)> { let sql = " SELECT - SUM(ABS(phe.sats_delta)) AS token_volume_sats, - SUM(ABS(phe.token_delta)) AS token_volume_tokens + COALESCE(SUM(ABS(phe.sats_delta)), 0) AS token_volume_sats, + COALESCE(SUM(ABS(phe.token_delta)), 0) AS token_volume_tokens FROM pool_history_entry phe JOIN pool p ON phe.pool = p.creation_utxo JOIN tx ON phe.txid = tx.txid @@ -576,3 +576,35 @@ pub fn get_token_volume_sats( Ok((sats_volume, token_volume)) } + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::cauldron::prepare_tables; + use crate::utiltest::mock_db_pool; + use rusqlite::Connection; + + fn setup_test_db(conn: &Connection) { + prepare_tables(conn); + } + + #[test] + fn test_volume_no_trades_in_period() { + // tests an issue where volume function wouild fail if no trades exist in the time period + let mock_db = mock_db_pool(setup_test_db); + let conn = mock_db.cauldron_r.get().unwrap(); + + let start_timestamp = 1755508856u64; + let end_timestamp = 1755595256u64; + let token_id = "f6677f3d3805d70949b375d36e094ff0ec9ece2a2cb1fde6d8b0e90b368f1f63"; + + let result = get_token_volume_sats(&conn, start_timestamp, end_timestamp, token_id); + let (sats_volume, token_volume) = result.unwrap(); + assert_eq!(sats_volume, 0); + assert_eq!(token_volume, 0); + + let result = get_total_volume_sats(&conn, start_timestamp, end_timestamp); + let total_volume = result.unwrap(); + assert_eq!(total_volume, 0); + } +} diff --git a/src/db/cauldron/poolvisitor.rs b/src/db/cauldron/poolvisitor.rs index 7cd24cb..c0dfab0 100644 --- a/src/db/cauldron/poolvisitor.rs +++ b/src/db/cauldron/poolvisitor.rs @@ -89,7 +89,7 @@ pub(crate) trait PoolVisitor { fn time_filters( filters: &PoolFilters, param_index: usize, -) -> (String, Vec) { +) -> (String, Vec>) { let now = time_now() as u64; let mut clauses: Vec = vec!["1=1".to_string()];