barreleye_common/models/
amount.rs

1use clickhouse::Row;
2use eyre::Result;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6	chain::{u256, U256},
7	warehouse::Warehouse,
8};
9
10static TABLE: &str = "amounts";
11
12#[derive(PartialEq, Eq, Hash, Debug, Clone, Row, Serialize, Deserialize)]
13pub struct Model {
14	pub network_id: u64,
15	pub address: String,
16	pub asset_address: String,
17	#[serde(with = "u256")]
18	pub amount: U256,
19}
20
21pub use Model as Amount;
22
23impl Model {
24	pub async fn get_all_by_address(warehouse: &Warehouse, address: &str) -> Result<Vec<Model>> {
25		// @TODO until I256 is implemented, doing this hacky "group by" statement
26		// ideally: "SELECT ?fields FROM {TABLE} WHERE address = ?"
27
28		Ok(warehouse
29			.get()
30			.query(&format!(
31				r#"
32					SELECT *
33					FROM (
34	                    SELECT
35	                        network_id,
36	                        address,
37	                        asset_address,
38	                        SUM(amount) as amount
39	                    FROM {TABLE}
40	                    WHERE address = ?
41	                    GROUP BY (network_id, address, asset_address)
42					)
43					WHERE amount >= 0
44                "#
45			))
46			.bind(address)
47			.fetch_all::<Model>()
48			.await?)
49	}
50}