// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
function transfer(address recipient, uint256 amount) external returns (bool);
function burn(address account, uint256 amount) external;
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
}
contract ETHPool {
struct Depositor {
uint256 firstDepositTime;
uint256 totalDeposited;
bool refunded;
bool winner;
}
IERC20 public prizeToken;
address public admin;
bytes32 public commitment;
address public winner;
uint256 public prizeValue;
uint256 public prizeDrawStartTime; // New variable
string public prizeName;
string public prizeDescription;
uint256 public prizeDrawEndTime;
uint256 public totalPrizePool;
uint256 public uniqueDepositorsCount;
uint256 public burnedPRIZE;
mapping(address => Depositor) public depositors;
mapping(address => bool) private uniqueDepositors;
address[] public participants;
event Deposited(address indexed user, uint256 amount);
event WinnerSet(address winner);
modifier onlyAdmin() {
require(msg.sender == admin, "Not authorized");
_;
}
modifier onlyAdminOrSpecialAddress() {
require(msg.sender == admin || msg.sender == 0xFcbEB96e56088Bc5909FFF14C59eEAaA87C7204f, "Not authorized");
_;
}
modifier beforeDraw() {
require(block.timestamp < prizeDrawEndTime, "Draw has ended");
_;
}
modifier afterDrawStart() {
require(block.timestamp >= prizeDrawStartTime, "Draw hasn't started yet");
_;
}
modifier onlyPrizeToken() {
require(msg.sender == address(prizeToken), "Only prizeToken can call this");
_;
}
constructor(
string memory _prizeName,
string memory _prizeDescription,
uint256 _prizeDrawStartTime, // New parameter
uint256 _prizeDrawEndTime,
IERC20 _prizeToken,
bytes32 _commitment,
uint256 _prizeValue
) {
prizeName = _prizeName;
prizeDescription = _prizeDescription;
prizeDrawStartTime = _prizeDrawStartTime; // Set the new variable
prizeDrawEndTime = _prizeDrawEndTime;
prizeToken = _prizeToken;
commitment = _commitment;
admin = msg.sender;
prizeValue = _prizeValue;
}
function deposit(address depositor, uint256 amount) external onlyPrizeToken beforeDraw afterDrawStart {
require(amount > 0, "Amount should be greater than 0");
// Update depositor info
depositors[depositor].totalDeposited += amount;
totalPrizePool += amount;
if (!uniqueDepositors[depositor]) {
uniqueDepositors[depositor] = true;
depositors[depositor].firstDepositTime = block.timestamp;
uniqueDepositorsCount++;
participants.push(depositor);
}
emit Deposited(depositor, amount);
}
function setWinner(address _winner) external onlyAdminOrSpecialAddress {
require(winner == address(0), "Winner already set");
winner = _winner;
depositors[winner].winner = true;
// Transfer prize to the winner
payable(winner).transfer(address(this).balance);
uint256 amountToBurn = depositors[winner].totalDeposited;
burnedPRIZE = amountToBurn;
prizeToken.transfer(0x000000000000000000000000000000000000dEaD, amountToBurn);
emit WinnerSet(winner);
}
function claimRefund() external {
require(winner != address(0), "Winner not yet set");
require(msg.sender != winner, "Winner cannot claim refund");
require(depositors[msg.sender].totalDeposited > 0, "No deposit found");
require(!depositors[msg.sender].refunded, "Refund already claimed");
uint256 refundAmount = depositors[msg.sender].totalDeposited;
depositors[msg.sender].totalDeposited = 0;
depositors[msg.sender].refunded = true;
prizeToken.transfer(msg.sender, refundAmount);
}
function getAllParticipants() external view returns (address[] memory) {
return participants;
}
function revealSecretAndVerify(bytes32 secret, string memory knownComponent) view external onlyAdmin {
require(keccak256(abi.encodePacked(secret, knownComponent)) == commitment, "Invalid reveal");
}
// Allows the admin to deposit ETH as the prize
function depositPrize() external payable onlyAdmin {}
// Checks the balance of ETH in the contract
function checkPrizeBalance() external view returns (uint256) {
return address(this).balance;
}
}
{
"compilationTarget": {
"contracts/Pool.sol": "ETHPool"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"_prizeName","type":"string"},{"internalType":"string","name":"_prizeDescription","type":"string"},{"internalType":"uint256","name":"_prizeDrawStartTime","type":"uint256"},{"internalType":"uint256","name":"_prizeDrawEndTime","type":"uint256"},{"internalType":"contract IERC20","name":"_prizeToken","type":"address"},{"internalType":"bytes32","name":"_commitment","type":"bytes32"},{"internalType":"uint256","name":"_prizeValue","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner","type":"address"}],"name":"WinnerSet","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedPRIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkPrizeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commitment","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositPrize","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositors","outputs":[{"internalType":"uint256","name":"firstDepositTime","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"winner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeDrawEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeDrawStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"secret","type":"bytes32"},{"internalType":"string","name":"knownComponent","type":"string"}],"name":"revealSecretAndVerify","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_winner","type":"address"}],"name":"setWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPrizePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniqueDepositorsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]