From 320cd15c62d598006e6490eb229f609b182c357a Mon Sep 17 00:00:00 2001 From: Moore Date: Fri, 20 Feb 2026 10:21:02 +0100 Subject: [PATCH 1/2] Add settlement completion event emission - Define SettlementCompleted event with sender, recipient, token, and amount fields - Emit event after successful settlement in confirm_payout - Add test_settlement_completed_event to verify event emission and field correctness - Update test_events_emitted to verify settlement event alongside existing events --- src/events.rs | 13 +++++++++++++ src/lib.rs | 9 ++++++++- src/test.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/events.rs b/src/events.rs index cf511c6..8c05b45 100644 --- a/src/events.rs +++ b/src/events.rs @@ -57,3 +57,16 @@ pub fn emit_fees_withdrawn(env: &Env, to: Address, amount: i128) { env.events() .publish((symbol_short!("fees_with"),), (to, amount)); } + +pub fn emit_settlement_completed( + env: &Env, + sender: Address, + recipient: Address, + token: Address, + amount: i128, +) { + env.events().publish( + (symbol_short!("settled"),), + (sender, recipient, token, amount), + ); +} diff --git a/src/lib.rs b/src/lib.rs index 383a553..dad6aaf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -177,7 +177,14 @@ impl SwiftRemitContract { // Mark settlement as executed to prevent duplicates set_settlement_hash(&env, remittance_id); - emit_remittance_completed(&env, remittance_id, remittance.agent, payout_amount); + emit_remittance_completed(&env, remittance_id, remittance.agent.clone(), payout_amount); + emit_settlement_completed( + &env, + remittance.sender, + remittance.agent, + usdc_token, + payout_amount, + ); Ok(()) } diff --git a/src/test.rs b/src/test.rs index 959de2e..0eed555 100644 --- a/src/test.rs +++ b/src/test.rs @@ -464,12 +464,19 @@ fn test_events_emitted() { contract.confirm_payout(&remittance_id); let events = env.events().all(); - let complete_event = events.last().unwrap(); + let complete_event = events.iter().rev().nth(1).unwrap(); assert_eq!( complete_event.topics, (symbol_short!("completed"),).into_val(&env) ); + + // Verify settlement completed event is also emitted + let settlement_event = events.last().unwrap(); + assert_eq!( + settlement_event.topics, + (symbol_short!("settled"),).into_val(&env) + ); } #[test] @@ -827,6 +834,49 @@ fn test_settlement_hash_storage_efficiency() { // This is verified by the fact that the contract still functions correctly } +#[test] +fn test_settlement_completed_event() { + let env = Env::default(); + env.mock_all_auths(); + + let admin = Address::generate(&env); + let token_admin = Address::generate(&env); + let token = create_token_contract(&env, &token_admin); + let sender = Address::generate(&env); + let agent = Address::generate(&env); + + token.mint(&sender, &10000); + + let contract = create_swiftremit_contract(&env); + contract.initialize(&admin, &token.address, &250); + contract.register_agent(&agent); + + let remittance_id = contract.create_remittance(&sender, &agent, &1000, &None); + contract.confirm_payout(&remittance_id); + + // Get all events and find the settlement completed event + let events = env.events().all(); + let settlement_event = events + .iter() + .find(|e| { + e.topics.get(0).unwrap() == symbol_short!("settled").into_val(&env) + }) + .expect("Settlement completed event should be emitted"); + + // Verify event topic + assert_eq!( + settlement_event.topics, + (symbol_short!("settled"),).into_val(&env) + ); + + // Verify event data contains correct fields + let event_data: (Address, Address, Address, i128) = settlement_event.data.clone().try_into_val(&env).unwrap(); + assert_eq!(event_data.0, sender); + assert_eq!(event_data.1, agent); + assert_eq!(event_data.2, token.address); + assert_eq!(event_data.3, 975); // payout_amount = 1000 - 25 (fee) +} + #[test] fn test_duplicate_prevention_with_expiry() { let env = Env::default(); From d902d2399a233da9cbdc2744322633c2a966a123 Mon Sep 17 00:00:00 2001 From: Moore Date: Fri, 20 Feb 2026 10:47:04 +0100 Subject: [PATCH 2/2] Add documentation and improve code clarity for settlement event - Add doc comment to emit_settlement_completed function - Add inline comments to clarify event emission flow in confirm_payout - Improve code readability without changing functionality --- src/events.rs | 2 ++ src/lib.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/events.rs b/src/events.rs index 8c05b45..b549acd 100644 --- a/src/events.rs +++ b/src/events.rs @@ -58,6 +58,8 @@ pub fn emit_fees_withdrawn(env: &Env, to: Address, amount: i128) { .publish((symbol_short!("fees_with"),), (to, amount)); } +/// Emits a settlement completed event with full transaction details. +/// This event includes sender, recipient (agent), token address, and payout amount. pub fn emit_settlement_completed( env: &Env, sender: Address, diff --git a/src/lib.rs b/src/lib.rs index dad6aaf..ed3d15a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -177,7 +177,10 @@ impl SwiftRemitContract { // Mark settlement as executed to prevent duplicates set_settlement_hash(&env, remittance_id); + // Emit events for settlement completion emit_remittance_completed(&env, remittance_id, remittance.agent.clone(), payout_amount); + + // Emit detailed settlement event with all transaction details emit_settlement_completed( &env, remittance.sender,