From d2769ad21fb296d1e95dd84275ad84ee6f647f14 Mon Sep 17 00:00:00 2001 From: akprinciple Date: Mon, 31 Aug 2026 00:26:14 +0100 Subject: [PATCH] Add test for recurring disbursement failure without mutating schedule on insufficient balance --- contracts/accord/src/test.rs | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/contracts/accord/src/test.rs b/contracts/accord/src/test.rs index ea403c66..745fbd57 100644 --- a/contracts/accord/src/test.rs +++ b/contracts/accord/src/test.rs @@ -7344,6 +7344,52 @@ fn frozen_contract_blocks_recurring_disbursement_and_unfreezing_restores_it() { assert_eq!(schedule_after_unfreeze.total_disbursed, 1_000_000_i128); } +#[test] +fn recurring_disbursement_returns_transfer_failed_without_mutating_schedule_on_insufficient_balance() { + let (env, client, owner_a, owner_b, owner_c, _, token_client) = setup(2); + let recipient = Address::generate(&env); + let amount = 1_000_000_000_001_i128; + let interval = 3_600_u64; + + let create_id = client.create_recurring_proposal( + &owner_a, + &recipient, + &token_client.address, + &amount, + &interval, + &NOW, + &(NOW + 86_400), + &0_u64, + &10_000_000_i128, + &RecurringKind::FixedAmountPerPeriod, + &str(&env, "Insufficient balance schedule"), + &DEADLINE, + &ProposalCategory::Ops, + ); + + client.approve(&owner_a, &create_id); + client.approve(&owner_b, &create_id); + client.execute(&owner_c, &create_id); + + let schedule_before = client.get_recurring_payment(&1_u64); + assert_eq!(schedule_before.last_disbursed_at, 0); + assert_eq!(schedule_before.total_disbursed, 0); + assert_eq!(schedule_before.periods_disbursed, 0); + + set_timestamp(&env, NOW + interval + 1); + assert_eq!( + client.try_disburse_recurring(&1_u64), + Err(Ok(ContractError::TransferFailed)) + ); + + let schedule_after = client.get_recurring_payment(&1_u64); + assert_eq!(schedule_after.last_disbursed_at, 0); + assert_eq!(schedule_after.total_disbursed, 0); + assert_eq!(schedule_after.periods_disbursed, 0); + assert_eq!(schedule_after.status, RecurringStatus::Active); + assert_eq!(token_client.balance(&client.address), 1_000_000_000_000_i128); +} + #[test] fn linear_vesting_claimable_amount_matches_time_proportional_checkpoints() { let (env, client, owner_a, owner_b, owner_c, _, token_client) = setup(2);