@@ -328,3 +328,83 @@ fn require_auth_receive_payment_fails_without_auth() {
328328 let result = client. try_receive_payment ( & attacker, & 100 , & false ) ;
329329 assert ! ( result. is_err( ) , "receive_payment must require auth" ) ;
330330}
331+
332+ #[ test]
333+ fn set_admin_non_admin_caller_panics ( ) {
334+ let env = Env :: default ( ) ;
335+ env. mock_all_auths ( ) ;
336+ let admin = Address :: generate ( & env) ;
337+ let attacker = Address :: generate ( & env) ;
338+ let new_admin = Address :: generate ( & env) ;
339+ let ( _, client) = create_pool ( & env) ;
340+ let ( usdc, _, _) = create_usdc ( & env, & admin) ;
341+ client. init ( & admin, & usdc) ;
342+ let result = client. try_set_admin ( & attacker, & new_admin) ;
343+ assert ! ( result. is_err( ) , "non-admin cannot call set_admin" ) ;
344+ }
345+ #[ test]
346+ fn claim_admin_wrong_pending_panics ( ) {
347+ let env = Env :: default ( ) ;
348+ env. mock_all_auths ( ) ;
349+ let admin = Address :: generate ( & env) ;
350+ let new_admin = Address :: generate ( & env) ;
351+ let attacker = Address :: generate ( & env) ;
352+ let ( _, client) = create_pool ( & env) ;
353+ let ( usdc, _, _) = create_usdc ( & env, & admin) ;
354+ client. init ( & admin, & usdc) ;
355+ client. set_admin ( & admin, & new_admin) ;
356+ let result = client. try_claim_admin ( & attacker) ;
357+ assert ! ( result. is_err( ) , "wrong pending admin cannot claim" ) ;
358+ }
359+ #[ test]
360+ fn receive_payment_emits_event ( ) {
361+ let env = Env :: default ( ) ;
362+ env. mock_all_auths ( ) ;
363+ let admin = Address :: generate ( & env) ;
364+ let ( pool_addr, client) = create_pool ( & env) ;
365+ let ( usdc, _, usdc_admin) = create_usdc ( & env, & admin) ;
366+ client. init ( & admin, & usdc) ;
367+ fund_pool ( & usdc_admin, & pool_addr, 500 ) ;
368+ client. receive_payment ( & admin, & 100 , & true ) ;
369+ let events = env. events ( ) . all ( ) ;
370+ assert ! ( events. len( ) >= 1 ) ;
371+ }
372+ #[ test]
373+ fn distribute_self_recipient_panics ( ) {
374+ let env = Env :: default ( ) ;
375+ env. mock_all_auths ( ) ;
376+ let admin = Address :: generate ( & env) ;
377+ let ( pool_addr, client) = create_pool ( & env) ;
378+ let ( usdc, _, usdc_admin) = create_usdc ( & env, & admin) ;
379+ client. init ( & admin, & usdc) ;
380+ fund_pool ( & usdc_admin, & pool_addr, 500 ) ;
381+ let result = client. try_distribute ( & admin, & pool_addr, & 100 ) ;
382+ assert ! ( result. is_err( ) , "cannot distribute to contract itself" ) ;
383+ }
384+ #[ test]
385+ fn distribute_non_admin_panics ( ) {
386+ let env = Env :: default ( ) ;
387+ env. mock_all_auths ( ) ;
388+ let admin = Address :: generate ( & env) ;
389+ let attacker = Address :: generate ( & env) ;
390+ let recipient = Address :: generate ( & env) ;
391+ let ( pool_addr, client) = create_pool ( & env) ;
392+ let ( usdc, _, usdc_admin) = create_usdc ( & env, & admin) ;
393+ client. init ( & admin, & usdc) ;
394+ fund_pool ( & usdc_admin, & pool_addr, 500 ) ;
395+ let result = client. try_distribute ( & attacker, & recipient, & 100 ) ;
396+ assert ! ( result. is_err( ) , "non-admin cannot distribute" ) ;
397+ }
398+ #[ test]
399+ fn distribute_zero_amount_panics ( ) {
400+ let env = Env :: default ( ) ;
401+ env. mock_all_auths ( ) ;
402+ let admin = Address :: generate ( & env) ;
403+ let recipient = Address :: generate ( & env) ;
404+ let ( pool_addr, client) = create_pool ( & env) ;
405+ let ( usdc, _, usdc_admin) = create_usdc ( & env, & admin) ;
406+ client. init ( & admin, & usdc) ;
407+ fund_pool ( & usdc_admin, & pool_addr, 500 ) ;
408+ let result = client. try_distribute ( & admin, & recipient, & 0 ) ;
409+ assert ! ( result. is_err( ) , "zero amount distribute must fail" ) ;
410+ }
0 commit comments