diff --git a/src/events.rs b/src/events.rs index cf511c6..b549acd 100644 --- a/src/events.rs +++ b/src/events.rs @@ -57,3 +57,18 @@ pub fn emit_fees_withdrawn(env: &Env, to: Address, amount: i128) { env.events() .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, + 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..ed3d15a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -177,7 +177,17 @@ 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 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, + 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();