/* Crafted with love by Fueled on Bacon https://fueledonbacon.com */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.15; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../interfaces/IReservForwarder.sol"; import "../interfaces/IERC721FactoryWide.sol"; abstract contract ERC721FactoryWide is IERC721FactoryWide, Context { using EnumerableSet for EnumerableSet.AddressSet; address internal _forwarder; mapping(address => EnumerableSet.AddressSet) internal _eventsByVenue; /// @inheritdoc IERC721FactoryWide function versionERC721FactoryWide() external pure virtual override returns (string memory) { return "1.0.0-beta.0+fob.rsv.iERC721FactoryWide"; } /// @inheritdoc IERC721FactoryWide function isTrustedForwarder(address forwarder) public view virtual override returns (bool) { return _forwarder == forwarder; } function _setTrustedForwarer(address forwarder) internal { if(!IERC165(forwarder).supportsInterface(type(IReservForwarder).interfaceId)) revert ERC721EFactoryWideInvalidForwarderInterface(); _forwarder = forwarder; } /// @inheritdoc IERC721FactoryWide function removeEvent(address venue, address _event) external virtual override { if(!isTrustedForwarder(_msgSender())) revert ERC721EFactoryWideInvalidForwarder(); if(!_eventsByVenue[venue].contains(_event)) revert ERC721EFactoryWideEventNotFound(); _eventsByVenue[venue].remove(_event); emit EventRemoved(venue, _event); } function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC721FactoryWide).interfaceId; } }