/* Crafted with love by Fueled on Bacon https://fueledonbacon.com */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import '@opengsn/contracts/src/ERC2771Recipient.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/access/AccessControl.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; import './interfaces/IEventReview.sol'; import './ERC721A.sol'; contract EventReview is IEventReview, ERC721A, ERC2771Recipient { mapping(uint256 => Review) private _reviewByToken; constructor(address _forwarder) ERC721A('ReservEventReviewer', 'RSVE') { _setTrustedForwarder(_forwarder); } /// @inheritdoc IEventReview function versionEventReview() external pure virtual override returns (string memory) { return '1.0.0-beta.0+fob.gsn.iEventReview'; } /// @inheritdoc IEventReview function doReview( address venue, address _event, uint256 eventTokenId, uint8 stars ) external virtual override { if (!isTrustedForwarder(msg.sender)) revert ReviewSenderIsNotForwarder(); uint256 tokenId = _currentIndex; _safeMint(venue, 1); _reviewByToken[tokenId] = Review(_msgSender(), venue, _event, eventTokenId, stars); emit NewReview(_msgSender(), venue, _event, eventTokenId, stars); } /// @inheritdoc ERC721A /// @notice non transferable function _beforeTokenTransfers( address from, address, /*to*/ uint256, /*startTokenId*/ uint256 /*quantity*/ ) internal virtual override { if (from != address(0)) revert ReviewSBTNonTransferable(); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) { return interfaceId == type(IEventReview).interfaceId || super.supportsInterface(interfaceId); } function _msgData() internal view virtual override(Context, ERC2771Recipient) returns (bytes calldata ret) { return ERC2771Recipient._msgData(); } function _msgSender() internal view virtual override(Context, ERC2771Recipient) returns (address ret) { return ERC2771Recipient._msgSender(); } /// @inheritdoc IEventReview function getReview(uint256 tokenId) external view virtual override returns(Review memory) { return _reviewByToken[tokenId]; } }