Skip to content

Commit b967563

Browse files
Merge pull request #379 from nnennaokoye/nnennaokoye/predictify-contracts
test: add comprehensive tests for minimum pool size for resolution
2 parents 0f09f9b + b63b588 commit b967563

File tree

3 files changed

+536
-41
lines changed

3 files changed

+536
-41
lines changed

contracts/predictify-hybrid/src/lib.rs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ const DEFAULT_CLAIM_PERIOD_SECONDS: u64 = 90 * 24 * 60 * 60;
137137
const GLOBAL_CLAIM_PERIOD_KEY: &str = "claim_timeout";
138138
const MARKET_CLAIM_PERIODS_KEY: &str = "claim_overrides";
139139
const TREASURY_STORAGE_KEY: &str = "Treasury";
140+
const GLOBAL_MIN_POOL_SIZE_KEY: &str = "global_min_pool";
140141

141142
#[contractimpl]
142143
impl PredictifyHybrid {
@@ -3602,6 +3603,44 @@ impl PredictifyHybrid {
36023603
Ok(())
36033604
}
36043605

3606+
/// Set global minimum pool size for resolution (admin only).
3607+
///
3608+
/// Applies to all markets where `min_pool_size` is `None`.
3609+
/// A value of 0 disables any global minimum.
3610+
pub fn set_global_min_pool_size(
3611+
env: Env,
3612+
admin: Address,
3613+
min_pool: i128,
3614+
) -> Result<(), Error> {
3615+
admin.require_auth();
3616+
let stored_admin: Address = env
3617+
.storage()
3618+
.persistent()
3619+
.get(&Symbol::new(&env, "Admin"))
3620+
.unwrap_or_else(|| panic_with_error!(env, Error::AdminNotSet));
3621+
if admin != stored_admin {
3622+
return Err(Error::Unauthorized);
3623+
}
3624+
3625+
if min_pool < 0 {
3626+
return Err(Error::InvalidInput);
3627+
}
3628+
3629+
env.storage()
3630+
.persistent()
3631+
.set(&Symbol::new(&env, GLOBAL_MIN_POOL_SIZE_KEY), &min_pool);
3632+
Ok(())
3633+
}
3634+
3635+
/// Get global minimum pool size for resolution.
3636+
/// Returns 0 when not configured.
3637+
pub fn get_global_min_pool_size(env: Env) -> i128 {
3638+
env.storage()
3639+
.persistent()
3640+
.get(&Symbol::new(&env, GLOBAL_MIN_POOL_SIZE_KEY))
3641+
.unwrap_or(0)
3642+
}
3643+
36053644
/// Set per-event minimum and maximum bet limits (admin only).
36063645
/// Overrides global limits for the given market.
36073646
pub fn set_event_bet_limits(
@@ -4584,8 +4623,13 @@ impl PredictifyHybrid {
45844623
return Err(Error::MarketClosed);
45854624
}
45864625

4587-
// Verify min_pool_size is set and not met
4588-
let min_pool = market.min_pool_size.unwrap_or(0);
4626+
// Verify effective min pool is set and not met (per-market override, else global)
4627+
let global_min: i128 = env
4628+
.storage()
4629+
.persistent()
4630+
.get(&Symbol::new(&env, GLOBAL_MIN_POOL_SIZE_KEY))
4631+
.unwrap_or(0);
4632+
let min_pool = market.min_pool_size.unwrap_or(global_min);
45894633
if min_pool <= 0 || market.total_staked >= min_pool {
45904634
return Err(Error::InvalidState);
45914635
}

contracts/predictify-hybrid/src/resolution.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,12 @@ impl MarketResolutionManager {
12881288
// Validate market for resolution (includes min pool size check)
12891289
let validation = MarketResolutionValidator::validate_market_for_resolution(env, &market);
12901290
if let Err(Error::InvalidState) = validation {
1291-
let min_pool = market.min_pool_size.unwrap_or(0);
1291+
let global_min: i128 = env
1292+
.storage()
1293+
.persistent()
1294+
.get(&Symbol::new(env, "global_min_pool"))
1295+
.unwrap_or(0);
1296+
let min_pool = market.min_pool_size.unwrap_or(global_min);
12921297
crate::events::EventEmitter::emit_min_pool_size_not_met(
12931298
env,
12941299
market_id,
@@ -1531,11 +1536,15 @@ impl MarketResolutionValidator {
15311536
return Err(Error::MarketClosed);
15321537
}
15331538

1534-
// Check minimum pool size requirement
1535-
if let Some(min_pool) = market.min_pool_size {
1536-
if min_pool > 0 && market.total_staked < min_pool {
1537-
return Err(Error::InvalidState);
1538-
}
1539+
// Check minimum pool size requirement (per-market override, else global)
1540+
let global_min: i128 = env
1541+
.storage()
1542+
.persistent()
1543+
.get(&Symbol::new(env, "global_min_pool"))
1544+
.unwrap_or(0);
1545+
let min_pool = market.min_pool_size.unwrap_or(global_min);
1546+
if min_pool > 0 && market.total_staked < min_pool {
1547+
return Err(Error::InvalidState);
15391548
}
15401549

15411550
Ok(())

0 commit comments

Comments
 (0)