nautilus_blockchain/cache/
rows.rs

1// -------------------------------------------------------------------------------------------------
2//  Copyright (C) 2015-2025 Nautech Systems Pty Ltd. All rights reserved.
3//  https://nautechsystems.io
4//
5//  Licensed under the GNU Lesser General Public License Version 3.0 (the "License");
6//  You may not use this file except in compliance with the License.
7//  You may obtain a copy of the License at https://www.gnu.org/licenses/lgpl-3.0.en.html
8//
9//  Unless required by applicable law or agreed to in writing, software
10//  distributed under the License is distributed on an "AS IS" BASIS,
11//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//  See the License for the specific language governing permissions and
13//  limitations under the License.
14// -------------------------------------------------------------------------------------------------
15
16use alloy::primitives::Address;
17use nautilus_core::UnixNanos;
18use nautilus_model::defi::validation::validate_address;
19use sqlx::{FromRow, Row, postgres::PgRow};
20
21/// A data transfer object that maps database rows to token data.
22///
23/// Implements `FromRow` trait to automatically convert PostgreSQL results into `TokenRow`
24/// objects that can be transformed into domain entity `Token` objects.
25#[derive(Debug)]
26pub struct TokenRow {
27    pub address: Address,
28    pub name: String,
29    pub symbol: String,
30    pub decimals: i32,
31}
32
33impl<'r> FromRow<'r, PgRow> for TokenRow {
34    fn from_row(row: &'r PgRow) -> Result<Self, sqlx::Error> {
35        let address = validate_address(row.try_get::<String, _>("address")?.as_str()).unwrap();
36        let name = row.try_get::<String, _>("name")?;
37        let symbol = row.try_get::<String, _>("symbol")?;
38        let decimals = row.try_get::<i32, _>("decimals")?;
39
40        let token = Self {
41            address,
42            name,
43            symbol,
44            decimals,
45        };
46        Ok(token)
47    }
48}
49
50#[derive(Debug)]
51pub struct PoolRow {
52    pub address: Address,
53    pub dex_name: String,
54    pub creation_block: i64,
55    pub token0_chain: i32,
56    pub token0_address: Address,
57    pub token1_chain: i32,
58    pub token1_address: Address,
59    pub fee: Option<i32>,
60    pub tick_spacing: Option<i32>,
61}
62
63impl<'r> FromRow<'r, PgRow> for PoolRow {
64    fn from_row(row: &'r PgRow) -> Result<Self, sqlx::Error> {
65        let address = validate_address(row.try_get::<String, _>("address")?.as_str()).unwrap();
66        let dex_name = row.try_get::<String, _>("dex_name")?;
67        let creation_block = row.try_get::<i64, _>("creation_block")?;
68        let token0_chain = row.try_get::<i32, _>("token0_chain")?;
69        let token0_address =
70            validate_address(row.try_get::<String, _>("token0_address")?.as_str()).unwrap();
71        let token1_chain = row.try_get::<i32, _>("token1_chain")?;
72        let token1_address =
73            validate_address(row.try_get::<String, _>("token1_address")?.as_str()).unwrap();
74        let fee = row.try_get::<Option<i32>, _>("fee")?;
75        let tick_spacing = row.try_get::<Option<i32>, _>("tick_spacing")?;
76
77        Ok(Self {
78            address,
79            dex_name,
80            creation_block,
81            token0_chain,
82            token0_address,
83            token1_chain,
84            token1_address,
85            fee,
86            tick_spacing,
87        })
88    }
89}
90
91/// A data transfer object that maps database rows to block timestamp data.
92#[derive(Debug)]
93pub struct BlockTimestampRow {
94    /// The block number.
95    pub number: u64,
96    /// The block timestamp.
97    pub timestamp: UnixNanos,
98}
99
100impl FromRow<'_, PgRow> for BlockTimestampRow {
101    fn from_row(row: &PgRow) -> Result<Self, sqlx::Error> {
102        let number = row.try_get::<i64, _>("number")? as u64;
103        let timestamp = row.try_get::<String, _>("timestamp")?;
104        Ok(Self {
105            number,
106            timestamp: UnixNanos::from(timestamp),
107        })
108    }
109}