Skip to content

Commit c075679

Browse files
committed
Add test for rounded-zero protocol fee
1 parent d36dbb0 commit c075679

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

contracts/stream_contract/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ impl StreamContract {
659659
/// emits a `fee_collected` event, and returns the net amount.
660660
///
661661
/// If no protocol config exists or the fee rate is 0, returns `amount` unchanged.
662+
/// If fee calculation truncates to 0, no transfer/event occurs and `amount` is unchanged.
662663
/// Time complexity: O(1).
663664
fn collect_fee(env: &Env, token_address: &Address, amount: i128, stream_id: u64) -> i128 {
664665
match try_load_config(env) {

contracts/stream_contract/src/test.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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]
828862
fn test_no_fee_without_protocol_config() {
829863
let env = Env::default();

0 commit comments

Comments
 (0)