Skip to content
Merged
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
Empty file removed .codex
Empty file.
5 changes: 5 additions & 0 deletions contract/contracts/event_registry/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,11 @@ impl EventRegistry {
storage::get_global_event_count(&env)
}

/// Returns the total number of events that are currently active.
pub fn get_active_events_count(env: Env) -> u32 {
storage::get_global_active_event_count(&env)
}

/// Returns the total number of tickets sold across all events on the platform.
pub fn get_global_tickets_sold(env: Env) -> i128 {
storage::get_global_tickets_sold(&env)
Expand Down
50 changes: 50 additions & 0 deletions contract/contracts/event_registry/src/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,21 @@ pub fn increment_series_pass_usage(env: &Env, pass_id: String) -> Option<SeriesP

const SHARD_SIZE: u32 = 50;

fn sync_active_event_count(env: &Env, existing: Option<&EventInfo>, updated: &EventInfo) {
match existing {
Some(previous) if previous.is_active && !updated.is_active => {
decrement_global_active_event_count(env);
}
Some(previous) if !previous.is_active && updated.is_active => {
increment_global_active_event_count(env);
}
None if updated.is_active => {
increment_global_active_event_count(env);
}
_ => {}
}
}

/// Sets the administrator address of the contract (legacy function).
pub fn set_admin(env: &Env, admin: &Address) {
env.storage().persistent().set(&DataKey::Admin, admin);
Expand Down Expand Up @@ -288,6 +303,9 @@ pub fn remove_from_active_proposals(env: &Env, proposal_id: u64) {
pub fn store_event(env: &Env, event_info: EventInfo) {
let event_id = event_info.event_id.clone();
let organizer = event_info.organizer_address.clone();
let existing = get_event(env, event_id.clone());

sync_active_event_count(env, existing.as_ref(), &event_info);

// Store the event info using persistent storage
env.storage()
Expand Down Expand Up @@ -329,6 +347,10 @@ pub fn store_event(env: &Env, event_info: EventInfo) {
/// Use this for mutations on already-registered events.
pub fn update_event(env: &Env, event_info: EventInfo) {
let event_id = event_info.event_id.clone();
let existing = get_event(env, event_id.clone());

sync_active_event_count(env, existing.as_ref(), &event_info);

env.storage()
.persistent()
.set(&DataKey::Event(event_id), &event_info);
Expand All @@ -344,6 +366,10 @@ pub fn remove_event(env: &Env, event_id: String) {
if let Some(event_info) = get_event(env, event_id.clone()) {
let organizer = event_info.organizer_address;

if event_info.is_active {
decrement_global_active_event_count(env);
}

// Remove from main mapping
env.storage()
.persistent()
Expand Down Expand Up @@ -815,6 +841,30 @@ pub fn increment_global_event_count(env: &Env) {
.set(&DataKey::GlobalEventCount, &(current + 1));
}

/// Returns the total number of currently active events on the platform.
pub fn get_global_active_event_count(env: &Env) -> u32 {
env.storage()
.persistent()
.get(&DataKey::GlobalActiveEventCount)
.unwrap_or(0)
}

/// Increments the global active event counter by one.
pub fn increment_global_active_event_count(env: &Env) {
let current = get_global_active_event_count(env);
env.storage()
.persistent()
.set(&DataKey::GlobalActiveEventCount, &(current + 1));
}

/// Decrements the global active event counter by one.
pub fn decrement_global_active_event_count(env: &Env) {
let current = get_global_active_event_count(env);
env.storage()
.persistent()
.set(&DataKey::GlobalActiveEventCount, &current.saturating_sub(1));
}

/// Returns the total number of tickets sold across all events.
pub fn get_global_tickets_sold(env: &Env) -> i128 {
env.storage()
Expand Down
60 changes: 60 additions & 0 deletions contract/contracts/event_registry/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,66 @@ fn test_get_total_tickets_sold_uses_event_current_supply() {
assert_eq!(client.get_total_tickets_sold(&event_id), 9);
}

#[test]
fn test_get_active_events_count_tracks_status_changes() {
let env = Env::default();
env.mock_all_auths();
let contract_id = env.register(EventRegistry, ());
let client = EventRegistryClient::new(&env, &contract_id);

let admin = Address::generate(&env);
let organizer = Address::generate(&env);
let platform_wallet = Address::generate(&env);
let usdc_token = Address::generate(&env);
client.initialize(&admin, &platform_wallet, &500, &usdc_token);

let metadata_cid = String::from_str(
&env,
"bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
);
let tiers = Map::new(&env);

let event_1 = String::from_str(&env, "active_count_1");
let event_2 = String::from_str(&env, "active_count_2");
let event_3 = String::from_str(&env, "active_count_3");

for event_id in [event_1.clone(), event_2.clone(), event_3.clone()] {
client.register_event(&EventRegistrationArgs {
event_id,
organizer_address: organizer.clone(),
payment_address: test_payment_address(&env),
metadata_cid: metadata_cid.clone(),
max_supply: 100,
milestone_plan: None,
tiers: tiers.clone(),
refund_deadline: 0,
restocking_fee: 0,
resale_cap_bps: None,
min_sales_target: None,
target_deadline: None,
banner_cid: None,
tags: None,
});
}

assert_eq!(client.get_active_events_count(), 3);

client.update_event_status(&event_1, &false);
assert_eq!(client.get_active_events_count(), 2);

client.cancel_event(&event_2);
assert_eq!(client.get_active_events_count(), 1);

client.update_event_status(&event_1, &true);
assert_eq!(client.get_active_events_count(), 2);

client.update_event_status(&event_3, &false);
assert_eq!(client.get_active_events_count(), 1);

client.archive_event(&event_3);
assert_eq!(client.get_active_events_count(), 1);
}

#[test]
fn test_organizer_events_list() {
let env = Env::default();
Expand Down
2 changes: 2 additions & 0 deletions contract/contracts/event_registry/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,8 @@ pub enum DataKey {
TokenWhitelist(Address),
/// Global counter of all events ever registered on the platform
GlobalEventCount,
/// Global counter of currently active events
GlobalActiveEventCount,
/// Global counter of all tickets sold across all events
GlobalTicketsSold,
}
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,45 @@
4095
]
],
[
{
"contract_data": {
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_data": {
"ext": "v0",
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent",
"val": {
"u32": 0
}
}
},
"ext": "v0"
},
4095
]
],
[
{
"contract_data": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,45 @@
4095
]
],
[
{
"contract_data": {
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_data": {
"ext": "v0",
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent",
"val": {
"u32": 0
}
}
},
"ext": "v0"
},
4095
]
],
[
{
"contract_data": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,45 @@
4095
]
],
[
{
"contract_data": {
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_data": {
"ext": "v0",
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent",
"val": {
"u32": 1
}
}
},
"ext": "v0"
},
4095
]
],
[
{
"contract_data": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,45 @@
4095
]
],
[
{
"contract_data": {
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent"
}
},
[
{
"last_modified_ledger_seq": 0,
"data": {
"contract_data": {
"ext": "v0",
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
"key": {
"vec": [
{
"symbol": "GlobalActiveEventCount"
}
]
},
"durability": "persistent",
"val": {
"u32": 0
}
}
},
"ext": "v0"
},
4095
]
],
[
{
"contract_data": {
Expand Down
Loading
Loading