// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/common/ERC2981.sol"; import "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import 'abdk-libraries-solidity/ABDKMathQuad.sol'; import "@openzeppelin/contracts/utils/Base64.sol"; import "./TicketContract.sol"; contract TicketMarketplace { struct Listing { uint256 tokenId; address seller; uint256 price; } event Listed( uint256 indexed tokenId, address indexed seller, uint256 price ); event Sale( uint256 indexed tokenId, address indexed seller, address indexed buyer, uint256 price ); TicketContract public nft; mapping(uint256 => Listing) private listings; constructor(address _nftTicketContract) { nft = TicketContract(_nftTicketContract); } function listToken(uint256 tokenId, uint256 price) external { // Ensure token owner is msg.sender require(nft.ownerOf(tokenId) == msg.sender, "Not your token"); // Ensure token not already listed require(listings[tokenId].price == 0, "Already listed"); listings[tokenId] = Listing( tokenId, msg.sender, price ); emit Listed(tokenId, msg.sender, price); } function buyToken(uint256 tokenId) external payable { Listing memory listed = listings[tokenId]; // Ensure listing exists require(listed.price > 0, "Not listed"); // Ensure sent enough ETH require(msg.value >= listed.price, "Sent insufficient funds"); //TODO pay royalties to SellTix and Tickets organization // Transfer NFT nft.safeTransferFrom(listed.seller, msg.sender, tokenId); // Pay seller payable(listed.seller).transfer(listed.price); // Remove listing delete(listings[tokenId]); emit Sale(tokenId, listed.seller, msg.sender, listed.price); } }