// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/contracts/access/AccessControl.sol"; abstract contract FleekAccessControl is AccessControl { bytes32 public constant COLLECTION_OWNER_ROLE = keccak256("COLLECTION_OWNER_ROLE"); bytes32 public constant COLLECTION_CONTROLLER_ROLE = keccak256("COLLECTION_CONTROLLER_ROLE"); constructor() { _setRoleAdmin(COLLECTION_OWNER_ROLE, DEFAULT_ADMIN_ROLE); _grantRole(COLLECTION_OWNER_ROLE, msg.sender); } modifier requireCollectionOwner() { require(hasRole(COLLECTION_OWNER_ROLE, msg.sender), "FleekAccessControl: must have collection owner role"); _; } modifier requireCollectionController() { require( hasRole(COLLECTION_OWNER_ROLE, msg.sender) || hasRole(COLLECTION_CONTROLLER_ROLE, msg.sender), "FleekAccessControl: must have collection controller role" ); _; } modifier requireTokenController(uint256 tokenId) { require(hasRole(_tokenRole(tokenId, "CONTROLLER"), msg.sender), "FleekAccessControl: must have token role"); _; } function isTokenController(uint256 tokenId, address account) public view returns (bool) { return hasRole(_tokenRole(tokenId, "CONTROLLER"), account); } function _tokenRole(uint256 tokenId, string memory role) internal pure returns (bytes32) { return keccak256(abi.encodePacked("TOKEN_", role, tokenId)); } function _clearTokenControllers(uint256 tokenId) internal { // TODO: Remove token controllers from AccessControl } }