Contract 0x954D6422483EB28Ba107d3f82Bd9E8fEff51937C

Contract Overview

Balance:
0.011 MATIC
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x441b7539906efec4df1cb80e78b5b43c34a6c6cd3cb7ff6b84563a568f5ca88fWithdraw Winning...305720272023-01-05 9:57:4779 days 18 mins ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0 MATIC0.0000429405 1.500000016
0xb9030d6ee99b38192b376107cc47e0f2dfbe47bf9e09be01eef2495e7180170dDraw Winner Tick...305716862023-01-05 9:45:4379 days 30 mins ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0 MATIC0.00028909104 3.88
0xcfc3e6fd6aaa6f99d72015d2184bc4338a94ed85062361a8b2c9c35a7835670fBuy Tickets305715432023-01-05 9:40:3979 days 35 mins ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0.02 MATIC0.000122350501 1.500000016
0x0309d408234972ee07a2cbfe1590a22a7502cd385ab10deb23916d386b80f5bbBuy Tickets305715342023-01-05 9:40:1979 days 36 mins ago0x8af12e3e2975c90b5d416a51b2c9053dd92423a9 IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0.05 MATIC0.000223465502 1.500000016
0x11bbeea0fa5fc6fdb36984a3ca0577933bee5a055b9b957dbd5c9432d4ebb8a4Buy Tickets305714712023-01-05 9:38:0579 days 38 mins ago0x8af12e3e2975c90b5d416a51b2c9053dd92423a9 IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0.01 MATIC0.000114295501 1.500000016
0x6f0391c8ace2190ba722d4bcfae11101e2a37273e67f3fe6a25dc17914da289cDraw Winner Tick...305714172023-01-05 9:36:1179 days 40 mins ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0 MATIC0.000179835001 1.500000016
0x4b105751a324b984eea1ad8dffbb2fe33deea4099671790591819cb5b7ab241aBuy Tickets298047162022-12-17 13:00:0197 days 21 hrs ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  0x954d6422483eb28ba107d3f82bd9e8feff51937c0.03 MATIC0.000181705501 1.500000015
0xf6e84485f0ec194e257b7d03f10db74453bb66db1810ea1eba7fa07960f83f950x60806040298045442022-12-17 12:53:5797 days 21 hrs ago0xd5bb7b414cdd212b994756c063aec29a4da05b5a IN  Create: Lottery0 MATIC0.001570389937 1.656501512
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x441b7539906efec4df1cb80e78b5b43c34a6c6cd3cb7ff6b84563a568f5ca88f305720272023-01-05 9:57:4779 days 18 mins ago 0x954d6422483eb28ba107d3f82bd9e8feff51937c0xd5bb7b414cdd212b994756c063aec29a4da05b5a0.099 MATIC
[ Download CSV Export 
Loading

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)

File 1 of 2 : Strings.sol
// 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);
    }
}

File 2 of 2 : Lottery.sol
// 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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "evmVersion": "london",
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract 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"}]

