{
  "address": "0xF9b81386b6B5ba17aE521024Ef30EfD38eCbA2f6",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_eventManagerDeployed",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_userRegistryDeployed",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        }
      ],
      "name": "CheckInConfirmed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        }
      ],
      "name": "CheckInRejected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "eventId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint8",
          "name": "checkInId",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "knownFaceHash",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "unknownFaceHash",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "userLocation",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "eventLocation",
          "type": "string"
        }
      ],
      "name": "CheckInRequested",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        }
      ],
      "name": "getMyCheckIns",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "id",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "user",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "faceHash",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "location",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256"
            },
            {
              "internalType": "enum CheckInManager.CheckInStatus",
              "name": "status",
              "type": "uint8"
            }
          ],
          "internalType": "struct CheckInManager.CheckIn[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        }
      ],
      "name": "getUserCheckIns",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint8",
              "name": "id",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "user",
              "type": "address"
            },
            {
              "internalType": "string",
              "name": "faceHash",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "location",
              "type": "string"
            },
            {
              "internalType": "uint256",
              "name": "timestamp",
              "type": "uint256"
            },
            {
              "internalType": "enum CheckInManager.CheckInStatus",
              "name": "status",
              "type": "uint8"
            }
          ],
          "internalType": "struct CheckInManager.CheckIn[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        }
      ],
      "name": "getUsersCheckInsFromEvent",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "offchainValidator",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "_checkInId",
          "type": "uint8"
        },
        {
          "internalType": "bool",
          "name": "_approved",
          "type": "bool"
        }
      ],
      "name": "replyCheckIn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eventId",
          "type": "uint256"
        },
        {
          "internalType": "string",
          "name": "unknownFaceHash",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "userLocation",
          "type": "string"
        }
      ],
      "name": "requestCheckIn",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_offchainValidator",
          "type": "address"
        }
      ],
      "name": "setOffchainValidator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x0efdb24ec2dbd75134a641bc25905cdaf5d80884790fc241a78ea16491987c4d",
  "receipt": {
    "to": null,
    "from": "0x72ac37F2B8685300a6B3781669a487eBb94a5CCd",
    "contractAddress": "0xF9b81386b6B5ba17aE521024Ef30EfD38eCbA2f6",
    "transactionIndex": 1,
    "gasUsed": "1121740",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x81caa98e6723865115163062df733cac6e43742beb685565d9afc75a1d1a7676",
    "transactionHash": "0x0efdb24ec2dbd75134a641bc25905cdaf5d80884790fc241a78ea16491987c4d",
    "logs": [],
    "blockNumber": 9634134,
    "cumulativeGasUsed": "1165579",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xfb7244dD69F46A91DD2F73dC3Da5B99eD0d5336f",
    "0xE69479674F2d511cF304B9D4a063467339E67A15"
  ],
  "numDeployments": 1,
  "solcInputHash": "d6290a8f26e93ae8f0b791c89cf10356",
  "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_eventManagerDeployed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_userRegistryDeployed\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"}],\"name\":\"CheckInConfirmed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"}],\"name\":\"CheckInRejected\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"eventId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"checkInId\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"knownFaceHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"unknownFaceHash\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"userLocation\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"eventLocation\",\"type\":\"string\"}],\"name\":\"CheckInRequested\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"}],\"name\":\"getMyCheckIns\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"id\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"faceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"enum CheckInManager.CheckInStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct CheckInManager.CheckIn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserCheckIns\",\"outputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"id\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"faceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"location\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"enum CheckInManager.CheckInStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct CheckInManager.CheckIn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"}],\"name\":\"getUsersCheckInsFromEvent\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"offchainValidator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"_checkInId\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"_approved\",\"type\":\"bool\"}],\"name\":\"replyCheckIn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eventId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"unknownFaceHash\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"userLocation\",\"type\":\"string\"}],\"name\":\"requestCheckIn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_offchainValidator\",\"type\":\"address\"}],\"name\":\"setOffchainValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/CheckInManager.sol\":\"CheckInManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"contracts/CheckInManager.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport \\\"./EventManager.sol\\\";\\nimport \\\"./UserRegistry.sol\\\";\\n\\n/*\\n * @title CheckInManager\\n * @dev Manages check-in requests and validations.\\n */\\ncontract CheckInManager {\\n\\tenum CheckInStatus {\\n\\t\\tPending,\\n\\t\\tConfirmed,\\n\\t\\tRejected\\n\\t}\\n\\n\\tstruct CheckIn {\\n\\t\\tuint8 id;\\n\\t\\taddress user;\\n\\t\\tstring faceHash; // IPFS hash of the user's face image\\n\\t\\tstring location; // Latitude and longitude: \\\"lat, long\\\"\\n\\t\\tuint256 timestamp; // Timestamp of the check-in request\\n\\t\\tCheckInStatus status;\\n\\t}\\n\\n\\tmapping(uint256 => mapping(address => CheckIn[])) private checkIns; // Check-ins for each event\\n\\tmapping(uint256 => address[]) private checkInEventUser; // Users who have checked in for an event\\n\\n\\tEventManager private eventManager; // EventManager contract reference\\n\\tUserRegistry private userRegistry; // UserRegistry contract reference\\n\\n\\taddress public offchainValidator; // Address of the off-chain validator\\n\\n\\tevent CheckInRequested(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId,\\n\\t\\tstring knownFaceHash,\\n\\t\\tstring unknownFaceHash,\\n\\t\\tstring userLocation,\\n\\t\\tstring eventLocation\\n\\t); // Event for check-in requests\\n\\tevent CheckInConfirmed(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId\\n\\t); // Event for confirmed check-ins\\n\\tevent CheckInRejected(\\n\\t\\tuint256 indexed eventId,\\n\\t\\taddress indexed user,\\n\\t\\tuint8 indexed checkInId\\n\\t); // Event for rejected check-ins\\n\\n\\t// Check if the event exists\\n\\tmodifier eventExists(uint256 _eventId) {\\n\\t\\trequire(eventManager.getEvent(_eventId).active, \\\"Event does not exist\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if the event is ongoing\\n\\tmodifier eventIsOngoing(uint256 _eventId) {\\n\\t\\trequire(\\n\\t\\t\\tblock.timestamp > eventManager.getEvent(_eventId).startTime,\\n\\t\\t\\t\\\"Event has not started\\\"\\n\\t\\t);\\n\\t\\trequire(\\n\\t\\t\\tblock.timestamp < eventManager.getEvent(_eventId).endTime,\\n\\t\\t\\t\\\"Event has ended\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if the user has not reached the maximum check-ins\\n\\tmodifier checkMaxCheckIns(uint256 _eventId, address _user) {\\n\\t\\trequire(\\n\\t\\t\\tcheckIns[_eventId][_user].length < 3,\\n\\t\\t\\t\\\"Maximum check-ins tries reached\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Only the off-chain validator can perform this action\\n\\tmodifier onlyOffchainValidator() {\\n\\t\\trequire(\\n\\t\\t\\tmsg.sender == offchainValidator,\\n\\t\\t\\t\\\"Only the off-chain validator can perform this action\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Check if already has checkin approved in the event\\n\\tmodifier checkAlreadyCheckInApproved(uint256 _eventId, address _user) {\\n\\t\\tbool alreadyCheckIn = false;\\n\\n\\t\\tfor (uint256 i = 0; i < checkInEventUser[_eventId].length; i++) {\\n\\t\\t\\tif (checkInEventUser[_eventId][i] == _user) {\\n\\t\\t\\t\\talreadyCheckIn = true;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\trequire(alreadyCheckIn, \\\"User already checked in\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Constructor to set the EventManager contract address and the off-chain validator address.\\n\\t * @param _eventManagerDeployed Address of the deployed EventManager contract.\\n\\t * @param _offchainValidator Address of the off-chain validator.\\n\\t */\\n\\tconstructor(address _eventManagerDeployed, address _userRegistryDeployed) {\\n\\t\\trequire(\\n\\t\\t\\t_eventManagerDeployed != address(0),\\n\\t\\t\\t\\\"Invalid EventManager address\\\"\\n\\t\\t);\\n\\n\\t\\teventManager = EventManager(_eventManagerDeployed);\\n\\t\\tuserRegistry = UserRegistry(_userRegistryDeployed);\\n\\n\\t\\toffchainValidator = msg.sender;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Set the off-chain validator address.\\n\\t * @param _offchainValidator Address of the off-chain validator.\\n\\t */\\n\\tfunction setOffchainValidator(\\n\\t\\taddress _offchainValidator\\n\\t) external onlyOffchainValidator {\\n\\t\\toffchainValidator = _offchainValidator;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Request check-in for an event.\\n\\t * @param _eventId ID of the event to check into.\\n\\t * @param faceHash IPFS hash of the user's face image.\\n\\t * @param location Location of the user at the time of check-in.\\n\\t */\\n\\tfunction requestCheckIn(\\n\\t\\tuint256 _eventId,\\n\\t\\tstring calldata unknownFaceHash,\\n\\t\\tstring calldata userLocation\\n\\t)\\n\\t\\texternal\\n\\t\\teventExists(_eventId)\\n\\t\\teventIsOngoing(_eventId)\\n\\t\\tcheckMaxCheckIns(_eventId, msg.sender)\\n\\t{\\n\\t\\tuint8 checkInId = uint8(checkIns[_eventId][msg.sender].length);\\n\\t\\tcheckIns[_eventId][msg.sender].push(\\n\\t\\t\\tCheckIn({\\n\\t\\t\\t\\tid: checkInId,\\n\\t\\t\\t\\tuser: msg.sender,\\n\\t\\t\\t\\tfaceHash: unknownFaceHash,\\n\\t\\t\\t\\tlocation: userLocation,\\n\\t\\t\\t\\ttimestamp: block.timestamp,\\n\\t\\t\\t\\tstatus: CheckInStatus.Pending\\n\\t\\t\\t})\\n\\t\\t);\\n\\n\\t\\tstring memory knownFaceHash = userRegistry\\n\\t\\t\\t.getUserInfo(msg.sender)\\n\\t\\t\\t.faceHash;\\n\\n\\t\\tstring memory eventLocation = eventManager.getEvent(_eventId).location;\\n\\n\\t\\temit CheckInRequested(\\n\\t\\t\\t_eventId,\\n\\t\\t\\tmsg.sender,\\n\\t\\t\\tcheckInId,\\n\\t\\t\\tunknownFaceHash,\\n\\t\\t\\tknownFaceHash,\\n\\t\\t\\tuserLocation,\\n\\t\\t\\teventLocation\\n\\t\\t);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Confirm check-in after off-chain validation.\\n\\t * This would be called by the backend after successful validation.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _user Address of the user.\\n\\t * @param _checkInId ID of the check-in request.\\n\\t * @param _status Status of the check-in request.\\n\\t */\\n\\tfunction replyCheckIn(\\n\\t\\tuint256 _eventId,\\n\\t\\taddress _user,\\n\\t\\tuint8 _checkInId,\\n\\t\\tbool _approved\\n\\t) external eventExists(_eventId) onlyOffchainValidator {\\n\\t\\tcheckIns[_eventId][_user][_checkInId].status = _approved\\n\\t\\t\\t? CheckInStatus.Confirmed\\n\\t\\t\\t: CheckInStatus.Rejected;\\n\\n\\t\\tif (_approved) {\\n\\t\\t\\tcheckInEventUser[_eventId].push(_user);\\n\\t\\t}\\n\\n\\t\\tif (_approved) {\\n\\t\\t\\temit CheckInConfirmed(_eventId, _user, _checkInId);\\n\\t\\t} else {\\n\\t\\t\\temit CheckInRejected(_eventId, _user, _checkInId);\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves check-in requests for an event by the caller.\\n\\t * @param _eventId ID of the event.\\n\\t * @return Check-in requests.\\n\\t */\\n\\tfunction getMyCheckIns(\\n\\t\\tuint256 _eventId\\n\\t) external view returns (CheckIn[] memory) {\\n\\t\\treturn checkIns[_eventId][msg.sender];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves check-in requests for an event by the user.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _user Address of the user.\\n\\t * @return Check-in requests.\\n\\t */\\n\\tfunction getUserCheckIns(\\n\\t\\tuint256 _eventId,\\n\\t\\taddress _user\\n\\t) external view returns (CheckIn[] memory) {\\n\\t\\treturn checkIns[_eventId][_user];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves users checkins for an event.\\n\\t * @param _eventId ID of the event.\\n\\t * @return Users who have checked in.\\n\\t */\\n\\tfunction getUsersCheckInsFromEvent(\\n\\t\\tuint256 _eventId\\n\\t) external view returns (address[] memory) {\\n\\t\\treturn checkInEventUser[_eventId];\\n\\t}\\n}\\n\",\"keccak256\":\"0xdc10e7873377bddb823117926d4d778ff9a6d3e7d6c510f3473550b019b85167\",\"license\":\"MIT\"},\"contracts/EventManager.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/*\\n * @title EventManager\\n * @dev Manages event creation and details.\\n */\\ncontract EventManager {\\n\\tstruct Event {\\n\\t\\tstring name;\\n\\t\\tstring description;\\n\\t\\tstring imageHash; // IPFS hash of the event's image\\n\\t\\tstring location; // Latitude and longitude: \\\"lat, long\\\"\\n\\t\\taddress owner;\\n\\t\\tuint256 startTime; // Unix timestamp\\n\\t\\tuint256 endTime; // Unix timestamp\\n\\t\\tbool active;\\n\\t}\\n\\n\\tEvent[] public events;\\n\\n\\tevent EventCreated(uint256 indexed eventId, string name, address owner); // Event created\\n\\n\\t// Modifier to ensure only the owner can perform an action\\n\\tmodifier onlyOwner(uint256 _eventId) {\\n\\t\\trequire(\\n\\t\\t\\tmsg.sender == events[_eventId].owner,\\n\\t\\t\\t\\\"Only the owner can perform this action\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier to ensure event exists\\n\\tmodifier eventExists(uint256 _eventId) {\\n\\t\\trequire(_eventId < events.length, \\\"Event does not exist\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating time range\\n\\tmodifier validTime(uint256 _startTime, uint256 _endTime) {\\n\\t\\trequire(_startTime < _endTime, \\\"Invalid time range\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating location\\n\\tmodifier validLocation(string memory _location) {\\n\\t\\trequire(bytes(_location).length > 0, \\\"Invalid location\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating event name\\n\\tmodifier validName(string memory _name) {\\n\\t\\trequire(bytes(_name).length > 0, \\\"Invalid name\\\");\\n\\t\\trequire(bytes(_name).length <= 128, \\\"Name too long\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating event description\\n\\tmodifier validDescription(string memory _description) {\\n\\t\\trequire(bytes(_description).length > 0, \\\"Invalid description\\\");\\n\\t\\trequire(bytes(_description).length <= 1024, \\\"Description too long\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating IPFS hashes\\n\\tmodifier validImageHash(string memory _imageHash) {\\n\\t\\trequire(bytes(_imageHash).length == 46, \\\"Invalid IPFS hash\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Sets event details.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _name Name of the event.\\n\\t * @param _description Description of the event.\\n\\t * @param _imageHash IPFS hash of the event's image.\\n\\t * @param _location Location of the event (description or coordinates).\\n\\t * @param _startTime Start time of the event.\\n\\t * @param _endTime End time of the event.\\n\\t * @param _active Whether the event is active.\\n\\t * @param _isNewEvent Whether the event is new.\\n\\t */\\n\\tfunction _setEvent(\\n\\t\\tuint256 _eventId,\\n\\t\\tstring memory _name,\\n\\t\\tstring memory _description,\\n\\t\\tstring memory _imageHash,\\n\\t\\tstring memory _location,\\n\\t\\tuint256 _startTime,\\n\\t\\tuint256 _endTime,\\n\\t\\tbool _active,\\n\\t\\tbool _isNewEvent\\n\\t) private {\\n\\t\\tEvent memory newEvent = Event({\\n\\t\\t\\tname: _name,\\n\\t\\t\\tdescription: _description,\\n\\t\\t\\timageHash: _imageHash,\\n\\t\\t\\tlocation: _location,\\n\\t\\t\\towner: msg.sender,\\n\\t\\t\\tstartTime: _startTime,\\n\\t\\t\\tendTime: _endTime,\\n\\t\\t\\tactive: _active\\n\\t\\t});\\n\\n\\t\\tif (_isNewEvent) {\\n\\t\\t\\tevents.push(newEvent);\\n\\t\\t\\temit EventCreated(events.length - 1, _name, msg.sender);\\n\\t\\t} else {\\n\\t\\t\\tevents[_eventId] = newEvent;\\n\\t\\t}\\n\\t}\\n\\n\\t/*\\n\\t * @dev Creates a new event.\\n\\t * @param _name Name of the event.\\n\\t * @param _description Description of the event.\\n\\t * @param _imageHash IPFS hash of the event's image.\\n\\t * @param _location Location of the event (description or coordinates).\\n\\t * @param _startTime Start time of the event.\\n\\t * @param _endTime End time of the event.\\n\\t */\\n\\tfunction createEvent(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _description,\\n\\t\\tstring calldata _imageHash,\\n\\t\\tstring calldata _location,\\n\\t\\tuint256 _startTime,\\n\\t\\tuint256 _endTime\\n\\t)\\n\\t\\texternal\\n\\t\\tvalidName(_name)\\n\\t\\tvalidDescription(_description)\\n\\t\\tvalidImageHash(_imageHash)\\n\\t\\tvalidLocation(_location)\\n\\t\\tvalidTime(_startTime, _endTime)\\n\\t{\\n\\t\\t_setEvent(\\n\\t\\t\\t0,\\n\\t\\t\\t_name,\\n\\t\\t\\t_description,\\n\\t\\t\\t_imageHash,\\n\\t\\t\\t_location,\\n\\t\\t\\t_startTime,\\n\\t\\t\\t_endTime,\\n\\t\\t\\ttrue,\\n\\t\\t\\ttrue\\n\\t\\t);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Updates event information.\\n\\t * @param _eventId ID of the event.\\n\\t * @param _name Name of the event.\\n\\t * @param _location Location of the event (description or coordinates).\\n\\t * @param _startTime Start time of the event.\\n\\t * @param _endTime End time of the event.\\n\\t */\\n\\tfunction updateEvent(\\n\\t\\tuint256 _eventId,\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _description,\\n\\t\\tstring calldata _imageHash,\\n\\t\\tstring calldata _location,\\n\\t\\tuint256 _startTime,\\n\\t\\tuint256 _endTime,\\n\\t\\tbool _active\\n\\t)\\n\\t\\texternal\\n\\t\\teventExists(_eventId)\\n\\t\\tonlyOwner(_eventId)\\n\\t\\tvalidName(_name)\\n\\t\\tvalidDescription(_description)\\n\\t\\tvalidImageHash(_imageHash)\\n\\t\\tvalidLocation(_location)\\n\\t\\tvalidTime(_startTime, _endTime)\\n\\t{\\n\\t\\t_setEvent(\\n\\t\\t\\t_eventId,\\n\\t\\t\\t_name,\\n\\t\\t\\t_description,\\n\\t\\t\\t_imageHash,\\n\\t\\t\\t_location,\\n\\t\\t\\t_startTime,\\n\\t\\t\\t_endTime,\\n\\t\\t\\t_active,\\n\\t\\t\\tfalse\\n\\t\\t);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves event information.\\n\\t * @param _eventId ID of the event.\\n\\t * @return Event information.\\n\\t */\\n\\tfunction getEvent(uint256 _eventId) external view returns (Event memory) {\\n\\t\\treturn events[_eventId];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves all events.\\n\\t * @return All events.\\n\\t */\\n\\tfunction getAllEvents() external view returns (Event[] memory) {\\n\\t\\treturn events;\\n\\t}\\n}\\n\",\"keccak256\":\"0xe8ed9cdddccd8e1e5d84f2301679240c7a1c2ef6d67aae0ca59ab5c0e07251dd\",\"license\":\"MIT\"},\"contracts/UserRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/*\\n * @title UserRegistry\\n * @dev Manages user registrations and facial identifiers, with added security features.\\n */\\ncontract UserRegistry {\\n\\tstruct User {\\n\\t\\tstring name;\\n\\t\\tstring faceHash; // IPFS hash of the user's face image\\n\\t}\\n\\n\\tmapping(address => User) private users; // Private for better encapsulation\\n\\n\\tevent UserRegistered(\\n\\t\\taddress indexed userAddress,\\n\\t\\tstring name,\\n\\t\\tstring faceHash\\n\\t); // Event for new user registrations\\n\\tevent UserUpdated(\\n\\t\\taddress indexed userAddress,\\n\\t\\tstring name,\\n\\t\\tstring faceHash\\n\\t); // Event for user information updates\\n\\n\\t// Modifier to ensure user exists\\n\\tmodifier userExists(address userAddress) {\\n\\t\\trequire(\\n\\t\\t\\tbytes(users[userAddress].name).length != 0,\\n\\t\\t\\t\\\"User does not exist\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier to ensure user does not exist\\n\\tmodifier userDoesNotExist(address userAddress) {\\n\\t\\trequire(\\n\\t\\t\\tbytes(users[userAddress].name).length == 0,\\n\\t\\t\\t\\\"User already exists\\\"\\n\\t\\t);\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating IPFS hashes\\n\\tmodifier validIPFSHash(string memory _faceHash) {\\n\\t\\trequire(bytes(_faceHash).length == 46, \\\"Invalid IPFS hash\\\"); // Basic check for IPFS hash length\\n\\t\\t_;\\n\\t}\\n\\n\\t// Modifier for validating user's name\\n\\tmodifier validName(string memory _name) {\\n\\t\\trequire(bytes(_name).length > 0, \\\"Invalid name\\\");\\n\\t\\trequire(bytes(_name).length <= 64, \\\"Name too long\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\t/*\\n\\t * @dev Registers a new user or updates an existing user's information.\\n\\t * @param _name User's name.\\n\\t * @param _faceHash IPFS hash of the user's face image.\\n\\t */\\n\\tfunction registerUser(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _faceHash\\n\\t)\\n\\t\\tpublic\\n\\t\\tuserDoesNotExist(msg.sender)\\n\\t\\tvalidIPFSHash(_faceHash)\\n\\t\\tvalidName(_name)\\n\\t{\\n\\t\\tusers[msg.sender] = User(_name, _faceHash);\\n\\n\\t\\temit UserRegistered(msg.sender, _name, _faceHash);\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves user information.\\n\\t * @param _userAddress Address of the user.\\n\\t * @return User information.\\n\\t */\\n\\tfunction getUserInfo(\\n\\t\\taddress _userAddress\\n\\t) external view userExists(_userAddress) returns (User memory) {\\n\\t\\treturn users[_userAddress];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Retrieves user information for the caller.\\n\\t * @return User information.\\n\\t */\\n\\tfunction getMyInfo()\\n\\t\\texternal\\n\\t\\tview\\n\\t\\tuserExists(msg.sender)\\n\\t\\treturns (User memory)\\n\\t{\\n\\t\\treturn users[msg.sender];\\n\\t}\\n\\n\\t/*\\n\\t * @dev Updates the user's information.\\n\\t * @param _name User's name.\\n\\t * @param _faceHash IPFS hash of the user's face image.\\n\\t */\\n\\tfunction updateUserInfo(\\n\\t\\tstring calldata _name,\\n\\t\\tstring calldata _faceHash\\n\\t)\\n\\t\\texternal\\n\\t\\tuserExists(msg.sender)\\n\\t\\tvalidIPFSHash(_faceHash)\\n\\t\\tvalidName(_name)\\n\\t{\\n\\t\\tusers[msg.sender] = User(_name, _faceHash);\\n\\n\\t\\temit UserUpdated(msg.sender, _name, _faceHash);\\n\\t}\\n}\\n\",\"keccak256\":\"0x0c4e896876a4259bf99b32c8629815e5398413c5c1c4f15419837acb74948418\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6080346100df57601f61131a38819003918201601f19168301916001600160401b038311848410176100e45780849260409485528339810103126100df57610052602061004b836100fa565b92016100fa565b6001600160a01b039182169190821561009a5760018060a01b031992836002541617600255168160035416176003553390600454161760045560405161120b908161010f8239f35b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964204576656e744d616e616765722061646472657373000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100df5756fe608080604052600436101561001357600080fd5b60003560e01c90816310c96f4714610c14575080635835162f14610bcd5780638396e56b14610ad1578063b2d1cb7414610368578063b9029e1a14610278578063d6c3ee961461009a5763f7975e2d1461006c57600080fd5b34610095576000366003190112610095576004546040516001600160a01b039091168152602090f35b600080fd5b34610095576080366003190112610095576004356100b6610cc1565b6044359160ff8316928381036100955760643590811515820361009557600254604051630368c42760e51b81526004810185905291906001600160a01b03906000908490602490829085165afa801561026c5761016661016d9361012c60e06004948998600091610249575b5001511515611106565b61013a848454163314610e61565b8515610241576001935b8860005260006020526040600020991698896000526020526040600020611180565b500161119c565b6101c5575b1561019e577f466f70c15b5e417087a194a9084f1420ada8048da7218be6492e2a59680db9a4600080a4005b7f4297803d3d82640da42c2ec7f6fa2446d410512943c482eb96f84b211948a5ad600080a4005b8160005260016020526040600020805490600160401b82101561022b576001820180825582101561021557600052602060002001836bffffffffffffffffffffffff60a01b825416179055610172565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600293610144565b61026691503d806000833e61025e8183610e40565b810190611015565b8d610122565b6040513d6000823e3d90fd5b34610095576020806003193601126100955760043560005260008152604060002033600052815260406000208054906001600160401b03821161022b57600590604051936102cb818560051b0186610e40565b83855260009182528082208186015b8584106102f357604051806102ef8982610d1f565b0390f35b848360019260405161030481610e25565b61035a865460ff908181168452878060a01b039060081c168584015261032b878901610f04565b604084015261033c60028901610f04565b60608401526003880154608084015260048801541660a08301610fa9565b8152019201930192906102da565b34610095576060366003190112610095576024356001600160401b03811161009557610398903690600401610df8565b6044356001600160401b038111610095576103b7903690600401610df8565b600254604051630368c42760e51b815260048035908201529294926001600160a01b0390911690600081602481855afa90811561026c576104069160e091600091610ab6575001511515611106565b604051630368c42760e51b81526004803590820152600081602481855afa801561026c5760a091600091610a9b575b500151421115610a5e57600060249160405192838092630368c42760e51b825260043560048301525afa801561026c5760c091600091610a43575b500151421015610a0c576004356000526000602052604060002033600052602052600360406000205410156109c757600435600090815260208181526040808320338452909152908190208054915160ff9092169590916104d081610e25565b86815260208101923384526104e6368888611149565b90604083019182526104f9368786611149565b6060840152426080840152600060a08401528054600160401b81101561022b5761052891600182018155611180565b9490946109b1578251855491516001600160a81b031990921660ff919091161760089190911b610100600160a81b0316178455518051906001600160401b03821161022b57819061057c6001870154610eca565b601f811161095e575b50602090601f83116001146108ec576000926108e1575b50508160011b916000199060031b1c19161760018401555b60608101518051906001600160401b03821161022b576105d76002860154610eca565b601f811161089a575b50602090601f83116001146108275760a09392916000918361081c575b50508160011b916000199060031b1c19161760028501555b60808101516003850155015191600383101561080657602492600461063a920161119c565b600354604051636386c1c760e01b81523360048201529260009184919082906001600160a01b03165afa91821561026c5760009261074c575b506020602492015192600060018060a01b036002541660405194858092630368c42760e51b825260043560048301525afa92831561026c577fee432e7e3bf6c8b451619602bd793b7da6aeb929c939116da1c309bbcf68c36c946106f860606107149661070694600091610731575b500151976040519960808b5260808b01916111b4565b9088820360208a0152610cfa565b9186830360408801526111b4565b9280840360608201528061072c339560043595610cfa565b0390a4005b61074691503d806000833e61025e8183610e40565b8c6106e2565b91503d806000843e61075e8184610e40565b6020838281010312610095578251906001600160401b038211610095576040828501828601031261009557604051908160408101106001600160401b0360408401111761022b5760408201604052828501516001600160401b038111610095576107cf908287019085880101610fd0565b825260208386010151946001600160401b038611610095576024956020946107fb938301920101610fd0565b828201529250610673565b634e487b7160e01b600052602160045260246000fd5b015190508a806105fd565b906002860160005260206000209160005b601f1985168110610882575091839160019360a09695601f19811610610869575b505050811b016002850155610615565b015160001960f88460031b161c191690558a8080610859565b91926020600181928685015181550194019201610838565b600286016000526020600020601f840160051c8101602085106108da575b601f830160051c820181106108ce5750506105e0565b600081556001016108b8565b50806108b8565b01519050898061059c565b9250600186016000526020600020906000935b601f1984168510610943576001945083601f1981161061092a575b505050811b0160018401556105b4565b015160001960f88460031b161c1916905589808061091a565b818101518355602094850194600190930192909101906108ff565b909150600186016000526020600020601f840160051c8101602085106109aa575b90849392915b601f830160051c8201811061099b575050610585565b60008155859450600101610985565b508061097f565b634e487b7160e01b600052600060045260246000fd5b60405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20636865636b2d696e732074726965732072656163686564006044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e115d995b9d081a185cc8195b991959608a1b6044820152606490fd5b610a5891503d806000833e61025e8183610e40565b86610470565b60405162461bcd60e51b8152602060048201526015602482015274115d995b9d081a185cc81b9bdd081cdd185c9d1959605a1b6044820152606490fd5b610ab091503d806000833e61025e8183610e40565b87610435565b610acb91503d806000833e61025e8183610e40565b88610122565b3461009557604036600319011261009557610aea610cc1565b60043560005260209060008252604060002060018060a01b0380921660005282526040600020918254916001600160401b03831161022b579260059160405194610b39828660051b0187610e40565b8486526000928352818320908287015b868510610b5e57604051806102ef8a82610d1f565b8584600192604051610b6f81610e25565b610bbf87548760ff91828116855260081c1685840152610b90878a01610f04565b6040840152610ba160028a01610f04565b60608401526003890154608084015260048901541660a08301610fa9565b815201930194019391610b49565b34610095576020366003190112610095576004356001600160a01b038181169182900361009557610c046004549182163314610e61565b6001600160a01b03191617600455005b3461009557602080600319360112610095579060043560005260018083526040600020928354808452818401908195600052826000209060005b818110610ca55750505083610c64910384610e40565b60405192818401908285525180915260408401949160005b828110610c895785870386f35b83516001600160a01b0316875295810195928101928401610c7c565b82546001600160a01b0316845292840192918501918501610c4e565b602435906001600160a01b038216820361009557565b60005b838110610cea5750506000910152565b8181015183820152602001610cda565b90602091610d1381518092818552858086019101610cd7565b601f01601f1916010190565b602090818101828252835180915260409260408301928160408460051b8301019601946000906000925b858410610d5b57505050505050505090565b9091929394959697603f19828203018852885190610db3610da060c060ff855116845260018060a01b038a860151168a85015286850151908088860152840190610cfa565b6060808501519084830390850152610cfa565b916080808201519083015260a080910151916003831015610de4570152978501968501959493600101929190610d49565b634e487b7160e01b87526021600452602487fd5b9181601f84011215610095578235916001600160401b038311610095576020838186019501011161009557565b60c081019081106001600160401b0382111761022b57604052565b90601f801991011681019081106001600160401b0382111761022b57604052565b15610e6857565b60405162461bcd60e51b815260206004820152603460248201527f4f6e6c7920746865206f66662d636861696e2076616c696461746f722063616e604482015273103832b93337b936903a3434b99030b1ba34b7b760611b6064820152608490fd5b90600182811c92168015610efa575b6020831014610ee457565b634e487b7160e01b600052602260045260246000fd5b91607f1691610ed9565b90604051918260008254610f1781610eca565b90818452602094600191600181169081600014610f875750600114610f48575b505050610f4692500383610e40565b565b600090815285812095935091905b818310610f6f575050610f469350820101388080610f37565b85548884018501529485019487945091830191610f56565b92505050610f4694925060ff191682840152151560051b820101388080610f37565b60038210156108065752565b6001600160401b03811161022b57601f01601f191660200190565b81601f82011215610095578051610fe681610fb5565b92610ff46040519485610e40565b81845260208284010111610095576110129160208085019101610cd7565b90565b6020818303126100955780516001600160401b0391828211610095570190610100928383820312610095576040519384018481108382111761022b5760405282518281116100955781611069918501610fd0565b845260208301518281116100955781611083918501610fd0565b6020850152604083015182811161009557816110a0918501610fd0565b60408501526060830151918211610095576110bc918301610fd0565b60608301526080810151906001600160a01b03821682036100955760e091608084015260a081015160a084015260c081015160c0840152015180151581036100955760e082015290565b1561110d57565b60405162461bcd60e51b8152602060048201526014602482015273115d995b9d08191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b92919261115582610fb5565b916111636040519384610e40565b829481845281830111610095578281602093846000960137010152565b8054821015610215576000526005602060002091020190600090565b9060038110156108065760ff80198354169116179055565b908060209392818452848401376000828201840152601f01601f191601019056fea26469706673582212202d86f6e9a6894a8b6569bd37c639ef80fdaeabe9c3ce3fe6b5b87df485294d4c64736f6c63430008190033",
  "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816310c96f4714610c14575080635835162f14610bcd5780638396e56b14610ad1578063b2d1cb7414610368578063b9029e1a14610278578063d6c3ee961461009a5763f7975e2d1461006c57600080fd5b34610095576000366003190112610095576004546040516001600160a01b039091168152602090f35b600080fd5b34610095576080366003190112610095576004356100b6610cc1565b6044359160ff8316928381036100955760643590811515820361009557600254604051630368c42760e51b81526004810185905291906001600160a01b03906000908490602490829085165afa801561026c5761016661016d9361012c60e06004948998600091610249575b5001511515611106565b61013a848454163314610e61565b8515610241576001935b8860005260006020526040600020991698896000526020526040600020611180565b500161119c565b6101c5575b1561019e577f466f70c15b5e417087a194a9084f1420ada8048da7218be6492e2a59680db9a4600080a4005b7f4297803d3d82640da42c2ec7f6fa2446d410512943c482eb96f84b211948a5ad600080a4005b8160005260016020526040600020805490600160401b82101561022b576001820180825582101561021557600052602060002001836bffffffffffffffffffffffff60a01b825416179055610172565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600293610144565b61026691503d806000833e61025e8183610e40565b810190611015565b8d610122565b6040513d6000823e3d90fd5b34610095576020806003193601126100955760043560005260008152604060002033600052815260406000208054906001600160401b03821161022b57600590604051936102cb818560051b0186610e40565b83855260009182528082208186015b8584106102f357604051806102ef8982610d1f565b0390f35b848360019260405161030481610e25565b61035a865460ff908181168452878060a01b039060081c168584015261032b878901610f04565b604084015261033c60028901610f04565b60608401526003880154608084015260048801541660a08301610fa9565b8152019201930192906102da565b34610095576060366003190112610095576024356001600160401b03811161009557610398903690600401610df8565b6044356001600160401b038111610095576103b7903690600401610df8565b600254604051630368c42760e51b815260048035908201529294926001600160a01b0390911690600081602481855afa90811561026c576104069160e091600091610ab6575001511515611106565b604051630368c42760e51b81526004803590820152600081602481855afa801561026c5760a091600091610a9b575b500151421115610a5e57600060249160405192838092630368c42760e51b825260043560048301525afa801561026c5760c091600091610a43575b500151421015610a0c576004356000526000602052604060002033600052602052600360406000205410156109c757600435600090815260208181526040808320338452909152908190208054915160ff9092169590916104d081610e25565b86815260208101923384526104e6368888611149565b90604083019182526104f9368786611149565b6060840152426080840152600060a08401528054600160401b81101561022b5761052891600182018155611180565b9490946109b1578251855491516001600160a81b031990921660ff919091161760089190911b610100600160a81b0316178455518051906001600160401b03821161022b57819061057c6001870154610eca565b601f811161095e575b50602090601f83116001146108ec576000926108e1575b50508160011b916000199060031b1c19161760018401555b60608101518051906001600160401b03821161022b576105d76002860154610eca565b601f811161089a575b50602090601f83116001146108275760a09392916000918361081c575b50508160011b916000199060031b1c19161760028501555b60808101516003850155015191600383101561080657602492600461063a920161119c565b600354604051636386c1c760e01b81523360048201529260009184919082906001600160a01b03165afa91821561026c5760009261074c575b506020602492015192600060018060a01b036002541660405194858092630368c42760e51b825260043560048301525afa92831561026c577fee432e7e3bf6c8b451619602bd793b7da6aeb929c939116da1c309bbcf68c36c946106f860606107149661070694600091610731575b500151976040519960808b5260808b01916111b4565b9088820360208a0152610cfa565b9186830360408801526111b4565b9280840360608201528061072c339560043595610cfa565b0390a4005b61074691503d806000833e61025e8183610e40565b8c6106e2565b91503d806000843e61075e8184610e40565b6020838281010312610095578251906001600160401b038211610095576040828501828601031261009557604051908160408101106001600160401b0360408401111761022b5760408201604052828501516001600160401b038111610095576107cf908287019085880101610fd0565b825260208386010151946001600160401b038611610095576024956020946107fb938301920101610fd0565b828201529250610673565b634e487b7160e01b600052602160045260246000fd5b015190508a806105fd565b906002860160005260206000209160005b601f1985168110610882575091839160019360a09695601f19811610610869575b505050811b016002850155610615565b015160001960f88460031b161c191690558a8080610859565b91926020600181928685015181550194019201610838565b600286016000526020600020601f840160051c8101602085106108da575b601f830160051c820181106108ce5750506105e0565b600081556001016108b8565b50806108b8565b01519050898061059c565b9250600186016000526020600020906000935b601f1984168510610943576001945083601f1981161061092a575b505050811b0160018401556105b4565b015160001960f88460031b161c1916905589808061091a565b818101518355602094850194600190930192909101906108ff565b909150600186016000526020600020601f840160051c8101602085106109aa575b90849392915b601f830160051c8201811061099b575050610585565b60008155859450600101610985565b508061097f565b634e487b7160e01b600052600060045260246000fd5b60405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20636865636b2d696e732074726965732072656163686564006044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e115d995b9d081a185cc8195b991959608a1b6044820152606490fd5b610a5891503d806000833e61025e8183610e40565b86610470565b60405162461bcd60e51b8152602060048201526015602482015274115d995b9d081a185cc81b9bdd081cdd185c9d1959605a1b6044820152606490fd5b610ab091503d806000833e61025e8183610e40565b87610435565b610acb91503d806000833e61025e8183610e40565b88610122565b3461009557604036600319011261009557610aea610cc1565b60043560005260209060008252604060002060018060a01b0380921660005282526040600020918254916001600160401b03831161022b579260059160405194610b39828660051b0187610e40565b8486526000928352818320908287015b868510610b5e57604051806102ef8a82610d1f565b8584600192604051610b6f81610e25565b610bbf87548760ff91828116855260081c1685840152610b90878a01610f04565b6040840152610ba160028a01610f04565b60608401526003890154608084015260048901541660a08301610fa9565b815201930194019391610b49565b34610095576020366003190112610095576004356001600160a01b038181169182900361009557610c046004549182163314610e61565b6001600160a01b03191617600455005b3461009557602080600319360112610095579060043560005260018083526040600020928354808452818401908195600052826000209060005b818110610ca55750505083610c64910384610e40565b60405192818401908285525180915260408401949160005b828110610c895785870386f35b83516001600160a01b0316875295810195928101928401610c7c565b82546001600160a01b0316845292840192918501918501610c4e565b602435906001600160a01b038216820361009557565b60005b838110610cea5750506000910152565b8181015183820152602001610cda565b90602091610d1381518092818552858086019101610cd7565b601f01601f1916010190565b602090818101828252835180915260409260408301928160408460051b8301019601946000906000925b858410610d5b57505050505050505090565b9091929394959697603f19828203018852885190610db3610da060c060ff855116845260018060a01b038a860151168a85015286850151908088860152840190610cfa565b6060808501519084830390850152610cfa565b916080808201519083015260a080910151916003831015610de4570152978501968501959493600101929190610d49565b634e487b7160e01b87526021600452602487fd5b9181601f84011215610095578235916001600160401b038311610095576020838186019501011161009557565b60c081019081106001600160401b0382111761022b57604052565b90601f801991011681019081106001600160401b0382111761022b57604052565b15610e6857565b60405162461bcd60e51b815260206004820152603460248201527f4f6e6c7920746865206f66662d636861696e2076616c696461746f722063616e604482015273103832b93337b936903a3434b99030b1ba34b7b760611b6064820152608490fd5b90600182811c92168015610efa575b6020831014610ee457565b634e487b7160e01b600052602260045260246000fd5b91607f1691610ed9565b90604051918260008254610f1781610eca565b90818452602094600191600181169081600014610f875750600114610f48575b505050610f4692500383610e40565b565b600090815285812095935091905b818310610f6f575050610f469350820101388080610f37565b85548884018501529485019487945091830191610f56565b92505050610f4694925060ff191682840152151560051b820101388080610f37565b60038210156108065752565b6001600160401b03811161022b57601f01601f191660200190565b81601f82011215610095578051610fe681610fb5565b92610ff46040519485610e40565b81845260208284010111610095576110129160208085019101610cd7565b90565b6020818303126100955780516001600160401b0391828211610095570190610100928383820312610095576040519384018481108382111761022b5760405282518281116100955781611069918501610fd0565b845260208301518281116100955781611083918501610fd0565b6020850152604083015182811161009557816110a0918501610fd0565b60408501526060830151918211610095576110bc918301610fd0565b60608301526080810151906001600160a01b03821682036100955760e091608084015260a081015160a084015260c081015160c0840152015180151581036100955760e082015290565b1561110d57565b60405162461bcd60e51b8152602060048201526014602482015273115d995b9d08191bd95cc81b9bdd08195e1a5cdd60621b6044820152606490fd5b92919261115582610fb5565b916111636040519384610e40565b829481845281830111610095578281602093846000960137010152565b8054821015610215576000526005602060002091020190600090565b9060038110156108065760ff80198354169116179055565b908060209392818452848401376000828201840152601f01601f191601019056fea26469706673582212202d86f6e9a6894a8b6569bd37c639ef80fdaeabe9c3ce3fe6b5b87df485294d4c64736f6c63430008190033",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 29,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "checkIns",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CheckIn)21_storage)dyn_storage))"
      },
      {
        "astId": 34,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "checkInEventUser",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_uint256,t_array(t_address)dyn_storage)"
      },
      {
        "astId": 37,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "eventManager",
        "offset": 0,
        "slot": "2",
        "type": "t_contract(EventManager)786"
      },
      {
        "astId": 40,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "userRegistry",
        "offset": 0,
        "slot": "3",
        "type": "t_contract(UserRegistry)1002"
      },
      {
        "astId": 42,
        "contract": "contracts/CheckInManager.sol:CheckInManager",
        "label": "offchainValidator",
        "offset": 0,
        "slot": "4",
        "type": "t_address"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_array(t_struct(CheckIn)21_storage)dyn_storage": {
        "base": "t_struct(CheckIn)21_storage",
        "encoding": "dynamic_array",
        "label": "struct CheckInManager.CheckIn[]",
        "numberOfBytes": "32"
      },
      "t_contract(EventManager)786": {
        "encoding": "inplace",
        "label": "contract EventManager",
        "numberOfBytes": "20"
      },
      "t_contract(UserRegistry)1002": {
        "encoding": "inplace",
        "label": "contract UserRegistry",
        "numberOfBytes": "20"
      },
      "t_enum(CheckInStatus)7": {
        "encoding": "inplace",
        "label": "enum CheckInManager.CheckInStatus",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_array(t_struct(CheckIn)21_storage)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct CheckInManager.CheckIn[])",
        "numberOfBytes": "32",
        "value": "t_array(t_struct(CheckIn)21_storage)dyn_storage"
      },
      "t_mapping(t_uint256,t_array(t_address)dyn_storage)": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => address[])",
        "numberOfBytes": "32",
        "value": "t_array(t_address)dyn_storage"
      },
      "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CheckIn)21_storage)dyn_storage))": {
        "encoding": "mapping",
        "key": "t_uint256",
        "label": "mapping(uint256 => mapping(address => struct CheckInManager.CheckIn[]))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_array(t_struct(CheckIn)21_storage)dyn_storage)"
      },
      "t_string_storage": {
        "encoding": "bytes",
        "label": "string",
        "numberOfBytes": "32"
      },
      "t_struct(CheckIn)21_storage": {
        "encoding": "inplace",
        "label": "struct CheckInManager.CheckIn",
        "members": [
          {
            "astId": 9,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "id",
            "offset": 0,
            "slot": "0",
            "type": "t_uint8"
          },
          {
            "astId": 11,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "user",
            "offset": 1,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 13,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "faceHash",
            "offset": 0,
            "slot": "1",
            "type": "t_string_storage"
          },
          {
            "astId": 15,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "location",
            "offset": 0,
            "slot": "2",
            "type": "t_string_storage"
          },
          {
            "astId": 17,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "timestamp",
            "offset": 0,
            "slot": "3",
            "type": "t_uint256"
          },
          {
            "astId": 20,
            "contract": "contracts/CheckInManager.sol:CheckInManager",
            "label": "status",
            "offset": 0,
            "slot": "4",
            "type": "t_enum(CheckInStatus)7"
          }
        ],
        "numberOfBytes": "160"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint8": {
        "encoding": "inplace",
        "label": "uint8",
        "numberOfBytes": "1"
      }
    }
  }
}