// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; contract ClustoraRoster { uint256 public constant MAX_GROUPS = 32; uint256 public constant MAX_MEMBERS = 10000; mapping(uint256 => mapping(address => bool)) public isMember; mapping(uint256 => uint256) public memberCount; event MembershipChanged(uint256 indexed group, address indexed account, bool active); function join(uint256 group) external { require(group > 0 && group <= MAX_GROUPS, "Unknown group"); require(!isMember[group][msg.sender], "Already joined"); require(memberCount[group] < MAX_MEMBERS, "Group full"); isMember[group][msg.sender] = true; memberCount[group]++; emit MembershipChanged(group, msg.sender, true); } function leave(uint256 group) external { require(isMember[group][msg.sender], "Not a member"); isMember[group][msg.sender] = false; memberCount[group]--; emit MembershipChanged(group, msg.sender, false); } }