// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; /// One bounded, public wallet roster; not a ticket, verified identity or admission guarantee. contract EventryxSession { uint16 public immutable capacity; uint16 public participants; mapping(address => bool) public joined; event Joined(address indexed participant, uint16 occupied); event Left(address indexed participant, uint16 occupied); error InvalidCapacity(); error AlreadyJoined(); error SessionFull(); error NotJoined(); constructor(uint16 capacity_) { if (capacity_ == 0 || capacity_ > 500) revert InvalidCapacity(); capacity = capacity_; } function join() external { if (joined[msg.sender]) revert AlreadyJoined(); if (participants >= capacity) revert SessionFull(); joined[msg.sender] = true; ++participants; emit Joined(msg.sender, participants); } function leave() external { if (!joined[msg.sender]) revert NotJoined(); joined[msg.sender] = false; --participants; emit Left(msg.sender, participants); } }