Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions contract/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ pub enum Error {
OnlyRoomCreatorCanUpdate = 14,
OnlyRoomCreatorCanDeactivate = 15,
StorageError = 16,
AdminNotAuthorized = 17,
InvalidClaimValidityLedgers = 18,
}

pub fn handle_error(env: &Env, error: Error) -> ! {
Expand Down
63 changes: 61 additions & 2 deletions contract/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,18 @@ pub mod users;
pub mod error;

use rooms::rooms::RoomManager;
use soroban_sdk::{contract, contractimpl, Address, Env, Map, String};
use types::{Room, RoomType, UserProfile};
use soroban_sdk::{contract, contractimpl, contractevent, Address, Env, Map, String, symbol_short};
use types::{Room, RoomType, UserProfile, ClaimWindowConfig, DataKey};
use users::users::UserManager;
use crate::error::{Error};

#[contractevent]
#[derive(Clone, Debug)]
pub struct ClaimConfigUpdated {
pub admin: Address,
pub old_config: ClaimWindowConfig,
pub new_config: ClaimWindowConfig,
}

#[contract]
pub struct WhsprContract;
Expand Down Expand Up @@ -73,6 +80,58 @@ impl WhsprContract {
pub fn deactivate_room(env: Env, creator: Address, room_id: u128) -> Result<bool, Error> {
RoomManager::deactivate_room(&env, creator, room_id)
}

// Claim Window Configuration Functions
pub fn set_claim_window_config(env: Env, admin: Address, config: ClaimWindowConfig) -> Result<(), Error> {
admin.require_auth();

// Validate that admin is authorized
let admin_key = DataKey::Admin;
let stored_admin: Option<Address> = env.storage().persistent().get(&admin_key);

// If admin is set, only the stored admin can update config
// If admin is not set yet, allow the first caller to set it and update config
if let Some(stored_admin_addr) = stored_admin {
if admin != stored_admin_addr {
return Err(Error::AdminNotAuthorized);
}
} else {
// First time setting up - store the admin
env.storage().persistent().set(&admin_key, &admin);
}

// Validate claim_validity_ledgers
if config.claim_validity_ledgers == 0 || config.claim_validity_ledgers >= 1_000_000 {
return Err(Error::InvalidClaimValidityLedgers);
}

// Get old config or create default
let config_key = DataKey::ClaimWindowConfig;
let old_config: ClaimWindowConfig = env.storage().persistent().get(&config_key).unwrap_or(ClaimWindowConfig {
is_enabled: false,
claim_validity_ledgers: 0,
});

// Store new config
env.storage().persistent().set(&config_key, &config);

// Emit event with old and new configs
env.events().publish(
(symbol_short!("claim_cfg_upd"),),
(admin.clone(), old_config, config.clone()),
);

Ok(())
}

pub fn get_claim_window_config(env: Env) -> Result<ClaimWindowConfig, Error> {
let config_key = DataKey::ClaimWindowConfig;
let config: ClaimWindowConfig = env.storage().persistent().get(&config_key).unwrap_or(ClaimWindowConfig {
is_enabled: false,
claim_validity_ledgers: 0,
});
Ok(config)
}
}

#[cfg(test)]
Expand Down
9 changes: 9 additions & 0 deletions contract/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,22 @@ pub struct Room {
pub created_at: u64,
}

#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ClaimWindowConfig {
pub is_enabled: bool,
pub claim_validity_ledgers: u32,
}

#[derive(Clone)]
#[contracttype]
pub enum DataKey {
UserProfile(Address),
Room(u128),
RoomNames, // Global set of taken room names
NextRoomId, // Counter for generating unique room IDs
Admin, // Admin address
ClaimWindowConfig, // Claim window configuration
}

#[cfg(test)]
Expand Down
Loading