账户
0x2a...9d3a
0x2A...9d3A

0x2A...9d3A

$500
此合同的源代码已经过验证!
合同元数据
编译器
0.8.24+commit.e11b9ed9
语言
Solidity
合同源代码
文件 1 的 1:GambitLotteryDailyBundle.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract GambitLotteryDailyBundle {
    address payable public manager;
    address payable[] public players;
    address public nativeToken;
    address public deadAddress=0x000000000000000000000000000000000000dEaD;
    address public lotteryWinner;
    address public usdtAddress=0xdAC17F958D2ee523a2206206994597C13D831ec7;

    mapping(address => uint256) public ownedTickets;

    uint256 public maxTicket=10;
    uint256 public round=1;
    uint256 public countDownTicker=86400; //1 Day
    uint256 public endTime=0;
    uint256 public ticketPrice = 400000000000000000000000; //400000 GAMBIT

    event Deposit(address indexed sender, uint256 amount);
    event Withdraw(address indexed recipient, uint256 amount);
    constructor(address nativeTokenAddress) {
        manager = payable(msg.sender);
        nativeToken = nativeTokenAddress;
    }
    IERC20 token = IERC20(nativeToken);
    IERC20 reward = IERC20(usdtAddress);

    function enter() public {
        require(ownedTickets[msg.sender] <= maxTicket-1, "Maximum Tickets is 10");
        require(block.timestamp <= endTime, "This Round is end !");

        token.transferFrom(msg.sender, deadAddress, ticketPrice);
        ownedTickets[msg.sender] += 1;
        players.push(payable(msg.sender));
    }

    function enterBundle() public {
        require(ownedTickets[msg.sender] <= maxTicket-1, "Maximum Tickets is 10");
        require(block.timestamp <= endTime, "This Round is end !");

        uint256 amount = maxTicket-ownedTickets[msg.sender];
        token.transferFrom(msg.sender, deadAddress, ticketPrice*amount);
        ownedTickets[msg.sender] += 1*amount;
        for (uint i = 0; i<amount; i++){
        players.push(payable(msg.sender));
        }
    }

    function random() private view returns (uint) {
        return uint(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, players)));
    }

    function pickWinner() public restricted {
        require(players.length > 0, "No players in the lottery");
        require(address(this).balance > 0, "Insufficient Balance");

        if (block.timestamp >= endTime) {
            uint index = random() % players.length;
            address payable winner = players[index];
            lotteryWinner = winner;
            reward.transfer(winner, reward.balanceOf(address(this)));

            // Reset players array for the next lottery
            for (uint256 i = 0; i < players.length; i++) {
                address ticketHolders = players[i];
                ownedTickets[ticketHolders] = 0;
            }

            players = new address payable[](0);
            round++;
            endTime=block.timestamp+countDownTicker;
        }
        else {
            require(false, "Countdown Condition Not Met");
        }
    }

    modifier restricted() {
        require(msg.sender == manager, "Only the manager can call this function");
        _;
    }

    function getPlayers() public view returns (address payable[] memory) {
        return players;
    }

    function getManager() public view returns (address) {
        return manager;
    }

    function getWinner() public view returns (address) {
        return lotteryWinner;
    }

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function transferStuckToken(address addy, uint256 amount) public restricted {
        IERC20 stuckToken = IERC20(addy);

        stuckToken.transfer(msg.sender, amount);
    }

    function setTicketPrice(uint256 newPrice) public restricted {
        ticketPrice = newPrice;
    }

    function activateRound() public restricted {
        token = IERC20(nativeToken);
        endTime = block.timestamp + countDownTicker;
    }

    function setNativeTokenAddress(address _nativeToken) public restricted {
        nativeToken = _nativeToken;
        token = IERC20(nativeToken);
    }

    function getNativeTokenAddress() public view returns(IERC20) {
        return token;
    }

    function getTicketAmount(address sender) public view returns (uint) {
        return ownedTickets[sender];
    }
    
    function timeLeft() public view returns (uint256) {
        if (block.timestamp >= endTime) {
            return 0;
        } else {
            return endTime - block.timestamp;
        }
    }

    function getTotalTicketSold() public view returns (uint) {
        uint sold = 0;
        for (uint i = 0; i<players.length; i++){
            sold++;
        }
        return sold;
    }

    function setCountDown(uint256 newCountDown) public restricted {
        countDownTicker = newCountDown;
    }

    function startCountDown() public restricted {
        endTime = block.timestamp+countDownTicker;
    }

    function endRound() public restricted {
        endTime = 0;
    }

    function clearStuckETH() public restricted {
        manager.transfer(address(this).balance);
    }

    receive() external payable {}

    function getNativeTokenBalance() public view returns(uint256){
        return token.balanceOf(address(this));
    }

    function totalBurn() public view returns(uint256) {
        return token.balanceOf(deadAddress);
    }

    function getMaxTicket() public view returns(uint256) {
        return maxTicket;
    }

    function changeMaxTicket(uint256 newMaxTicket) public restricted{
        maxTicket = newMaxTicket;
    }

    function resetRound() public restricted {
        round = 1;
    }

    function changeReward(address newRewardAddress) public restricted {
        reward = IERC20(newRewardAddress);
    }
}
设置
{
  "compilationTarget": {
    "GambitLotteryDailyBundle.sol": "GambitLotteryDailyBundle"
  },
  "evmVersion": "shanghai",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[{"internalType":"address","name":"nativeTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"activateRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTicket","type":"uint256"}],"name":"changeMaxTicket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardAddress","type":"address"}],"name":"changeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"countDownTicker","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enterBundle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTicket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNativeTokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNativeTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlayers","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"getTicketAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTicketSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTicket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ownedTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pickWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resetRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCountDown","type":"uint256"}],"name":"setCountDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nativeToken","type":"address"}],"name":"setNativeTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTicketPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startCountDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ticketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]