pragma solidity ^0.8.0;
contract Raffle {
mapping(address => uint) public ticketCount;
mapping(uint => address) public ticketToOwner;
uint public ticketIndex = 0;
uint public totalTickets = 0;
function zapSats(uint numTickets) public payable {
require(msg.value >= numTickets * 1000, "Insufficient sats zapped.");
ticketCount[msg.sender] += numTickets;
for (uint i = 0; i < numTickets; i++) {
ticketToOwner[ticketIndex] = msg.sender;
ticketIndex++;
totalTickets++;
}
}
function drawWinner() public returns (address) {
require(totalTickets > 0, "No tickets purchased.");
uint winningTicket = uint(keccak256(abi.encodePacked(block.timestamp, block.difficulty))) % totalTickets;
address winner = ticketToOwner[winningTicket];
ticketCount[winner] = 0;
ticketToOwner[winningTicket] = address(0);
totalTickets--;
winner.transfer(address(this).balance);
return winner;
}
}