From d145b7d896326db3a727b65c0c034a21269b4e6b Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Tue, 11 Mar 2025 06:56:19 +0000 Subject: [PATCH 1/4] add error coverage for unrecognized events Signed-off-by: onur-ozkan --- mm2src/coins/tendermint/tendermint_tx_history_v2.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index 6f9e532085..2f85f899d6 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -617,9 +617,15 @@ where }, unrecognized => { - log::warn!( + let msg = format!( "Found an unrecognized event '{unrecognized}' in transaction history processing." ); + + #[cfg(test)] + panic!("{}", msg); + + #[cfg(not(test))] + log::warn!("{msg}"); }, }; } From f04b98dc05a56d027f1d64af645db1769e60399b Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Tue, 11 Mar 2025 07:54:41 +0000 Subject: [PATCH 2/4] add `covered_warn` logging macro Signed-off-by: onur-ozkan --- .../tendermint/tendermint_tx_history_v2.rs | 8 +------ mm2src/common/log.rs | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index 2f85f899d6..4a818b0eb9 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -617,15 +617,9 @@ where }, unrecognized => { - let msg = format!( + covered_warn!( "Found an unrecognized event '{unrecognized}' in transaction history processing." ); - - #[cfg(test)] - panic!("{}", msg); - - #[cfg(not(test))] - log::warn!("{msg}"); }, }; } diff --git a/mm2src/common/log.rs b/mm2src/common/log.rs index a30b0b83de..f237676ad2 100644 --- a/mm2src/common/log.rs +++ b/mm2src/common/log.rs @@ -160,6 +160,23 @@ pub fn short_log_time(ms: u64) -> DelayedFormat> { time.format("%d %H:%M:%S") } +#[cfg(not(test))] +#[macro_export] +macro_rules! covered_warn { + ($($arg:tt)+) => { + common::log::warn!($($arg)+) + }; +} + + +#[cfg(test)] +#[macro_export] +macro_rules! covered_warn { + ($($arg:tt)+) => { + panic!($($arg)+) + }; +} + /// Debug logging. /// /// This logging SHOULD be human-readable but it is not intended for the end users specifically. @@ -1176,4 +1193,10 @@ pub mod tests { assert!(tail[0].ends_with("/3:33) [tag] status 1%…")); }); } + + #[test] + #[should_panic(expected = "Fail with me...")] + fn test_covered_warn() { + covered_warn!("Fail with me..."); + } } From ffc0a0295197d233ac9928abc660d909b91bb489 Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Tue, 11 Mar 2025 10:18:32 +0000 Subject: [PATCH 3/4] fix unhandled ibc and htcl events Signed-off-by: onur-ozkan --- .../tendermint/tendermint_tx_history_v2.rs | 29 +++++++++++++------ mm2src/common/log.rs | 1 - 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index 4a818b0eb9..4afd3eb95d 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -459,7 +459,7 @@ where } /// Reads sender and receiver addresses properly from an HTLC event. - fn read_real_htlc_addresses(transfer_details: &mut TransferDetails, msg_event: &&Event) { + fn read_real_htlc_addresses(transfer_details: &mut TransferDetails, msg_event: &Event) { match msg_event.kind.as_str() { CREATE_HTLC_EVENT => { let from = some_or_return!(get_value_from_event_attributes( @@ -492,10 +492,16 @@ where } } - fn parse_transfer_values_from_events(tx_events: Vec<&Event>) -> Vec { + fn parse_transfer_values_from_events(mut tx_events: Vec<&Event>) -> Vec { let mut transfer_details_list: Vec = vec![]; - for event in tx_events.iter() { + for i in 0..tx_events.len() { + if i >= tx_events.len() { + continue; + } + + let event = tx_events[i]; + let amount_with_denoms = some_or_continue!(get_value_from_event_attributes( &event.attributes, AMOUNT_TAG_KEY, @@ -533,18 +539,20 @@ where // For HTLC transactions, the sender and receiver addresses in the "transfer" event will be incorrect. // Use `read_real_htlc_addresses` to handle them properly. - if let Some(htlc_event) = tx_events + if let Some(htlc_event_index) = tx_events .iter() - .find(|e| [CREATE_HTLC_EVENT, CLAIM_HTLC_EVENT].contains(&e.kind.as_str())) + .position(|e| [CREATE_HTLC_EVENT, CLAIM_HTLC_EVENT].contains(&e.kind.as_str())) { - read_real_htlc_addresses(&mut tx_details, htlc_event); + read_real_htlc_addresses(&mut tx_details, tx_events[htlc_event_index]); + tx_events.remove(htlc_event_index); } // For IBC transactions, the sender and receiver addresses in the "transfer" event will be incorrect. // Use `read_real_ibc_addresses` to handle them properly. - else if let Some(ibc_event) = tx_events.iter().find(|e| { + else if let Some(ibc_event_index) = tx_events.iter().position(|e| { [IBC_SEND_EVENT, IBC_RECEIVE_EVENT, IBC_NFT_RECEIVE_EVENT].contains(&e.kind.as_str()) }) { - read_real_ibc_addresses(&mut tx_details, ibc_event); + read_real_ibc_addresses(&mut tx_details, tx_events[ibc_event_index]); + tx_events.remove(ibc_event_index); } handle_new_transfer_event(&mut transfer_details_list, tx_details); @@ -643,7 +651,10 @@ where } } - fn get_transfer_details(tx_events: Vec, fee_amount_with_denom: String) -> Vec { + fn get_transfer_details(mut tx_events: Vec, fee_amount_with_denom: String) -> Vec { + tx_events.sort_by(|a, b| a.kind.cmp(&b.kind)); + tx_events.dedup(); + // We are only interested `DELEGATE_EVENT` events for delegation transactions. if let Some(delegate_event) = tx_events.iter().find(|e| e.kind == DELEGATE_EVENT) { return parse_transfer_values_from_events(vec![delegate_event]); diff --git a/mm2src/common/log.rs b/mm2src/common/log.rs index f237676ad2..41116073ca 100644 --- a/mm2src/common/log.rs +++ b/mm2src/common/log.rs @@ -168,7 +168,6 @@ macro_rules! covered_warn { }; } - #[cfg(test)] #[macro_export] macro_rules! covered_warn { From c5cd4312e6d3fe149ddc31ae47696958d6cbfe59 Mon Sep 17 00:00:00 2001 From: onur-ozkan Date: Tue, 11 Mar 2025 22:50:09 +0300 Subject: [PATCH 4/4] comment on out-of-bound exception check Signed-off-by: onur-ozkan --- mm2src/coins/tendermint/tendermint_tx_history_v2.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs index 4afd3eb95d..298d4219c3 100644 --- a/mm2src/coins/tendermint/tendermint_tx_history_v2.rs +++ b/mm2src/coins/tendermint/tendermint_tx_history_v2.rs @@ -496,8 +496,9 @@ where let mut transfer_details_list: Vec = vec![]; for i in 0..tx_events.len() { + // Avoid out-of-bounds exceptions after removing HTLC and IBC elements below. if i >= tx_events.len() { - continue; + break; } let event = tx_events[i];