From 08c4d797084d51a90bcebd69035601e7bdcc792a Mon Sep 17 00:00:00 2001 From: Gazzy-Lee Date: Wed, 26 Aug 2026 13:48:01 +0100 Subject: [PATCH] test: add withdraw-at-resume-timestamp regression test Add a dedicated test that calls withdraw() at the exact same ledger timestamp as resume() (zero elapsed seconds since resume) to guard against off-by-one errors in the elapsed-time math. The test asserts that withdrawable correctly reflects zero newly-streamed tokens in that instant, confirming resume() shifts start_time accurately and no phantom accrual occurs. --- tests/stream_pause_resume.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/stream_pause_resume.rs b/tests/stream_pause_resume.rs index 28239d13..96d5f407 100644 --- a/tests/stream_pause_resume.rs +++ b/tests/stream_pause_resume.rs @@ -192,3 +192,33 @@ fn multiple_pause_resume_cycles_accumulate_correctly() { // Only 100 + 200 + 50 = 350 seconds of actual streaming assert_eq!(client.withdrawable(), 350_000); } + +// ── Withdraw at same timestamp as resume ───────────────────────────────────── + +#[test] +fn withdraw_at_same_timestamp_as_resume_yields_zero_new_tokens() { + let env = base_env(); + let sender = Address::generate(&env); + let recipient = Address::generate(&env); + let (client, token_addr) = deploy_stream(&env, &sender, &recipient, 1_000, 3_600); + let tok = token::Client::new(&env, &token_addr); + + // Stream 300s → 300_000 earned + advance(&env, 300); + client.pause(&sender); + // Paused for 500s (no accrual) + advance(&env, 500); + // Resume — ledger timestamp has NOT advanced yet (zero elapsed since resume) + client.resume(&sender); + + // Withdrawable should still be 300_000 (no new tokens in zero seconds) + assert_eq!(client.withdrawable(), 300_000); + + // Actually withdraw everything that is available + let withdrawn = client.withdraw(&300_000); + assert_eq!(withdrawn, 300_000); + assert_eq!(tok.balance(&recipient), 300_000); + + // Nothing left + assert_eq!(client.withdrawable(), 0); +}