Add RPC call to retrieve pool ID
Add a call that returns a pool ID given an utxo
This commit is contained in:
parent
46c3ff029a
commit
50cd23dd34
3 changed files with 65 additions and 2 deletions
|
|
@ -530,6 +530,18 @@ pub fn db_pool_get_details(db: &Connection, pool: &PoolID) -> Result<(String, St
|
|||
Ok(res)
|
||||
}
|
||||
|
||||
pub fn db_pool_id_from_utxo(conn: &Connection, utxo_hash: &OutPointHash) -> Result<Option<String>> {
|
||||
let mut stmt = conn.prepare("SELECT pool FROM pool_history_entry WHERE utxo = ?")?;
|
||||
let mut rows = stmt.query(params![utxo_hash.to_hex()])?;
|
||||
|
||||
if let Some(row) = rows.next()? {
|
||||
let pool_id: String = row.get(0)?;
|
||||
Ok(Some(pool_id))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
}
|
||||
|
||||
/// Get total volume in satoshis across all tokens for a given time period
|
||||
pub fn get_total_volume_sats(
|
||||
db: &Connection,
|
||||
|
|
|
|||
|
|
@ -325,6 +325,7 @@ fn launch() -> _ {
|
|||
rpc::pool::list_pools_by_apy,
|
||||
rpc::pool::list_active_pools,
|
||||
rpc::pool::pool_history,
|
||||
rpc::pool::pool_id_from_utxo,
|
||||
rpc::apy::aggregate_apy,
|
||||
rpc::contract::contract_count_token,
|
||||
rpc::contract::contract_count_all,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ use crate::{
|
|||
cashaddr::utiladdr::p2pkh_hex_to_addr,
|
||||
db::{
|
||||
cauldron::{
|
||||
pool::{db_pool_get_details, db_pool_history},
|
||||
pool::{db_pool_get_details, db_pool_history, db_pool_id_from_utxo},
|
||||
poolvisitor::{
|
||||
db_visit_pool_entries, OptionalFields, OptionalPoolFields, PoolFilters, PoolVisitor,
|
||||
},
|
||||
|
|
@ -18,7 +18,9 @@ use crate::{
|
|||
timeutil::time_now,
|
||||
};
|
||||
use anyhow::Result;
|
||||
use bitcoin_hashes::hex::FromHex;
|
||||
use bitcoin_hashes::hex::{FromHex, ToHex};
|
||||
use bitcoincash::Txid;
|
||||
use riftenlabs_defi::chainutil::compute_outpoint_hash;
|
||||
use rocket::{get, http::Status, response::status::Custom, serde::json::Json, State};
|
||||
use rusqlite::{params, Connection};
|
||||
use serde_json::{json, Value};
|
||||
|
|
@ -298,3 +300,51 @@ pub fn pool_history(
|
|||
"owner_pkh": owner_pkh,
|
||||
})))
|
||||
}
|
||||
|
||||
/// Get pool ID from a UTXO specified by transaction ID and input position.
|
||||
///
|
||||
/// - txid: Transaction ID (hex string)
|
||||
/// - input_pos: Input position (vout) in the transaction
|
||||
///
|
||||
/// **Response Example:**
|
||||
/// ```json
|
||||
/// {
|
||||
/// "pool_id": "a1b2c3d4e5f6..."
|
||||
/// }
|
||||
/// ```
|
||||
#[get("/pool/id_from_utxo?<txid>&<n>")]
|
||||
pub fn pool_id_from_utxo(
|
||||
txid: &str,
|
||||
n: u32,
|
||||
conn: &State<DB>,
|
||||
) -> Result<Json<Value>, Custom<String>> {
|
||||
let db = conn
|
||||
.cauldron_r
|
||||
.get()
|
||||
.map_err(|e| Custom(Status::InternalServerError, format!("Error: {e}")))?;
|
||||
|
||||
// Parse txid from hex
|
||||
let txid = Txid::from_hex(txid)
|
||||
.map_err(|e| Custom(Status::BadRequest, format!("Invalid txid: {e}")))?;
|
||||
|
||||
// Compute outpoint hash from txid and input position
|
||||
let utxo_hash = compute_outpoint_hash(&txid, n);
|
||||
|
||||
// Query pool_history_entry table
|
||||
let pool_id = db_pool_id_from_utxo(&db, &utxo_hash)
|
||||
.map_err(|e| Custom(Status::InternalServerError, format!("Error: {e}")))?;
|
||||
|
||||
match pool_id {
|
||||
Some(pool_id) => Ok(Json(json!({
|
||||
"pool_id": pool_id
|
||||
}))),
|
||||
None => Err(Custom(
|
||||
Status::NotFound,
|
||||
format!(
|
||||
"No pool found for UTXO: txid={}, input_pos={}",
|
||||
txid.to_hex(),
|
||||
n
|
||||
),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue