// Copyright (C) 2024 Riften Labs AS // // This software is licensed under the GNU Affero General Public License (AGPL), version 3.0 or later. // A copy of the license can be found in the LICENSE file or at https://www.gnu.org/licenses/agpl-3.0.html use bitcoin_hashes::hex::FromHex; use bitcoincash::TokenID; use rocket::{get, State}; use serde_json::json; use serde_json::Value; use crate::db::DB; use crate::rpc::err::{bad_request, db_error, ApiErrorCode, CachedApiResult}; use crate::rpc::response::{cached_ok, CACHE_NONE}; #[get("/tx/latest?&&")] pub fn tx_latest( limit: Option, offset: Option, token: Option<&str>, conn: &State, ) -> CachedApiResult { let db = conn.cauldron_r.get().map_err(db_error)?; let limit = limit.unwrap_or(100).min(10000); let offset = offset.unwrap_or(0); let token = match token { None => None, Some(tokenhex) => match TokenID::from_hex(tokenhex) { Ok(token) => Some(token), Err(_) => { return Err(bad_request( ApiErrorCode::InvalidTokenId, "Invalid token ID", )) } }, }; let txs = crate::db::cauldron::tx::latest(&db, limit, offset, token).map_err(db_error)?; let txs_json: Vec = txs .into_iter() .map(|tx| { json!({ "txid": tx.0.to_string(), "blockhash": tx.1.map(|blockhex| blockhex.to_string()), "timestamp_guess": tx.2 }) }) .collect(); // Latest transactions change constantly - don't cache Ok(cached_ok(json!(txs_json), CACHE_NONE)) }