Untitled
unknown
plain_text
a year ago
4.0 kB
5
Indexable
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; //import "@openzeppelin/contracts/utils/Random.sol"; contract Ticket is ERC1155, Ownable { IERC20 public feeToken; uint256 public feeAmount = 2 * 10**6; mapping(uint256 => bool) public mintedTokens; // Winning numbers uint256[] public winningNumbers; // Mapping to track who minted which tokens mapping(uint256 => address) public tokenMinters; event TokensMinted(address indexed user, uint256[] tokenIds); event TokensWithdrawn(address indexed user, uint256[] tokenIds); event USDTWithdrawn(address indexed user, uint256 amount); event WinningNumbersAnnounced(uint256[] numbers); event TokensClaimed(address indexed user, uint256[] tokenIds); constructor(address _feeToken, address owner) ERC1155("Your Game Tokens URI") Ownable(owner) { feeToken = IERC20(_feeToken); } // Reward multiplier variable uint256 public rewardMultiplier = 1; // Function for admin to set the reward multiplier function setRewardMultiplier(uint256 multiplier) external onlyOwner { rewardMultiplier = multiplier; } function mintTickets(uint256[] memory tokenIds) external { require(tokenIds.length == 3, "Exactly 3 tokens must be selected"); require( feeToken.transferFrom(msg.sender, address(this), feeAmount * 3), "Fee transfer failed" ); for (uint256 i = 0; i < 3; i++) { _mint(msg.sender, tokenIds[i], 1, ""); mintedTokens[tokenIds[i]] = true; tokenMinters[tokenIds[i]] = msg.sender; } emit TokensMinted(msg.sender, tokenIds); } function generateRandomNumbers() public view returns (uint256[] memory) { uint256[] memory randomNumbers = new uint256[](3); for (uint256 i = 0; i < 3; i++) { // Use block timestamp, block difficulty, and block hash to generate randomness uint256 randomNumber = uint256( keccak256( abi.encodePacked( block.timestamp, block.difficulty, blockhash(block.number - i) ) ) ); // Map the random number to the range [1, 30] randomNumbers[i] = (randomNumber % 30) + 1; } return randomNumbers; } function claimWinningTokens() external { uint256[] memory randomNumbers = generateRandomNumbers(); require(randomNumbers.length == 3, "Invalid random numbers generated"); bool hasWon = true; for (uint256 i = 0; i < randomNumbers.length; i++) { if (balanceOf(msg.sender, randomNumbers[i]) == 0) { hasWon = false; break; } } require(hasWon, "You didn't mint all the winning tokens"); uint256 reward = feeAmount * rewardMultiplier; // Transfer the reward tokens to the user require( feeToken.transfer(msg.sender, reward), "Reward transfer failed" ); // Emit an event for token claiming emit TokensClaimed(msg.sender, randomNumbers); } function withdrawUSDT(uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than 0"); require( feeToken.balanceOf(address(this)) >= amount, "Insufficient USDT balance in the contract" ); require(feeToken.transfer(msg.sender, amount), "USDT transfer failed"); emit USDTWithdrawn(msg.sender, amount); } // Function to allow users to check if tokens have been minted function checkTokenMinted(uint256 tokenId) external view returns (bool) { return mintedTokens[tokenId]; } }
Editor is loading...
Leave a Comment