Contract Overview
Balance:
0.011 MATIC
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x441b7539906efec4df1cb80e78b5b43c34a6c6cd3cb7ff6b84563a568f5ca88f | 30572027 | 79 days 18 mins ago | 0x954d6422483eb28ba107d3f82bd9e8feff51937c | 0xd5bb7b414cdd212b994756c063aec29a4da05b5a | 0.099 MATIC |
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
Lottery
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: GPL-3.0 import "@openzeppelin/contracts/utils/Strings.sol"; pragma solidity >=0.7.0 <0.9.0; contract Lottery { uint256 public constant ticketPrice = 0.01 ether; uint256 public constant maxTickets = 100; // maximum tickets per lottery uint256 public constant ticketCommission = 0.001 ether; // commition per ticket uint256 public constant duration = 30 minutes; // The duration set for the lottery uint256 public expiration; // Timeout in case That the lottery was not carried out. address public lotteryOperator; // the crator of the lottery uint256 public operatorTotalCommission = 0; // the total commission balance address public lastWinner; // the last winner of the lottery uint256 public lastWinnerAmount; // the last winner amount of the lottery mapping(address => uint256) public winnings; // maps the winners to there winnings address[] public tickets; //array of purchased Tickets // modifier to check if caller is the lottery operator modifier isOperator() { require( (msg.sender == lotteryOperator), "Caller is not the lottery operator" ); _; } // modifier to check if caller is a winner modifier isWinner() { require(IsWinner(), "Caller is not a winner"); _; } constructor() { lotteryOperator = msg.sender; expiration = block.timestamp + duration; } // return all the tickets function getTickets() public view returns (address[] memory) { return tickets; } function getWinningsForAddress(address addr) public view returns (uint256) { return winnings[addr]; } function BuyTickets() public payable { require( msg.value % ticketPrice == 0, string.concat( "the value must be multiple of ", Strings.toString(ticketPrice), " Ether" ) ); uint256 numOfTicketsToBuy = msg.value / ticketPrice; require( numOfTicketsToBuy <= RemainingTickets(), "Not enough tickets available." ); for (uint256 i = 0; i < numOfTicketsToBuy; i++) { tickets.push(msg.sender); } } function DrawWinnerTicket() public isOperator { require(tickets.length > 0, "No tickets were purchased"); bytes32 blockHash = blockhash(block.number - tickets.length); uint256 randomNumber = uint256( keccak256(abi.encodePacked(block.timestamp, blockHash)) ); uint256 winningTicket = randomNumber % tickets.length; address winner = tickets[winningTicket]; lastWinner = winner; winnings[winner] += (tickets.length * (ticketPrice - ticketCommission)); lastWinnerAmount = winnings[winner]; operatorTotalCommission += (tickets.length * ticketCommission); delete tickets; expiration = block.timestamp + duration; } function restartDraw() public isOperator { require(tickets.length == 0, "Cannot Restart Draw as Draw is in play"); delete tickets; expiration = block.timestamp + duration; } function checkWinningsAmount() public view returns (uint256) { address payable winner = payable(msg.sender); uint256 reward2Transfer = winnings[winner]; return reward2Transfer; } function WithdrawWinnings() public isWinner { address payable winner = payable(msg.sender); uint256 reward2Transfer = winnings[winner]; winnings[winner] = 0; winner.transfer(reward2Transfer); } function RefundAll() public { require(block.timestamp >= expiration, "the lottery not expired yet"); for (uint256 i = 0; i < tickets.length; i++) { address payable to = payable(tickets[i]); tickets[i] = address(0); to.transfer(ticketPrice); } delete tickets; } function WithdrawCommission() public isOperator { address payable operator = payable(msg.sender); uint256 commission2Transfer = operatorTotalCommission; operatorTotalCommission = 0; operator.transfer(commission2Transfer); } function IsWinner() public view returns (bool) { return winnings[msg.sender] > 0; } function CurrentWinningReward() public view returns (uint256) { return tickets.length * ticketPrice; } function RemainingTickets() public view returns (uint256) { return maxTickets - tickets.length; } }
{ "optimizer": { "enabled": true, "runs": 800 }, "evmVersion": "london", "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BuyTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"CurrentWinningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DrawWinnerTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IsWinner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RefundAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RemainingTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WithdrawCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WithdrawWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkWinningsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTickets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getWinningsForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastWinnerAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorTotalCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restartDraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ticketCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tickets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600060025534801561001557600080fd5b50600180546001600160a01b031916331790556100346107084261003c565b600055610063565b8082018082111561005d57634e487b7160e01b600052601160045260246000fd5b92915050565b610f58806100726000396000f3fe6080604052600436106101805760003560e01c806371827b7b116100d6578063ba946d791161007f578063ea3a149911610059578063ea3a1499146103c4578063f2613269146103f1578063fe1881841461040657600080fd5b8063ba946d7914610363578063c6944fa014610379578063dd64e5341461038e57600080fd5b806396c85ef3116100b057806396c85ef31461030a5780639b89470314610339578063a88f46721461034e57600080fd5b806371827b7b146102d857806391d8b14e146102ed57806393a563b5146102f557600080fd5b80634665096d1161013857806350b447121161011257806350b44712146102655780635a58acdd1461029d5780636032a4f9146102bd57600080fd5b80634665096d146102185780634788af7c1461022e5780634ed026221461024357600080fd5b80630fb5a6b4116101695780630fb5a6b4146101d05780631209b1f6146101e657806335580df21461020157600080fd5b806306f7f3bf146101855780630789c607146101ae575b600080fd5b34801561019157600080fd5b5061019b60045481565b6040519081526020015b60405180910390f35b3480156101ba57600080fd5b503360009081526005602052604090205461019b565b3480156101dc57600080fd5b5061019b61070881565b3480156101f257600080fd5b5061019b662386f26fc1000081565b34801561020d57600080fd5b50610216610426565b005b34801561022457600080fd5b5061019b60005481565b34801561023a57600080fd5b506102166104cd565b34801561024f57600080fd5b506102586106e1565b6040516101a59190610ced565b34801561027157600080fd5b50610285610280366004610d3a565b610743565b6040516001600160a01b0390911681526020016101a5565b3480156102a957600080fd5b50600154610285906001600160a01b031681565b3480156102c957600080fd5b5061019b66038d7ea4c6800081565b3480156102e457600080fd5b5061021661076d565b61021661080c565b34801561030157600080fd5b5061019b610948565b34801561031657600080fd5b5033600090815260056020526040902054151560405190151581526020016101a5565b34801561034557600080fd5b5061019b606481565b34801561035a57600080fd5b5061021661095e565b34801561036f57600080fd5b5061019b60025481565b34801561038557600080fd5b5061019b610a82565b34801561039a57600080fd5b5061019b6103a9366004610d53565b6001600160a01b031660009081526005602052604090205490565b3480156103d057600080fd5b5061019b6103df366004610d53565b60056020526000908152604090205481565b3480156103fd57600080fd5b50610216610a9a565b34801561041257600080fd5b50600354610285906001600160a01b031681565b6001546001600160a01b031633146104905760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b60648201526084015b60405180910390fd5b600280546000918290556040513392839183156108fc0291849190818181858888f193505050501580156104c8573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146105325760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b6064820152608401610487565b6006546105815760405162461bcd60e51b815260206004820152601960248201527f4e6f207469636b657473207765726520707572636861736564000000000000006044820152606401610487565b6006546000906105919043610d99565b604080514260208201529140908201819052915060009060600160408051601f1981840301815291905280516020909101206006549091506000906105d69083610dc8565b90506000600682815481106105ed576105ed610ddc565b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055905061063e66038d7ea4c68000662386f26fc10000610d99565b60065461064b9190610df2565b6001600160a01b03821660009081526005602052604081208054909190610673908490610e09565b90915550506001600160a01b0381166000908152600560205260409020546004556006546106a99066038d7ea4c6800090610df2565b600260008282546106ba9190610e09565b909155506106cc905060066000610cb3565b6106d861070842610e09565b60005550505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561073957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161071b575b5050505050905090565b6006818154811061075357600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600560205260409020546107c95760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f7420612077696e6e6572000000000000000000006044820152606401610487565b3360008181526005602052604080822080549083905590519091839183156108fc0291849190818181858888f193505050501580156104c8573d6000803e3d6000fd5b61081d662386f26fc1000034610dc8565b1561082e662386f26fc10000610b92565b60405160200161083e9190610e40565b6040516020818303038152906040529061086b5760405162461bcd60e51b81526004016104879190610eac565b50600061087f662386f26fc1000034610edf565b9050610889610948565b8111156108d85760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768207469636b65747320617661696c61626c652e0000006044820152606401610487565b60005b8181101561094457600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805473ffffffffffffffffffffffffffffffffffffffff1916331790558061093c81610ef3565b9150506108db565b5050565b600654600090610959906064610d99565b905090565b6000544210156109b05760405162461bcd60e51b815260206004820152601b60248201527f746865206c6f7474657279206e6f7420657870697265642079657400000000006044820152606401610487565b60005b600654811015610a73576000600682815481106109d2576109d2610ddc565b6000918252602082200154600680546001600160a01b03909216935090849081106109ff576109ff610ddc565b60009182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393841617905560405191831691662386f26fc100009082818181858883f19350505050158015610a5e573d6000803e3d6000fd5b50508080610a6b90610ef3565b9150506109b3565b50610a8060066000610cb3565b565b60065460009061095990662386f26fc1000090610df2565b6001546001600160a01b03163314610aff5760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b6064820152608401610487565b60065415610b755760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f74205265737461727420447261772061732044726177206973206960448201527f6e20706c617900000000000000000000000000000000000000000000000000006064820152608401610487565b610b8160066000610cb3565b610b8d61070842610e09565b600055565b606081600003610bb95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610be35780610bcd81610ef3565b9150610bdc9050600a83610edf565b9150610bbd565b60008167ffffffffffffffff811115610bfe57610bfe610f0c565b6040519080825280601f01601f191660200182016040528015610c28576020820181803683370190505b5090505b8415610cab57610c3d600183610d99565b9150610c4a600a86610dc8565b610c55906030610e09565b60f81b818381518110610c6a57610c6a610ddc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ca4600a86610edf565b9450610c2c565b949350505050565b5080546000825590600052602060002090810190610cd19190610cd4565b50565b5b80821115610ce95760008155600101610cd5565b5090565b6020808252825182820181905260009190848201906040850190845b81811015610d2e5783516001600160a01b031683529284019291840191600101610d09565b50909695505050505050565b600060208284031215610d4c57600080fd5b5035919050565b600060208284031215610d6557600080fd5b81356001600160a01b0381168114610d7c57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dac57610dac610d83565b92915050565b634e487b7160e01b600052601260045260246000fd5b600082610dd757610dd7610db2565b500690565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610dac57610dac610d83565b80820180821115610dac57610dac610d83565b60005b83811015610e37578181015183820152602001610e1f565b50506000910152565b7f7468652076616c7565206d757374206265206d756c7469706c65206f66200000815260008251610e7881601e850160208701610e1c565b7f2045746865720000000000000000000000000000000000000000000000000000601e939091019283015250602401919050565b6020815260008251806020840152610ecb816040850160208701610e1c565b601f01601f19169190910160400192915050565b600082610eee57610eee610db2565b500490565b600060018201610f0557610f05610d83565b5060010190565b634e487b7160e01b600052604160045260246000fdfea26469706673582212208dbb14e8606fbb027362cab256ca1d5b66d97f16b2e5395a598bb591c009d87564736f6c63430008110033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|