// contracts/NFT.sol // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.3; import "@openzeppelin/contracts/access/Ownable.sol"; contract UnicornAdmin is Ownable { mapping(address => uint256) addressToUnicornCreatorId; address[] UnicornCreators; event UnicornCreatorAdded(address creator); event UnicornCreatorRemoved(address creator); constructor() { // placeholder to reserve ID zero as an invalid value _addUnicornCreator(address(0)); // the owner should be allowed to create kitties _addUnicornCreator(owner()); } modifier onlyUnicornCreator() { require(isUnicornCreator(msg.sender), "must be a Unicorn creator"); _; } function isUnicornCreator(address _address) public view returns (bool) { return addressToUnicornCreatorId[_address] != 0; } function addUnicornCreator(address _address) external onlyOwner { require(_address != address(this), "contract address"); require(_address != address(0), "zero address"); _addUnicornCreator(_address); } function _addUnicornCreator(address _address) internal { addressToUnicornCreatorId[_address] = UnicornCreators.length; UnicornCreators.push(_address); emit UnicornCreatorAdded(_address); } function removeUnicornCreator(address _address) external onlyOwner { uint256 id = addressToUnicornCreatorId[_address]; delete addressToUnicornCreatorId[_address]; delete UnicornCreators[id]; emit UnicornCreatorRemoved(_address); } function getUnicornCreators() external view returns (address[] memory) { return UnicornCreators; } }