From 4e2094e1c12284b059c4a3450b8c6f24a979605c Mon Sep 17 00:00:00 2001 From: urielit1313-creator Date: Tue, 13 Oct 2026 20:59:58 -0600 Subject: [PATCH] fix(milestones): return NotInitialized instead of panicking on missing treasury in release_issue (#487) --- contracts/milestones/src/lib.rs | 6 +++++- contracts/milestones/src/test.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/contracts/milestones/src/lib.rs b/contracts/milestones/src/lib.rs index 90c53d7..ea1d643 100644 --- a/contracts/milestones/src/lib.rs +++ b/contracts/milestones/src/lib.rs @@ -416,7 +416,8 @@ mod contract { mergefi_common::SplitError::SelfPayout => Error::SelfPayout, mergefi_common::SplitError::Overflow => Error::ArithmeticOverflow, })?; - let treasury: Address = mergefi_common::require_treasury::(&env).unwrap(); + let treasury: Address = + mergefi_common::require_treasury::(&env).ok_or(Error::NotInitialized)?; let token_client = token::Client::new(&env, &milestone.token); let contract_address = env.current_contract_address(); @@ -828,6 +829,9 @@ mod contract { } } // mod contract +pub use contract::*; + + /// Pays each contributor their share of `milestone.remaining_budget` (the /// unallocated remainder of the pool), computed as /// `remaining_budget * contribution.amount / total_budget` — i.e. in diff --git a/contracts/milestones/src/test.rs b/contracts/milestones/src/test.rs index 981ea64..cbd8613 100644 --- a/contracts/milestones/src/test.rs +++ b/contracts/milestones/src/test.rs @@ -1912,3 +1912,31 @@ fn test_release_issue_with_admin_as_recipient() { let distributable = 950_0000000i128; // after 5% fee assert_eq!(token_client.balance(&admin), distributable); } + +#[test] +fn test_release_issue_returns_not_initialized_if_treasury_missing() { + let env = Env::default(); + env.mock_all_auths(); + let (_admin, _treasury, client) = setup(&env); + + let token_admin = Address::generate(&env); + let (token_addr, asset_client, _token_client) = create_token(&env, &token_admin); + let sponsor = Address::generate(&env); + asset_client.mint(&sponsor, &10_000_000_000i128); + + client.create_milestone(&487u64, &sponsor, &token_addr, &10_000_000_000i128, &1_000u64); + client.allocate(&487u64, &101u64, &5_000_000_000i128); + + // Remove Treasury from instance storage + env.as_contract(&client.address, || { + env.storage().instance().remove(&DataKey::Treasury); + }); + + let maintainer = Address::generate(&env); + let err = client.try_release_issue( + &487u64, + &101u64, + &vec![&env, (maintainer, 10_000u32)], + ); + assert_eq!(err, Err(Ok(Error::NotInitialized))); +}