Untitled
unknown
plain_text
a year ago
2.5 kB
7
Indexable
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract TicketBooking { uint256 constant totalSeats = 20; uint256[20] public seats; mapping(address => uint256[]) private userTickets; //To book seats function bookSeats(uint[] memory seatNumbers) public { uint256 seatsLength = seatNumbers.length; require(userTickets[msg.sender].length < 4, "Can't book more than 4 tickets"); require(seatsLength > 0, "Lesser seat length"); require(seatsLength <= 4, "More seats selected"); require(seatsLength == _unique(seatNumbers), "Duplicate seats"); require(_areAllAvailable(seatNumbers), "Seats not available"); for (uint i = 0; i < seatsLength; i++) { seats[seatNumbers[i] - 1] = 1; userTickets[msg.sender].push(seatNumbers[i]); } } //To get available seats function showAvailableSeats() public view returns (uint[] memory) { uint[] memory availableSeats = new uint[](totalSeats); uint count = 0; for (uint i = 0; i < totalSeats; i++) { if (seats[i] == 0) { availableSeats[count] = i + 1; count++; } } uint[] memory slice = new uint[](count); for (uint i = 0; i < count; i++) { slice[i] = availableSeats[i]; } return slice; } function checkAvailability(uint seatNumber) public view returns (bool) { require(seatNumber >= 1 && seatNumber <= totalSeats, "Invalid seat number"); return seats[seatNumber - 1] == 0; } function myTickets() public view returns (uint[] memory) { return userTickets[msg.sender]; } function _areAllAvailable(uint[] memory seatNumbers) internal view returns (bool) { uint256 seatsLength = seatNumbers.length; for (uint i = 0; i < seatsLength; i++) { if (seats[seatNumbers[i] - 1] != 0) { return false; } } return true; } function _unique(uint[] memory seatNumbers) internal pure returns (uint) { uint[] memory seen = new uint[](totalSeats); uint j = 0; uint256 seatsLength = seatNumbers.length; for (uint i = 0; i < seatsLength; i++) { if (seen[seatNumbers[i] - 1] == 0) { seen[seatNumbers[i] - 1 ] = 1; j++; } } return j; } }
Editor is loading...