Last active
March 24, 2024 22:02
-
-
Save K-Honsu/88c71243e2c92602b8ded06cc4f90109 to your computer and use it in GitHub Desktop.
ETH BASE SUBMISSION
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: GPL-3.0 | |
pragma solidity >=0.8.2 <0.9.0; | |
contract Lottery { | |
address public owner; | |
uint public ticketPrice; | |
uint public lotteryDuration; | |
uint public lastLotteryTime; | |
address[] public players; | |
address public winner; | |
bool public isLotteryActive; | |
event NewTicketPurchased(address indexed player, bytes32); | |
event LotteryWinnerSelected(address indexed winner, uint indexed prize); | |
constructor(uint _ticketPrice, uint _lotteryDuration) { | |
owner = msg.sender; | |
ticketPrice = _ticketPrice; | |
lotteryDuration = _lotteryDuration; | |
isLotteryActive = false; | |
} | |
modifier onlyOwner() { | |
require(msg.sender == owner, "Only owner can call this function"); | |
_; | |
} | |
modifier lotteryActive() { | |
require(isLotteryActive, "Lottery is not active"); | |
_; | |
} | |
// function buyTicket() external payable { | |
// require(msg.value >= ticketPrice, "Insufficient funds to buy a ticket"); | |
// players.push(msg.sender); | |
// emit NewTicketPurchased(msg.sender); | |
// } | |
function buyTicket() external payable returns (bytes32) { | |
require(msg.value >= ticketPrice, "Insufficient funds to buy a ticket"); | |
players.push(msg.sender); | |
bytes32 txHash = keccak256(abi.encodePacked(block.timestamp, msg.sender, msg.value)); | |
emit NewTicketPurchased(msg.sender, txHash); | |
return txHash; | |
} | |
function startLottery() external onlyOwner { | |
require(!isLotteryActive, "Lottery is already active"); | |
isLotteryActive = true; | |
lastLotteryTime = block.timestamp; | |
} | |
function endLottery() external onlyOwner lotteryActive { | |
require(block.timestamp >= lastLotteryTime + lotteryDuration, "Lottery duration not elapsed yet"); | |
isLotteryActive = false; | |
selectWinner(); | |
distributePrize(); | |
} | |
function selectWinner() internal { | |
uint index = random() % players.length; | |
winner = players[index]; | |
} | |
function distributePrize() internal { | |
require(winner != address(0), "No winner selected"); | |
uint prize = address(this).balance; | |
payable(winner).transfer(prize); | |
emit LotteryWinnerSelected(winner, prize); | |
delete players; | |
winner = address(0); | |
} | |
function random() internal view returns (uint) { | |
return uint(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, players.length))); | |
} | |
function withdrawOwnerFunds() external onlyOwner { | |
payable(owner).transfer(address(this).balance); | |
} | |
// Utility functions to view contract data | |
function getPlayers() external view returns (address[] memory) { | |
return players; | |
} | |
function getContractBalance() external view returns (uint) { | |
return address(this).balance; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment