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