diff --git a/src/lib.rs b/src/lib.rs index 1458b752..123dd88e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,6 +62,7 @@ impl WorkloadGovernor { } admin.require_auth(); storage::set_admin(&env, &admin); + storage::set_global_cap(&env, storage::GLOBAL_APP_LIMIT); storage::bump_instance(&env); events::emit_initialized(&env, &admin); } diff --git a/src/storage.rs b/src/storage.rs index c9b91a74..283ffc9b 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -233,6 +233,27 @@ pub(crate) fn extend_app_entry_ttl( .extend_ttl(&key, APP_TTL_LEDGERS, APP_TTL_LEDGERS); } +// --------------------------------------------------------------------------- +// Persistent storage — Global application cap +// --------------------------------------------------------------------------- +// +// Key: `symbol_short!("g_cap")` +// Value: `u32` + +fn global_cap_key() -> Symbol { + symbol_short!("g_cap") +} + +/// Returns the configured global application cap, defaulting to `GLOBAL_APP_LIMIT`. +pub(crate) fn get_global_cap(env: &Env) -> u32 { + env.storage().persistent().get(&global_cap_key()).unwrap_or(GLOBAL_APP_LIMIT) +} + +/// Stores a new global application cap. +pub(crate) fn set_global_cap(env: &Env, cap: u32) { + env.storage().persistent().set(&global_cap_key(), &cap); +} + // --------------------------------------------------------------------------- // Persistent storage — Admin // --------------------------------------------------------------------------- diff --git a/src/test.rs b/src/test.rs index f7d48914..2094774f 100644 --- a/src/test.rs +++ b/src/test.rs @@ -528,9 +528,11 @@ fn unit_event_initialized_has_two_topics() { t.client.initialize(&admin); let events = t.env.events().all(); - let (_, topics, _): (_, soroban_sdk::Vec, soroban_sdk::Val) = + let (_, topics, data): (_, soroban_sdk::Vec, soroban_sdk::Val) = events.last().unwrap(); assert_eq!(topics.len(), 2, "Expected 2-element topics tuple"); + let payload = soroban_sdk::vec![&t.env, 1u32, admin.clone()]; + assert_eq!(data, payload.into_val(&t.env)); } #[test] @@ -547,9 +549,11 @@ fn unit_event_application_submitted_has_two_topics() { let events = t.env.events().all(); assert!(!events.is_empty()); - let (_, topics, _): (_, soroban_sdk::Vec, soroban_sdk::Val) = + let (_, topics, data): (_, soroban_sdk::Vec, soroban_sdk::Val) = events.last().unwrap(); assert_eq!(topics.len(), 2, "Expected 2-element topics tuple"); + let payload = soroban_sdk::vec![&t.env, 1u32, contributor.clone(), org.clone(), 5u32]; + assert_eq!(data, payload.into_val(&t.env)); } // ---------------------------------------------------------------------------