6080604052600060025534801561001557600080fd5b50600180546001600160a01b031916331790556100346107084261003c565b600055610063565b8082018082111561005d57634e487b7160e01b600052601160045260246000fd5b92915050565b610f58806100726000396000f3fe6080604052600436106101805760003560e01c806371827b7b116100d6578063ba946d791161007f578063ea3a149911610059578063ea3a1499146103c4578063f2613269146103f1578063fe1881841461040657600080fd5b8063ba946d7914610363578063c6944fa014610379578063dd64e5341461038e57600080fd5b806396c85ef3116100b057806396c85ef31461030a5780639b89470314610339578063a88f46721461034e57600080fd5b806371827b7b146102d857806391d8b14e146102ed57806393a563b5146102f557600080fd5b80634665096d1161013857806350b447121161011257806350b44712146102655780635a58acdd1461029d5780636032a4f9146102bd57600080fd5b80634665096d146102185780634788af7c1461022e5780634ed026221461024357600080fd5b80630fb5a6b4116101695780630fb5a6b4146101d05780631209b1f6146101e657806335580df21461020157600080fd5b806306f7f3bf146101855780630789c607146101ae575b600080fd5b34801561019157600080fd5b5061019b60045481565b6040519081526020015b60405180910390f35b3480156101ba57600080fd5b503360009081526005602052604090205461019b565b3480156101dc57600080fd5b5061019b61070881565b3480156101f257600080fd5b5061019b662386f26fc1000081565b34801561020d57600080fd5b50610216610426565b005b34801561022457600080fd5b5061019b60005481565b34801561023a57600080fd5b506102166104cd565b34801561024f57600080fd5b506102586106e1565b6040516101a59190610ced565b34801561027157600080fd5b50610285610280366004610d3a565b610743565b6040516001600160a01b0390911681526020016101a5565b3480156102a957600080fd5b50600154610285906001600160a01b031681565b3480156102c957600080fd5b5061019b66038d7ea4c6800081565b3480156102e457600080fd5b5061021661076d565b61021661080c565b34801561030157600080fd5b5061019b610948565b34801561031657600080fd5b5033600090815260056020526040902054151560405190151581526020016101a5565b34801561034557600080fd5b5061019b606481565b34801561035a57600080fd5b5061021661095e565b34801561036f57600080fd5b5061019b60025481565b34801561038557600080fd5b5061019b610a82565b34801561039a57600080fd5b5061019b6103a9366004610d53565b6001600160a01b031660009081526005602052604090205490565b3480156103d057600080fd5b5061019b6103df366004610d53565b60056020526000908152604090205481565b3480156103fd57600080fd5b50610216610a9a565b34801561041257600080fd5b50600354610285906001600160a01b031681565b6001546001600160a01b031633146104905760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b60648201526084015b60405180910390fd5b600280546000918290556040513392839183156108fc0291849190818181858888f193505050501580156104c8573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146105325760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b6064820152608401610487565b6006546105815760405162461bcd60e51b815260206004820152601960248201527f4e6f207469636b657473207765726520707572636861736564000000000000006044820152606401610487565b6006546000906105919043610d99565b604080514260208201529140908201819052915060009060600160408051601f1981840301815291905280516020909101206006549091506000906105d69083610dc8565b90506000600682815481106105ed576105ed610ddc565b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169182179055905061063e66038d7ea4c68000662386f26fc10000610d99565b60065461064b9190610df2565b6001600160a01b03821660009081526005602052604081208054909190610673908490610e09565b90915550506001600160a01b0381166000908152600560205260409020546004556006546106a99066038d7ea4c6800090610df2565b600260008282546106ba9190610e09565b909155506106cc905060066000610cb3565b6106d861070842610e09565b60005550505050565b6060600680548060200260200160405190810160405280929190818152602001828054801561073957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161071b575b5050505050905090565b6006818154811061075357600080fd5b6000918252602090912001546001600160a01b0316905081565b336000908152600560205260409020546107c95760405162461bcd60e51b815260206004820152601660248201527f43616c6c6572206973206e6f7420612077696e6e6572000000000000000000006044820152606401610487565b3360008181526005602052604080822080549083905590519091839183156108fc0291849190818181858888f193505050501580156104c8573d6000803e3d6000fd5b61081d662386f26fc1000034610dc8565b1561082e662386f26fc10000610b92565b60405160200161083e9190610e40565b6040516020818303038152906040529061086b5760405162461bcd60e51b81526004016104879190610eac565b50600061087f662386f26fc1000034610edf565b9050610889610948565b8111156108d85760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768207469636b65747320617661696c61626c652e0000006044820152606401610487565b60005b8181101561094457600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01805473ffffffffffffffffffffffffffffffffffffffff1916331790558061093c81610ef3565b9150506108db565b5050565b600654600090610959906064610d99565b905090565b6000544210156109b05760405162461bcd60e51b815260206004820152601b60248201527f746865206c6f7474657279206e6f7420657870697265642079657400000000006044820152606401610487565b60005b600654811015610a73576000600682815481106109d2576109d2610ddc565b6000918252602082200154600680546001600160a01b03909216935090849081106109ff576109ff610ddc565b60009182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393841617905560405191831691662386f26fc100009082818181858883f19350505050158015610a5e573d6000803e3d6000fd5b50508080610a6b90610ef3565b9150506109b3565b50610a8060066000610cb3565b565b60065460009061095990662386f26fc1000090610df2565b6001546001600160a01b03163314610aff5760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420746865206c6f7474657279206f706572617460448201526137b960f11b6064820152608401610487565b60065415610b755760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f74205265737461727420447261772061732044726177206973206960448201527f6e20706c617900000000000000000000000000000000000000000000000000006064820152608401610487565b610b8160066000610cb3565b610b8d61070842610e09565b600055565b606081600003610bb95750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610be35780610bcd81610ef3565b9150610bdc9050600a83610edf565b9150610bbd565b60008167ffffffffffffffff811115610bfe57610bfe610f0c565b6040519080825280601f01601f191660200182016040528015610c28576020820181803683370190505b5090505b8415610cab57610c3d600183610d99565b9150610c4a600a86610dc8565b610c55906030610e09565b60f81b818381518110610c6a57610c6a610ddc565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610ca4600a86610edf565b9450610c2c565b949350505050565b5080546000825590600052602060002090810190610cd19190610cd4565b50565b5b80821115610ce95760008155600101610cd5565b5090565b6020808252825182820181905260009190848201906040850190845b81811015610d2e5783516001600160a01b031683529284019291840191600101610d09565b50909695505050505050565b600060208284031215610d4c57600080fd5b5035919050565b600060208284031215610d6557600080fd5b81356001600160a01b0381168114610d7c57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610dac57610dac610d83565b92915050565b634e487b7160e01b600052601260045260246000fd5b600082610dd757610dd7610db2565b500690565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610dac57610dac610d83565b80820180821115610dac57610dac610d83565b60005b83811015610e37578181015183820152602001610e1f565b50506000910152565b7f7468652076616c7565206d757374206265206d756c7469706c65206f66200000815260008251610e7881601e850160208701610e1c565b7f2045746865720000000000000000000000000000000000000000000000000000601e939091019283015250602401919050565b6020815260008251806020840152610ecb816040850160208701610e1c565b601f01601f19169190910160400192915050565b600082610eee57610eee610db2565b500490565b600060018201610f0557610f05610d83565b5060010190565b634e487b7160e01b600052604160045260246000fdfea26469706673582212208dbb14e8606fbb027362cab256ca1d5b66d97f16b2e5395a598bb591c009d87564736f6c63430008110033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading