@@ -824,6 +824,40 @@ fn test_no_fee_event_when_fee_rate_is_zero() {
824824 ) ;
825825}
826826
827+ #[ test]
828+ fn test_no_fee_transfer_or_event_when_fee_rounds_to_zero ( ) {
829+ let env = Env :: default ( ) ;
830+ env. mock_all_auths ( ) ;
831+ let ( token, _) = create_token ( & env) ;
832+ let sender = Address :: generate ( & env) ;
833+ let admin = Address :: generate ( & env) ;
834+ let treasury = Address :: generate ( & env) ;
835+ mint ( & env, & token, & sender, 1_000 ) ;
836+
837+ let client = create_contract ( & env) ;
838+ let token_client = token:: Client :: new ( & env, & token) ;
839+
840+ // Non-zero fee rate, but tiny amount => fee rounds down to 0:
841+ // 1 * 200 / 10_000 = 0
842+ client. initialize ( & admin, & treasury, & 200 ) ;
843+ let id = client. create_stream ( & sender, & Address :: generate ( & env) , & token, & 1 , & 1 ) ;
844+
845+ assert_eq ! ( token_client. balance( & treasury) , 0 ) ;
846+
847+ let s = client. get_stream ( & id) . unwrap ( ) ;
848+ assert_eq ! ( s. deposited_amount, 1 ) ;
849+
850+ let events = env. events ( ) . all ( ) ;
851+ let fee_event = events. iter ( ) . find ( |e| {
852+ Symbol :: try_from_val ( & env, & e. 1 . get ( 0 ) . unwrap ( ) ) . unwrap ( )
853+ == Symbol :: new ( & env, "fee_collected" )
854+ } ) ;
855+ assert ! (
856+ fee_event. is_none( ) ,
857+ "fee_collected must not fire when rounded fee is 0"
858+ ) ;
859+ }
860+
827861#[ test]
828862fn test_no_fee_without_protocol_config ( ) {
829863 let env = Env :: default ( ) ;
0 commit comments