From 9c442c3bb644fa0c42e5ebcd8e8b921abe8d9e09 Mon Sep 17 00:00:00 2001 From: otobongdev Date: Tue, 30 Jun 2026 07:53:49 +0000 Subject: [PATCH] feat: add reward pool balance validation before hunt activation --- contracts/hunty-core/src/lib.rs | 24 +++++++++++++++++++++++- contracts/reward-manager/src/lib.rs | 8 ++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/contracts/hunty-core/src/lib.rs b/contracts/hunty-core/src/lib.rs index 793214a..2157b51 100644 --- a/contracts/hunty-core/src/lib.rs +++ b/contracts/hunty-core/src/lib.rs @@ -607,15 +607,37 @@ impl HuntyCore { if let Some(reward_manager_addr) = Storage::get_reward_manager(&env) { let mut balance_args: Vec = Vec::new(&env); balance_args.push_back(hunt_id.into_val(&env)); + + // Query the pool balance from the reward manager let pool_balance = match env.try_invoke_contract::( &reward_manager_addr, &Symbol::new(&env, "get_pool_balance"), - balance_args, + balance_args.clone(), ) { Ok(Ok(balance)) => balance, _ => return Err(HuntErrorCode::InsufficientRewardPool), }; hunt.reward_config.xlm_pool = pool_balance; + + // Query the minimum distribution amount for this pool + let min_distribution_amount = match env.try_invoke_contract::( + &reward_manager_addr, + &Symbol::new(&env, "get_min_distribution_amount"), + balance_args, + ) { + Ok(Ok(amount)) => amount, + _ => 0, + }; + + // Validate pool balance >= min_distribution_amount * max_winners + if min_distribution_amount > 0 && hunt.reward_config.max_winners > 0 { + let required = + min_distribution_amount.saturating_mul(hunt.reward_config.max_winners as i128); + if pool_balance < required { + return Err(HuntErrorCode::InsufficientRewardPool); + } + } + if !hunt.has_rewards_available() { return Err(HuntErrorCode::InsufficientRewardPool); } diff --git a/contracts/reward-manager/src/lib.rs b/contracts/reward-manager/src/lib.rs index ecb0291..f4f5e84 100644 --- a/contracts/reward-manager/src/lib.rs +++ b/contracts/reward-manager/src/lib.rs @@ -699,6 +699,14 @@ impl RewardManager { Storage::get_pool_balance(&env, hunt_id) } + /// Returns the minimum distribution amount configured for a hunt's reward pool. + /// Returns 0 if no pool has been created for the hunt. + pub fn get_min_distribution_amount(env: Env, hunt_id: u64) -> i128 { + Storage::get_pool_config(&env, hunt_id) + .map(|config| config.min_distribution_amount) + .unwrap_or(0) + } + /// Returns whether a reward has been distributed to a player for a hunt. pub fn is_reward_distributed(env: Env, hunt_id: u64, player: Address) -> bool { Storage::is_distributed(&env, hunt_id, &player)