@@ -240,3 +240,129 @@ fn withdraw_failed_emits_no_event() {
240240 assert_eq ! ( client. balance( & creator) , 500 ) ;
241241 assert ! ( env. events( ) . all( ) . len( ) >= events_before) ;
242242}
243+
244+ // -------- Event tests for issue #942: emit events for primary state changes --------
245+
246+ #[ test]
247+ fn initialize_emits_event ( ) {
248+ let env = Env :: default ( ) ;
249+ env. mock_all_auths ( ) ;
250+
251+ let admin = Address :: generate ( & env) ;
252+ let token_admin = Address :: generate ( & env) ;
253+ #[ allow( deprecated) ]
254+ let token_id = env. register_stellar_asset_contract ( token_admin. clone ( ) ) ;
255+
256+ let contract_id = env. register_contract ( None , CreatorEarnings ) ;
257+ let client = CreatorEarningsClient :: new ( & env, & contract_id) ;
258+
259+ client. initialize ( & admin, & token_id) ;
260+
261+ let all_events = env. events ( ) . all ( ) ;
262+ let mut init_event: Option < (
263+ Address ,
264+ soroban_sdk:: Vec < soroban_sdk:: Val > ,
265+ soroban_sdk:: Val ,
266+ ) > = None ;
267+ for i in 0 ..all_events. len ( ) {
268+ let evt = all_events. get ( i) . unwrap ( ) ;
269+ let ( id, topics, _) = & evt;
270+ if * id != client. address {
271+ continue ;
272+ }
273+ let t0: Option < Symbol > = topics. get ( 0 ) . and_then ( |v| v. try_into_val ( & env) . ok ( ) ) ;
274+ if t0 == Some ( Symbol :: new ( & env, "initialized" ) ) {
275+ init_event = Some ( evt) ;
276+ break ;
277+ }
278+ }
279+
280+ let event = init_event. expect ( "initialized event not emitted" ) ;
281+ let data: InitializedEvent = event. 2 . try_into_val ( & env) . unwrap ( ) ;
282+ assert_eq ! ( data. admin, admin) ;
283+ assert_eq ! ( data. token, token_id) ;
284+ }
285+
286+ #[ test]
287+ fn add_authorized_emits_event ( ) {
288+ let env = Env :: default ( ) ;
289+ env. mock_all_auths ( ) ;
290+
291+ let admin = Address :: generate ( & env) ;
292+ let token_admin = Address :: generate ( & env) ;
293+ #[ allow( deprecated) ]
294+ let token_id = env. register_stellar_asset_contract ( token_admin. clone ( ) ) ;
295+
296+ let contract_id = env. register_contract ( None , CreatorEarnings ) ;
297+ let client = CreatorEarningsClient :: new ( & env, & contract_id) ;
298+
299+ client. initialize ( & admin, & token_id) ;
300+
301+ let depositor = Address :: generate ( & env) ;
302+ client. add_authorized ( & depositor) ;
303+
304+ let all_events = env. events ( ) . all ( ) ;
305+ let mut auth_event: Option < (
306+ Address ,
307+ soroban_sdk:: Vec < soroban_sdk:: Val > ,
308+ soroban_sdk:: Val ,
309+ ) > = None ;
310+ for i in 0 ..all_events. len ( ) {
311+ let evt = all_events. get ( i) . unwrap ( ) ;
312+ let ( id, topics, _) = & evt;
313+ if * id != client. address {
314+ continue ;
315+ }
316+ let t0: Option < Symbol > = topics. get ( 0 ) . and_then ( |v| v. try_into_val ( & env) . ok ( ) ) ;
317+ if t0 == Some ( Symbol :: new ( & env, "authorized_added" ) ) {
318+ auth_event = Some ( evt) ;
319+ break ;
320+ }
321+ }
322+
323+ let event = auth_event. expect ( "authorized_added event not emitted" ) ;
324+ let data: AuthorizedAddedEvent = event. 2 . try_into_val ( & env) . unwrap ( ) ;
325+ assert_eq ! ( data. depositor, depositor) ;
326+ }
327+
328+ #[ test]
329+ fn deposit_emits_event ( ) {
330+ let env = Env :: default ( ) ;
331+
332+ let ( _admin, creator, depositor, client, _, _) = setup ( & env) ;
333+
334+ let token_address: Address = env. as_contract ( & client. address , || {
335+ env. storage ( )
336+ . instance ( )
337+ . get ( & DataKey :: Token )
338+ . expect ( "token not set" )
339+ } ) ;
340+
341+ client. deposit ( & depositor, & creator, & 300 ) ;
342+
343+ let all_events = env. events ( ) . all ( ) ;
344+ let mut dep_event: Option < (
345+ Address ,
346+ soroban_sdk:: Vec < soroban_sdk:: Val > ,
347+ soroban_sdk:: Val ,
348+ ) > = None ;
349+ for i in 0 ..all_events. len ( ) {
350+ let evt = all_events. get ( i) . unwrap ( ) ;
351+ let ( id, topics, _) = & evt;
352+ if * id != client. address {
353+ continue ;
354+ }
355+ let t0: Option < Symbol > = topics. get ( 0 ) . and_then ( |v| v. try_into_val ( & env) . ok ( ) ) ;
356+ if t0 == Some ( Symbol :: new ( & env, "deposit" ) ) {
357+ dep_event = Some ( evt) ;
358+ break ;
359+ }
360+ }
361+
362+ let event = dep_event. expect ( "deposit event not emitted" ) ;
363+ let data: DepositEvent = event. 2 . try_into_val ( & env) . unwrap ( ) ;
364+ assert_eq ! ( data. from, depositor) ;
365+ assert_eq ! ( data. creator, creator) ;
366+ assert_eq ! ( data. amount, 300 ) ;
367+ assert_eq ! ( data. token, token_address) ;
368+ }
0 commit comments