pragma solidity ^0.8.18;
contract raffle {
address payable public Owner;
uint256 public Tax;
bool public IsGameOn = false;
uint256 public MinimumAmount;
event NewParticipants(address Sender, uint256 Amount);
event WinnerDeclared(address indexed Winner, uint256 Amount);
event GameOn();
event GameOff();
constructor(uint _Tax, uint _MinimumAmount) {
Owner = payable(msg.sender);
Tax = _Tax;
MinimumAmount = _MinimumAmount;
}
modifier IsOpen() {
require(IsGameOn, "Deposits are currently closed");
_;
}
modifier IsOwner() {
require(msg.sender == Owner, "Only the owner can call this function");
_;
}
receive() external payable IsOpen {
require(msg.value >= MinimumAmount, "Minimum deposit amount not met");
emit NewParticipants(msg.sender, msg.value);
}
function StartGame() external IsOwner {
require(!IsGameOn, "Game is already in progress");
IsGameOn = true;
emit GameOn();
}
function EndGame() external IsOwner {
require(IsGameOn, "Game has not started yet");
IsGameOn = false;
emit GameOff();
}
function ChangeMinimumAmount(uint256 Amount) external IsOwner {
MinimumAmount = Amount;
}
function ChangeTaxPercentage(uint256 _Tax) external IsOwner {
require(_Tax <= 100, "Invalid Tax amount");
Tax = _Tax;
}
function DistributePrize(address payable winner) external IsOwner {
uint256 ContractBalance = address(this).balance;
require(address(this).balance > 0, "No Balance Left");
uint256 TaxAmount = (ContractBalance * Tax) / 100;
uint256 amount = ContractBalance - TaxAmount;
(bool sent, ) = winner.call{value: amount}("");
require(sent, "Failed to send Ether");
(bool sent2, ) = Owner.call{value: TaxAmount}("");
require(sent2, "Failed to send Ether");
emit WinnerDeclared(winner, amount);
}
}
{
"compilationTarget": {
"raffle.sol": "raffle"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_Tax","type":"uint256"},{"internalType":"uint256","name":"_MinimumAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"GameOff","type":"event"},{"anonymous":false,"inputs":[],"name":"GameOn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"NewParticipants","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"Winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"WinnerDeclared","type":"event"},{"inputs":[{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"ChangeMinimumAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Tax","type":"uint256"}],"name":"ChangeTaxPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"winner","type":"address"}],"name":"DistributePrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"EndGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IsGameOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MinimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StartGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]