From dedd9322e9a571f3a184793ddb25094a84d67535 Mon Sep 17 00:00:00 2001 From: Sasa Prsic Date: Tue, 1 Apr 2025 14:35:22 +0200 Subject: [PATCH 1/4] Add receiver address to the query result. --- src/main.rs | 102 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/src/main.rs b/src/main.rs index bc3bf0f..0342a88 100755 --- a/src/main.rs +++ b/src/main.rs @@ -485,49 +485,73 @@ async fn transactions( // Initialize the result variables let mut transaction_results: TransactionResult = TransactionResult::default(); - // Return the combined results + let mut eth_send_query = ethereum_sends.into_boxed(); if let Some(eth_address) = address_query.eth_address { - let ethereum_sends_results = ethereum_sends - .select(EthereumSend::as_select()) - .filter(schema::ethereum_sends::depositor_address.eq(format!("{:?}", eth_address))) - .order_by(schema::ethereum_sends::source_timestamp.desc()) - .limit(500) - .load::(&mut conn); - - transaction_results.eth_send = ethereum_sends_results - .map_err(|e| { - tracing::error!("Cannot get ethereum send transactions:: {e:#}"); - ErrorResponse::with_status_and_headers( - e.into(), - StatusCode::INTERNAL_SERVER_ERROR, - &[("Cache-Control", "public, max-age=60, must-revalidate")], - ) - })? - .into_iter() - .map(map_ethereum_send_to_transaction_result) - .collect(); + eth_send_query = eth_send_query + .filter(schema::ethereum_sends::depositor_address.eq(format!("{:?}", eth_address))); } if let Some(avail_address) = address_query.avail_address { - let avail_sends_results = avail_sends - .select(AvailSend::as_select()) - .filter(schema::avail_sends::depositor_address.eq(format!("{:?}", avail_address))) - .order_by(schema::avail_sends::source_timestamp.desc()) - .limit(500) - .load::(&mut conn); - - transaction_results.avail_send = avail_sends_results - .map_err(|e| { - tracing::error!("Cannot get avail send transactions: {e:#}"); - ErrorResponse::with_status_and_headers( - e.into(), - StatusCode::INTERNAL_SERVER_ERROR, - &[("Cache-Control", "public, max-age=60, must-revalidate")], - ) - })? - .into_iter() - .map(map_avail_send_to_transaction_result) - .collect(); + eth_send_query = eth_send_query + .or_filter(schema::ethereum_sends::receiver_address.eq(format!("{:?}", avail_address))); + } + + // Return the combined results + let ethereum_sends_results = eth_send_query + .select(EthereumSend::as_select()) + .order_by(schema::ethereum_sends::source_timestamp.desc()) + .limit(500) + .load::(&mut conn); + + match ethereum_sends_results { + Ok(transaction) => { + transaction_results.eth_send = transaction + .into_iter() + .map(map_ethereum_send_to_transaction_result) + .collect() + } + Err(e) => { + tracing::error!("Cannot get ethereum send transactions: {:?}", e); + return ( + StatusCode::INTERNAL_SERVER_ERROR, + [("Cache-Control", "max-age=60, must-revalidate".to_string())], + Json(json!({ "error": e.to_string()})), + ); + } + } + + let mut avail_send_query = avail_sends.into_boxed(); + if let Some(avail_address) = address_query.avail_address { + avail_send_query = avail_send_query + .filter(schema::avail_sends::depositor_address.eq(format!("{:?}", avail_address))); + } + + if let Some(eth_address) = address_query.eth_address { + avail_send_query = avail_send_query + .or_filter(schema::avail_sends::receiver_address.eq(format!("{:?}", eth_address))); + } + + let avail_sends_results = avail_send_query + .select(AvailSend::as_select()) + .order_by(schema::avail_sends::source_timestamp.desc()) + .limit(500) + .load::(&mut conn); + + match avail_sends_results { + Ok(transaction) => { + transaction_results.avail_send = transaction + .into_iter() + .map(map_avail_send_to_transaction_result) + .collect() + } + Err(e) => { + tracing::error!("Cannot get avail send transactions: {:?}", e); + return ( + StatusCode::INTERNAL_SERVER_ERROR, + [("Cache-Control", "max-age=60, must-revalidate".to_string())], + Json(json!({ "error": e.to_string()})), + ); + } } Ok(( From 0871b66c92564e28d28708f67181bf76cbdecd7c Mon Sep 17 00:00:00 2001 From: Sasa Prsic Date: Tue, 1 Apr 2025 15:11:11 +0200 Subject: [PATCH 2/4] Add default tx result size. --- .env.example | 3 +++ src/main.rs | 27 +++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 866019c..4049503 100755 --- a/.env.example +++ b/.env.example @@ -18,6 +18,9 @@ SLOT_MAPPING_CACHE_MAXAGE= TRANSACTIONS_CACHE_MAXAGE= HOST= PORT= +BEACONCHAIN_API_KEY= +TRANSACTIONS_RESULT_MAX_SIZE= + POSTGRES_URL= PG_USERNAME= diff --git a/src/main.rs b/src/main.rs index 0342a88..c97c160 100755 --- a/src/main.rs +++ b/src/main.rs @@ -52,6 +52,7 @@ use tower_http::{ cors::{Any, CorsLayer}, trace::TraceLayer, }; +use tracing::warn; use tracing_subscriber::prelude::*; #[cfg(not(target_env = "msvc"))] @@ -186,6 +187,7 @@ struct AppState { slot_mapping_cache_maxage: u32, transactions_cache_maxage: u32, connection_pool: r2d2::Pool>, + transactions_result_max_size: u32, chains: HashMap, } @@ -462,6 +464,8 @@ fn map_avail_send_to_transaction_result(send: AvailSend) -> TransactionData { } } +/// transactions returns bridge transactions that are matched with a provided query params +/// limits the output to the most recent (500 default) transaction. #[inline(always)] async fn transactions( Query(address_query): Query, @@ -500,7 +504,7 @@ async fn transactions( let ethereum_sends_results = eth_send_query .select(EthereumSend::as_select()) .order_by(schema::ethereum_sends::source_timestamp.desc()) - .limit(500) + .limit(state.transactions_result_max_size.into()) .load::(&mut conn); match ethereum_sends_results { @@ -534,7 +538,7 @@ async fn transactions( let avail_sends_results = avail_send_query .select(AvailSend::as_select()) .order_by(schema::avail_sends::source_timestamp.desc()) - .limit(500) + .limit(state.transactions_result_max_size.into()) .load::(&mut conn); match avail_sends_results { @@ -554,6 +558,19 @@ async fn transactions( } } + let avail_send_count = transaction_results.avail_send.len() as u32; + let eth_send_count = transaction_results.eth_send.len() as u32; + + // if number of results is the same as the configure value + if avail_send_count >= state.transactions_result_max_size + || eth_send_count >= state.transactions_result_max_size + { + warn!( + "Transaction result has more items that the configured {}", + state.transactions_result_max_size + ); + } + Ok(( StatusCode::OK, [( @@ -1281,6 +1298,12 @@ async fn main() { }) .unwrap_or(60), connection_pool, + transactions_result_max_size: env::var("TRANSACTIONS_RESULT_MAX_SIZE") + .ok() + .and_then(|transactions_mapping_response| { + transactions_mapping_response.parse::().ok() + }) + .unwrap_or(500), chains, }); From 801179940eb2148c80a6589fc6a75e01f338d86c Mon Sep 17 00:00:00 2001 From: Sasa Prsic Date: Tue, 10 Jun 2025 13:46:30 +0200 Subject: [PATCH 3/4] Revalidate cache. --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index c97c160..c2be042 100755 --- a/src/main.rs +++ b/src/main.rs @@ -576,7 +576,7 @@ async fn transactions( [( "Cache-Control", format!( - "public, max-age={}, immutable", + "public, max-age={}, must-revalidate", state.transactions_cache_maxage ), )], From 869da229f9353411f07b3c73b1cb5083c0a17078 Mon Sep 17 00:00:00 2001 From: Sasa Prsic Date: Tue, 10 Jun 2025 14:21:13 +0200 Subject: [PATCH 4/4] Fix some conflicts. --- src/main.rs | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/main.rs b/src/main.rs index c2be042..23d527f 100755 --- a/src/main.rs +++ b/src/main.rs @@ -516,11 +516,11 @@ async fn transactions( } Err(e) => { tracing::error!("Cannot get ethereum send transactions: {:?}", e); - return ( + return Ok(( StatusCode::INTERNAL_SERVER_ERROR, [("Cache-Control", "max-age=60, must-revalidate".to_string())], Json(json!({ "error": e.to_string()})), - ); + )); } } @@ -550,11 +550,11 @@ async fn transactions( } Err(e) => { tracing::error!("Cannot get avail send transactions: {:?}", e); - return ( + return Ok(( StatusCode::INTERNAL_SERVER_ERROR, [("Cache-Control", "max-age=60, must-revalidate".to_string())], Json(json!({ "error": e.to_string()})), - ); + )); } } @@ -572,17 +572,16 @@ async fn transactions( } Ok(( - StatusCode::OK, - [( - "Cache-Control", - format!( - "public, max-age={}, must-revalidate", - state.transactions_cache_maxage - ), - )], - Json(json!(transaction_results)), + StatusCode::OK, + [( + "Cache-Control", + format!( + "public, max-age={}, must-revalidate", + state.transactions_cache_maxage), + )], + Json(json!(transaction_results)) ) - .into_response()) + .into_response()) } #[inline(always)] @@ -730,7 +729,7 @@ async fn get_avl_proof( message_id_query.to_be_bytes_vec(), U256::from(1).to_be_bytes_vec(), ] - .concat(), + .concat(), ); let result = hasher.finalize(); let proof: Result = state @@ -1080,13 +1079,13 @@ async fn get_proof( ) })? { Ok(SuccinctAPIResponse { - data: Some(data), .. - }) => data, + data: Some(data), .. + }) => data, Ok(SuccinctAPIResponse { - success: Some(false), - error: Some(data), - .. - }) => { + success: Some(false), + error: Some(data), + .. + }) => { if data.contains("not in the range of blocks") { tracing::warn!( "Succinct VectorX contract not updated yet! Response: {}", @@ -1430,8 +1429,8 @@ async fn track_slot_avail_task(state: Arc) -> Result<()> { "{}/eth/v2/beacon/blocks/{}", state.beaconchain_base_url, slot )) - .await - .context("Cannot get beacon block")?; + .await + .context("Cannot get beacon block")?; let root = response .json::() .await