mirror of
https://github.com/RoboSats/taptrade-core.git
synced 2025-07-31 07:01:40 +00:00
working on db debugging
This commit is contained in:
@ -82,7 +82,7 @@ async fn submit_maker_bond(
|
|||||||
{
|
{
|
||||||
Ok(timestamp) => timestamp,
|
Ok(timestamp) => timestamp,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
dbg!("Error in validate_bond_tx_hex: {}", e);
|
debug!("Error in validate_bond_tx_hex: {}", e);
|
||||||
return Ok(StatusCode::INTERNAL_SERVER_ERROR.into_response());
|
return Ok(StatusCode::INTERNAL_SERVER_ERROR.into_response());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -99,10 +99,12 @@ async fn submit_maker_bond(
|
|||||||
async fn fetch_available_offers(
|
async fn fetch_available_offers(
|
||||||
Extension(database): Extension<Arc<CoordinatorDB>>,
|
Extension(database): Extension<Arc<CoordinatorDB>>,
|
||||||
Json(payload): Json<OffersRequest>,
|
Json(payload): Json<OffersRequest>,
|
||||||
) -> Result<Json<PublicOffers>, AppError> {
|
) -> Result<Response, AppError> {
|
||||||
let offers: Option<Vec<PublicOffer>> = database.fetch_suitable_offers(&payload).await?;
|
let offers: Option<Vec<PublicOffer>> = database.fetch_suitable_offers(&payload).await?;
|
||||||
|
if offers.is_none() {
|
||||||
Ok(Json(PublicOffers { offers }))
|
return Ok(StatusCode::NO_CONTENT.into_response());
|
||||||
|
}
|
||||||
|
Ok(Json(PublicOffers { offers }).into_response())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// receives the taker bond for a given offer, verifies it, creates escrow transaction psbt
|
/// receives the taker bond for a given offer, verifies it, creates escrow transaction psbt
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
pub mod db_tests;
|
pub mod db_tests;
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
|
use axum::routing::trace;
|
||||||
use futures_util::{lock, StreamExt};
|
use futures_util::{lock, StreamExt};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -40,6 +41,14 @@ struct AwaitingTakerOffer {
|
|||||||
musig_pubkey_hex_maker: String,
|
musig_pubkey_hex_maker: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn bool_to_sql_int(flag: bool) -> Option<i64> {
|
||||||
|
if flag {
|
||||||
|
Some(1)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// is our implementation resistant against sql injections?
|
// is our implementation resistant against sql injections?
|
||||||
impl CoordinatorDB {
|
impl CoordinatorDB {
|
||||||
// will either create a new db or load existing one. Will create according tables in new db
|
// will either create a new db or load existing one. Will create according tables in new db
|
||||||
@ -130,8 +139,6 @@ impl CoordinatorDB {
|
|||||||
order: &OrderRequest,
|
order: &OrderRequest,
|
||||||
bond_requirements: &BondRequirementResponse,
|
bond_requirements: &BondRequirementResponse,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let bool_to_sql_int = |flag: bool| if flag { Some(1) } else { None };
|
|
||||||
|
|
||||||
sqlx::query(
|
sqlx::query(
|
||||||
"INSERT OR REPLACE INTO maker_requests (robohash, is_buy_order, amount_sat,
|
"INSERT OR REPLACE INTO maker_requests (robohash, is_buy_order, amount_sat,
|
||||||
bond_ratio, offer_duration_ts, bond_address, bond_amount_sat)
|
bond_ratio, offer_duration_ts, bond_address, bond_amount_sat)
|
||||||
@ -181,8 +188,7 @@ impl CoordinatorDB {
|
|||||||
.bind(hex::decode(robohash_hex)?)
|
.bind(hex::decode(robohash_hex)?)
|
||||||
.execute(&*self.db_pool)
|
.execute(&*self.db_pool)
|
||||||
.await?;
|
.await?;
|
||||||
|
let awaiting_bond_offer = AwaitingBondOffer {
|
||||||
Ok(AwaitingBondOffer {
|
|
||||||
robohash_hex: hex::encode(fetched_values.0),
|
robohash_hex: hex::encode(fetched_values.0),
|
||||||
is_buy_order: fetched_values.1,
|
is_buy_order: fetched_values.1,
|
||||||
amount_satoshi: fetched_values.2 as u64,
|
amount_satoshi: fetched_values.2 as u64,
|
||||||
@ -190,7 +196,12 @@ impl CoordinatorDB {
|
|||||||
offer_duration_ts: fetched_values.4 as u64,
|
offer_duration_ts: fetched_values.4 as u64,
|
||||||
bond_address: fetched_values.5,
|
bond_address: fetched_values.5,
|
||||||
bond_amount_sat: fetched_values.6 as u64,
|
bond_amount_sat: fetched_values.6 as u64,
|
||||||
})
|
};
|
||||||
|
info!(
|
||||||
|
"Deleted offer from maker_requests table. Fetched offer: {:#?}",
|
||||||
|
awaiting_bond_offer
|
||||||
|
);
|
||||||
|
Ok(awaiting_bond_offer)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn move_offer_to_active(
|
pub async fn move_offer_to_active(
|
||||||
@ -203,6 +214,10 @@ impl CoordinatorDB {
|
|||||||
.fetch_and_delete_offer_from_bond_table(&data.robohash_hex)
|
.fetch_and_delete_offer_from_bond_table(&data.robohash_hex)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
info!(
|
||||||
|
"DATABASE: Moving maker offer to active trades table. Bond data: {:#?}",
|
||||||
|
data
|
||||||
|
);
|
||||||
sqlx::query(
|
sqlx::query(
|
||||||
"INSERT OR REPLACE INTO active_maker_offers (offer_id, robohash, is_buy_order, amount_sat,
|
"INSERT OR REPLACE INTO active_maker_offers (offer_id, robohash, is_buy_order, amount_sat,
|
||||||
bond_ratio, offer_duration_ts, bond_address, bond_amount_sat, bond_tx_hex, payout_address, musig_pub_nonce_hex, musig_pubkey_hex, taker_bond_address)
|
bond_ratio, offer_duration_ts, bond_address, bond_amount_sat, bond_tx_hex, payout_address, musig_pub_nonce_hex, musig_pubkey_hex, taker_bond_address)
|
||||||
@ -210,9 +225,9 @@ impl CoordinatorDB {
|
|||||||
)
|
)
|
||||||
.bind(offer_id)
|
.bind(offer_id)
|
||||||
.bind(hex::decode(&data.robohash_hex)?)
|
.bind(hex::decode(&data.robohash_hex)?)
|
||||||
.bind(remaining_offer_information.is_buy_order)
|
.bind(bool_to_sql_int(remaining_offer_information.is_buy_order))
|
||||||
.bind(remaining_offer_information.amount_satoshi as i64)
|
.bind(remaining_offer_information.amount_satoshi as i64)
|
||||||
.bind(remaining_offer_information.bond_ratio)
|
.bind(remaining_offer_information.bond_ratio as i32)
|
||||||
.bind(remaining_offer_information.offer_duration_ts as i64)
|
.bind(remaining_offer_information.offer_duration_ts as i64)
|
||||||
.bind(remaining_offer_information.bond_address.clone())
|
.bind(remaining_offer_information.bond_address.clone())
|
||||||
.bind(remaining_offer_information.bond_amount_sat as i64)
|
.bind(remaining_offer_information.bond_amount_sat as i64)
|
||||||
@ -223,7 +238,7 @@ impl CoordinatorDB {
|
|||||||
.bind(taker_bond_address)
|
.bind(taker_bond_address)
|
||||||
.execute(&*self.db_pool)
|
.execute(&*self.db_pool)
|
||||||
.await?;
|
.await?;
|
||||||
|
debug!("\nDATABASE: moved offer to active trades\n");
|
||||||
Ok(remaining_offer_information.offer_duration_ts)
|
Ok(remaining_offer_information.offer_duration_ts)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,6 +246,10 @@ impl CoordinatorDB {
|
|||||||
&self,
|
&self,
|
||||||
requested_offer: &OffersRequest,
|
requested_offer: &OffersRequest,
|
||||||
) -> Result<Option<Vec<PublicOffer>>> {
|
) -> Result<Option<Vec<PublicOffer>>> {
|
||||||
|
info!(
|
||||||
|
"Fetching suitable offers from db. Specification: {:#?}",
|
||||||
|
requested_offer
|
||||||
|
);
|
||||||
let fetched_offers = sqlx::query_as::<_, (String, i64, i64, String)> (
|
let fetched_offers = sqlx::query_as::<_, (String, i64, i64, String)> (
|
||||||
"SELECT offer_id, amount_sat, bond_amount_sat, taker_bond_address FROM active_maker_offers WHERE is_buy_order = ? AND amount_sat BETWEEN ? AND ?",
|
"SELECT offer_id, amount_sat, bond_amount_sat, taker_bond_address FROM active_maker_offers WHERE is_buy_order = ? AND amount_sat BETWEEN ? AND ?",
|
||||||
)
|
)
|
||||||
@ -252,7 +271,7 @@ impl CoordinatorDB {
|
|||||||
)
|
)
|
||||||
.collect();
|
.collect();
|
||||||
if available_offers.is_empty() {
|
if available_offers.is_empty() {
|
||||||
debug!("No available offers in db...");
|
info!("No available offers in db...");
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
Ok(Some(available_offers))
|
Ok(Some(available_offers))
|
||||||
@ -332,7 +351,7 @@ impl CoordinatorDB {
|
|||||||
.bind(public_offer.offer_id)
|
.bind(public_offer.offer_id)
|
||||||
.bind(public_offer.robohash_maker)
|
.bind(public_offer.robohash_maker)
|
||||||
.bind(hex::decode(&trade_and_taker_info.trade_data.robohash_hex)?)
|
.bind(hex::decode(&trade_and_taker_info.trade_data.robohash_hex)?)
|
||||||
.bind(public_offer.is_buy_order)
|
.bind(bool_to_sql_int(public_offer.is_buy_order))
|
||||||
.bind(public_offer.amount_sat)
|
.bind(public_offer.amount_sat)
|
||||||
.bind(public_offer.bond_ratio)
|
.bind(public_offer.bond_ratio)
|
||||||
.bind(public_offer.offer_duration_ts)
|
.bind(public_offer.offer_duration_ts)
|
||||||
|
@ -11,7 +11,7 @@ impl PublicOffers {
|
|||||||
amount_min_sat: (amount as f64 * 0.9).round() as u64, // range can be made variable in production
|
amount_min_sat: (amount as f64 * 0.9).round() as u64, // range can be made variable in production
|
||||||
amount_max_sat: (amount as f64 * 1.1).round() as u64,
|
amount_max_sat: (amount as f64 * 1.1).round() as u64,
|
||||||
};
|
};
|
||||||
|
debug!("Taker requesting offers: {:#?}", request);
|
||||||
let client = reqwest::blocking::Client::new();
|
let client = reqwest::blocking::Client::new();
|
||||||
let res = client
|
let res = client
|
||||||
.post(format!(
|
.post(format!(
|
||||||
@ -19,9 +19,27 @@ impl PublicOffers {
|
|||||||
taker_config.coordinator_endpoint, "/fetch-available-offers"
|
taker_config.coordinator_endpoint, "/fetch-available-offers"
|
||||||
))
|
))
|
||||||
.json(&request)
|
.json(&request)
|
||||||
.send()?
|
.send();
|
||||||
.json::<PublicOffers>()?;
|
let res = match res {
|
||||||
Ok(res)
|
Ok(res) => res,
|
||||||
|
Err(e) => {
|
||||||
|
return Err(anyhow!("Error fetching offers: {:#?}", e));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if res.status() == 204 {
|
||||||
|
return Ok(PublicOffers { offers: None });
|
||||||
|
} else {
|
||||||
|
match res.json::<PublicOffers>() {
|
||||||
|
Ok(offers) => {
|
||||||
|
debug!("Received offers: {:#?}", offers);
|
||||||
|
Ok(offers)
|
||||||
|
}
|
||||||
|
Err(e) => Err(anyhow!(
|
||||||
|
"Error unpacking fetching offers response: {:#?}",
|
||||||
|
e
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ask the user to select a offer to take on the CLI
|
// ask the user to select a offer to take on the CLI
|
||||||
|
Reference in New Issue
Block a user