From eae30e30e0b458053308b9314235e12f20855315 Mon Sep 17 00:00:00 2001 From: WuXie Date: Fri, 17 Apr 2026 09:59:14 +0800 Subject: [PATCH] Add enhanced member join and leave events Changes: - Emit mem_join event with (group_id, member, timestamp, member_count) - Emit mem_leave event with (group_id, member, timestamp, member_count) - Include member count after action for indexer tracking - Add test coverage for join/leave event flow These structured events enable indexers to track group membership changes over time and maintain accurate member count history. Closes #53 --- contracts/sorosave/src/group.rs | 14 ++++++++++---- contracts/sorosave/src/test.rs | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/contracts/sorosave/src/group.rs b/contracts/sorosave/src/group.rs index 5033347..999d859 100644 --- a/contracts/sorosave/src/group.rs +++ b/contracts/sorosave/src/group.rs @@ -74,11 +74,14 @@ pub fn join_group(env: &Env, member: Address, group_id: u64) -> Result<(), Contr } group.members.push_back(member.clone()); + let member_count = group.members.len(); storage::set_group(env, &group); storage::add_member_group(env, &member, group_id); - env.events() - .publish((crate::symbol_short!("grp_join"),), (group_id, member)); + env.events().publish( + (crate::symbol_short!("mem_join"),), + (group_id, member, env.ledger().timestamp(), member_count), + ); Ok(()) } @@ -112,11 +115,14 @@ pub fn leave_group(env: &Env, member: Address, group_id: u64) -> Result<(), Cont } group.members = new_members; + let member_count = group.members.len(); storage::set_group(env, &group); storage::remove_member_group(env, &member, group_id); - env.events() - .publish((crate::symbol_short!("grp_leav"),), (group_id, member)); + env.events().publish( + (crate::symbol_short!("mem_leav"),), + (group_id, member, env.ledger().timestamp(), member_count), + ); Ok(()) } diff --git a/contracts/sorosave/src/test.rs b/contracts/sorosave/src/test.rs index f1ac1ef..b6c52aa 100644 --- a/contracts/sorosave/src/test.rs +++ b/contracts/sorosave/src/test.rs @@ -222,3 +222,23 @@ fn test_set_group_admin() { let group = client.get_group(&group_id); assert_eq!(group.admin, new_admin); } + +#[test] +fn test_member_join_leave_events() { + let (env, admin, client, token) = setup_env(); + let group_id = create_test_group(&env, &client, &admin, &token); + + let member1 = Address::generate(&env); + + // Join event should include group_id, member, timestamp, and member_count + client.join_group(&member1, &group_id); + + let group = client.get_group(&group_id); + assert_eq!(group.members.len(), 2); // admin + member1 + + // Leave event should include group_id, member, timestamp, and updated member_count + client.leave_group(&member1, &group_id); + + let group = client.get_group(&group_id); + assert_eq!(group.members.len(), 1); // only admin remains +}