Skip to content

Instantly share code, notes, and snippets.

@K-Honsu
Last active March 24, 2024 22:02
Show Gist options
  • Save K-Honsu/88c71243e2c92602b8ded06cc4f90109 to your computer and use it in GitHub Desktop.
Save K-Honsu/88c71243e2c92602b8ded06cc4f90109 to your computer and use it in GitHub Desktop.
ETH BASE SUBMISSION
// 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