{"language":"Solidity","sources":{"MarketplaceWithSpin.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.29;\n\ncontract MarketplaceWithSpin {\n    struct Item {\n        uint256 id;\n        address owner;\n        uint256 price;\n        bool forSale;\n    }\n\n    mapping(uint256 => Item) public items;\n    mapping(address => uint256[]) public ownedItems;\n    mapping(address => uint256) public lastSpinTimestamp;\n\n    uint256 public itemCounter;\n    uint256 private randomSeed;\n\n    event ItemListed(uint256 itemId, address owner, uint256 price);\n    event ItemBought(uint256 itemId, address newOwner, uint256 price);\n    event SpinReward(address user, string reward);\n\n    constructor() {\n        randomSeed = uint256(keccak256(abi.encodePacked(block.timestamp, block.difficulty)));\n    }\n\n    modifier onlyOncePerDay() {\n        require(block.timestamp >= lastSpinTimestamp[msg.sender] + 1 days, \"Spin available once per day\");\n        _;\n    }\n\n    function listItem(uint256 price) external {\n        require(price > 0, \"Price must be greater than 0\");\n\n        itemCounter++;\n        items[itemCounter] = Item(itemCounter, msg.sender, price, true);\n\n        emit ItemListed(itemCounter, msg.sender, price);\n    }\n\n    function buyItem(uint256 itemId) external payable {\n        Item storage item = items[itemId];\n        require(item.forSale, \"Item is not for sale\");\n        require(msg.value >= item.price, \"Insufficient payment\");\n\n        item.owner = msg.sender;\n        item.forSale = false;\n        ownedItems[msg.sender].push(itemId);\n\n        emit ItemBought(itemId, msg.sender, item.price);\n    }\n\n    function spinWheel() external onlyOncePerDay {\n        lastSpinTimestamp[msg.sender] = block.timestamp;\n\n        // Generate randomness based on block data\n        uint256 randomness = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, randomSeed)));\n        randomSeed = randomness; // Update the random seed\n\n        string memory reward = _getReward(randomness);\n        emit SpinReward(msg.sender, reward);\n    }\n\n    function _getReward(uint256 randomness) private pure returns (string memory) {\n        // Define rewards\n        string[3] memory rewards = [\"10 Tokens\", \"20 Tokens\", \"30 Tokens\"];\n        uint256 index = randomness % rewards.length;\n        return rewards[index];\n    }\n}\n"}},"settings":{"outputSelection":{"*":{"*":["*"]}},"optimizer":{"enabled":true,"runs":200}}}