From 319361915eb00ec0b41bf4a809b865bc8c4533d8 Mon Sep 17 00:00:00 2001 From: bakinsuy Date: Thu, 30 Jul 2026 14:09:38 +0100 Subject: [PATCH] Fix #438: Zero effective_amount_raised in cancel_campaign cancel_campaign (and admin_cancel_campaign) now set campaign.effective_amount_raised = 0 to prevent stale values from persisting on cancelled campaigns. claim_refund is also guarded: the effective_amount_raised deduction is skipped for cancelled campaigns, since the value is already zeroed at cancel time and attempting to subtract from zero would overflow. --- src/campaigns/cancel.rs | 2 ++ src/contributions.rs | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/campaigns/cancel.rs b/src/campaigns/cancel.rs index 9fda789d..0f33a357 100644 --- a/src/campaigns/cancel.rs +++ b/src/campaigns/cancel.rs @@ -45,6 +45,7 @@ pub(crate) fn cancel_campaign(env: &Env, campaign_id: u32) -> Result<(), Error> campaign.is_cancelled = true; campaign.is_active = false; + campaign.effective_amount_raised = 0; set_campaign(env, campaign_id, &campaign); remove_voting_state(env, campaign_id); prune_bookmarks_for_campaign(env, campaign_id); @@ -94,6 +95,7 @@ pub(crate) fn admin_cancel_campaign( campaign.is_cancelled = true; campaign.is_active = false; + campaign.effective_amount_raised = 0; set_campaign(env, campaign_id, &campaign); remove_voting_state(env, campaign_id); prune_bookmarks_for_campaign(env, campaign_id); diff --git a/src/contributions.rs b/src/contributions.rs index 1a8ec0fc..67358975 100644 --- a/src/contributions.rs +++ b/src/contributions.rs @@ -278,10 +278,12 @@ pub(crate) fn claim_refund(env: &Env, campaign_id: u32, contributor: Address) -> decrement_contributor_count(env, campaign_id); - campaign.effective_amount_raised = campaign - .effective_amount_raised - .checked_sub(amount) - .ok_or(Error::Overflow)?; + if !campaign.is_cancelled { + campaign.effective_amount_raised = campaign + .effective_amount_raised + .checked_sub(amount) + .ok_or(Error::Overflow)?; + } set_campaign(env, campaign_id, &campaign); let total_raised = get_total_raised_global(env);