ETH Price: $2,975.68 (-0.49%)
Gas: 7 Gwei

Contract

0x0D6dC2a36C5c3EbD6F9B67Afd18b31C0074089E5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Withdraw Link185278372023-11-08 14:29:11243 days ago1699453751IN
0x0D6dC2a3...0074089E5
0 ETH0.0020999138
Sweep185202302023-11-07 12:58:59244 days ago1699361939IN
0x0D6dC2a3...0074089E5
0 ETH0.0011166930
Take The Last Hi...185195642023-11-07 10:45:35244 days ago1699353935IN
0x0D6dC2a3...0074089E5
0 ETH0.0059317822.51202514
Pay My Dividend185192892023-11-07 9:50:11244 days ago1699350611IN
0x0D6dC2a3...0074089E5
0 ETH0.0014519224.20722944
Pay My Dividend185192682023-11-07 9:45:59244 days ago1699350359IN
0x0D6dC2a3...0074089E5
0 ETH0.000967322.55899719
Pay My Dividend185191722023-11-07 9:26:35244 days ago1699349195IN
0x0D6dC2a3...0074089E5
0 ETH0.0013549922.59107553
Pay My Dividend185191432023-11-07 9:20:23244 days ago1699348823IN
0x0D6dC2a3...0074089E5
0 ETH0.0012861621.44363942
Pay My Dividend185190582023-11-07 9:03:23244 days ago1699347803IN
0x0D6dC2a3...0074089E5
0 ETH0.001008423.51747069
Pay My Dividend185173442023-11-07 3:17:23244 days ago1699327043IN
0x0D6dC2a3...0074089E5
0 ETH0.0009913823.12056164
Take A Vape Hit185119182023-11-06 9:01:47245 days ago1699261307IN
0x0D6dC2a3...0074089E5
0.064 ETH0.0042321633.11579244
Pay My Dividend185118002023-11-06 8:38:11245 days ago1699259891IN
0x0D6dC2a3...0074089E5
0 ETH0.001247320.79563943
Pay My Dividend185109592023-11-06 5:47:47245 days ago1699249667IN
0x0D6dC2a3...0074089E5
0 ETH0.0011441326.68293081
Pay My Dividend185080122023-11-05 19:53:59245 days ago1699214039IN
0x0D6dC2a3...0074089E5
0 ETH0.0008626820.11904083
Pay My Dividend185077772023-11-05 19:06:23245 days ago1699211183IN
0x0D6dC2a3...0074089E5
0 ETH0.0012619529.4305937
Pay My Dividend185077732023-11-05 19:05:35245 days ago1699211135IN
0x0D6dC2a3...0074089E5
0 ETH0.001284429.95426262
Take A Vape Hit185060902023-11-05 13:25:23246 days ago1699190723IN
0x0D6dC2a3...0074089E5
0.063 ETH0.0029780126.90191728
Take A Vape Hit184993392023-11-04 14:43:11247 days ago1699108991IN
0x0D6dC2a3...0074089E5
0.062 ETH0.0018609916.8113005
Pay My Dividend184993362023-11-04 14:42:35247 days ago1699108955IN
0x0D6dC2a3...0074089E5
0 ETH0.0010165116.94789193
Pay My Dividend184965062023-11-04 5:09:59247 days ago1699074599IN
0x0D6dC2a3...0074089E5
0 ETH0.0005313812.39256001
Take A Vape Hit184922792023-11-03 14:58:23248 days ago1699023503IN
0x0D6dC2a3...0074089E5
0.061 ETH0.0043172639
Pay My Dividend184922762023-11-03 14:57:47248 days ago1699023467IN
0x0D6dC2a3...0074089E5
0 ETH0.0020542834.25012053
Pay My Dividend184854042023-11-02 15:52:35249 days ago1698940355IN
0x0D6dC2a3...0074089E5
0 ETH0.0024582140.98456791
Take A Vape Hit184853092023-11-02 15:33:35249 days ago1698939215IN
0x0D6dC2a3...0074089E5
0.06 ETH0.004177637.73843612
Pay My Dividend184851432023-11-02 15:00:11249 days ago1698937211IN
0x0D6dC2a3...0074089E5
0 ETH0.0020195333.6706758
Take A Vape Hit184782392023-11-01 15:46:23250 days ago1698853583IN
0x0D6dC2a3...0074089E5
0.059 ETH0.0034099830.80410665
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
185202302023-11-07 12:58:59244 days ago1699361939
0x0D6dC2a3...0074089E5
0.57686576 ETH
185195682023-11-07 10:46:23244 days ago1699353983
0x0D6dC2a3...0074089E5
0.3453 ETH
185195642023-11-07 10:45:35244 days ago1699353935
0x0D6dC2a3...0074089E5
0.8057 ETH
185192892023-11-07 9:50:11244 days ago1699350611
0x0D6dC2a3...0074089E5
0.01165277 ETH
185192682023-11-07 9:45:59244 days ago1699350359
0x0D6dC2a3...0074089E5
0.01083121 ETH
185191722023-11-07 9:26:35244 days ago1699349195
0x0D6dC2a3...0074089E5
0.00949171 ETH
185191432023-11-07 9:20:23244 days ago1699348823
0x0D6dC2a3...0074089E5
0.00894932 ETH
185190582023-11-07 9:03:23244 days ago1699347803
0x0D6dC2a3...0074089E5
0.01644629 ETH
185173442023-11-07 3:17:23244 days ago1699327043
0x0D6dC2a3...0074089E5
0.01111699 ETH
185118002023-11-06 8:38:11245 days ago1699259891
0x0D6dC2a3...0074089E5
0.01937651 ETH
185109592023-11-06 5:47:47245 days ago1699249667
0x0D6dC2a3...0074089E5
0.00511418 ETH
185080122023-11-05 19:53:59245 days ago1699214039
0x0D6dC2a3...0074089E5
0.00559321 ETH
185077772023-11-05 19:06:23245 days ago1699211183
0x0D6dC2a3...0074089E5
0.0140563 ETH
185077732023-11-05 19:05:35245 days ago1699211135
0x0D6dC2a3...0074089E5
0.01808262 ETH
184993362023-11-04 14:42:35247 days ago1699108955
0x0D6dC2a3...0074089E5
0.03891072 ETH
184965062023-11-04 5:09:59247 days ago1699074599
0x0D6dC2a3...0074089E5
0.01669509 ETH
184922762023-11-03 14:57:47248 days ago1699023467
0x0D6dC2a3...0074089E5
0.03126785 ETH
184854042023-11-02 15:52:35249 days ago1698940355
0x0D6dC2a3...0074089E5
0.02779365 ETH
184851432023-11-02 15:00:11249 days ago1698937211
0x0D6dC2a3...0074089E5
0.01120905 ETH
184698142023-10-31 11:28:59251 days ago1698751739
0x0D6dC2a3...0074089E5
0.01208292 ETH
184625112023-10-30 10:54:59252 days ago1698663299
0x0D6dC2a3...0074089E5
0.01149273 ETH
184586662023-10-29 21:58:35252 days ago1698616715
0x0D6dC2a3...0074089E5
0.00088779 ETH
184553272023-10-29 10:44:47253 days ago1698576287
0x0D6dC2a3...0074089E5
0.01090998 ETH
184461802023-10-28 4:00:35254 days ago1698465635
0x0D6dC2a3...0074089E5
0.01193007 ETH
184457542023-10-28 2:34:47254 days ago1698460487
0x0D6dC2a3...0074089E5
0.00721125 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VapeGame

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 13 : VapeGame.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.19;

import "openzeppelin/token/ERC20/ERC20.sol";
import "openzeppelin/token/ERC721/IERC721.sol";
import "@chainlink/shared/access/ConfirmedOwner.sol";
import "@chainlink/vrf/VRFV2WrapperConsumerBase.sol";

contract VapeGame is ERC20, VRFV2WrapperConsumerBase, ConfirmedOwner {
    // game config params
    uint256 public immutable MIN_INVEST_TICK = 0.001 ether;
    uint256 public immutable VAPE_PRICE_TICK = 0.0005 ether;
    uint256 public immutable DIVIDEND_CONTRIBUTION = 35; // 35%
    uint256 public immutable POT_CONTRIBUTION = 35; // 35%
    uint256 public immutable TREASURY_CONTRIBUTION = 15; // 15%
    uint256 public immutable LOTTO_CONTRIBUTION = 15; // 15%
    uint256 public minInvest = 0.01 ether;
    uint256 public vapeTokenPrice = 0.0005 ether;
    uint256 public immutable ZOOMER_HITS = 20;
    uint256 public immutable MIN_ZOOMER = 10000000 ether;
    uint256 public immutable GAME_TIME;

    // game state
    uint256 public potValueETH = 0;
    uint256 public lottoValueETH = 0;
    uint256 public totalDividendsValueETH = 0;
    uint256 public finalPotValueETH = 0;
    uint256 public finalLottoValueETH = 0;
    address public finalLottoWinner;
    uint256 public collectedFee = 0; // accumulated eth fee
    uint256 public lastPurchasedTime;
    address payable public lastPurchasedAddress;
    mapping(uint256 => address) public hitters;
    mapping(address => uint256) paidDividends;
    uint256 public numHits = 0;
    bool public isPaused = true;

    // whitelisted tokens/nfts
    ERC20 public zoomer;
    address[] public nfts;

    // chainlink stuff
    uint32 callbackGasLimit = 100000;
    uint32 numWords = 1;
    uint16 requestConfirmations = 3;
    address public linkAddress;

    event TookAHit(
        address indexed user,
        uint256 amount,
        uint256 vapeTokenValue,
        uint256 potValueETH,
        uint256 lottoValueETH,
        uint256 totalDividendsValueETH,
        uint256 nextHitPrice
    );
    event GotDividend(address indexed user, uint256 amount, uint256 totalDividendsValueETH);
    event TookTheLastHit(address indexed user, uint256 amount);
    event LottoWon(address indexed user, uint256 amount);

    modifier notPaused() {
        require(!isPaused, "Contract is paused.");
        _;
    }

    constructor(uint256 _gameTime, address _zoomer, address[] memory _nfts, address _linkAddress, address _vrfV2Wrapper)
        ERC20("Vape", "VAPE")
        ConfirmedOwner(msg.sender)
        VRFV2WrapperConsumerBase(_linkAddress, _vrfV2Wrapper)
    {
        GAME_TIME = _gameTime;
        zoomer = ERC20(_zoomer);

        nfts = _nfts;

        lastPurchasedTime = block.timestamp;
        linkAddress = _linkAddress;
    }

    function withdrawLink() external onlyOwner {
        LinkTokenInterface link = LinkTokenInterface(linkAddress);
        require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer");
    }

    function sweep() external onlyOwner {
        require(isPaused, "Can only sweep when paused.");
        potValueETH = 0;
        lottoValueETH = 0;
        totalDividendsValueETH = 0;
        payable(owner()).transfer(address(this).balance);
    }

    function startGame() external onlyOwner {
        isPaused = false;
        lastPurchasedTime = block.timestamp;
    }

    function hasEnoughZoomer(address user) public view returns (bool) {
        return zoomer.balanceOf(user) >= MIN_ZOOMER;
    }

    function hasNft(address user) public view returns (bool) {
        for (uint256 i = 0; i < nfts.length; i++) {
            if (IERC721(nfts[i]).balanceOf(user) > 0) {
                return true;
            }
        }
        return false;
    }

    function takeAVapeHit() public payable notPaused {
        require(msg.value >= minInvest, "ETH value below min invest");
        require((block.timestamp - lastPurchasedTime) <= GAME_TIME, "Time is over, pot can be claimed by winner.");
        if (numHits < ZOOMER_HITS) {
            require(
                hasEnoughZoomer(msg.sender) || hasNft(msg.sender),
                "You need at least MIN_ZOOMER or a whitelisted NFT to play the game."
            );
        }

        hitters[numHits] = msg.sender;
        numHits++;

        uint256 amount = _processEtherReceived(msg.value);

        uint256 vapetokenvalue = (amount * 1e18) / vapeTokenPrice;

        lastPurchasedTime = block.timestamp;
        lastPurchasedAddress = payable(msg.sender);

        minInvest = minInvest + MIN_INVEST_TICK;
        vapeTokenPrice = vapeTokenPrice + VAPE_PRICE_TICK;

        _mint(msg.sender, vapetokenvalue);
        emit TookAHit(msg.sender, amount, vapetokenvalue, potValueETH, lottoValueETH, totalDividendsValueETH, minInvest);
    }

    function getMyDividend(address useraddress) public view returns (uint256) {
        uint256 userbalance = balanceOf(useraddress);

        uint256 share = (totalDividendsValueETH * userbalance) / totalSupply() - paidDividends[useraddress];
        return share;
    }

    function payMyDividend() public {
        require(getMyDividend(msg.sender) > 0, "No dividend for payout");
        uint256 remainingDividend = getMyDividend(msg.sender);
        paidDividends[msg.sender] += remainingDividend;
        payable(msg.sender).transfer(remainingDividend);
        emit GotDividend(msg.sender, remainingDividend, totalDividendsValueETH);
    }

    function paydDevFee() public onlyOwner {
        payable(owner()).transfer(collectedFee);
        collectedFee = 0;
    }

    function takeTheLastHit() public notPaused {
        require((block.timestamp >= lastPurchasedTime), "No.");
        require((block.timestamp - lastPurchasedTime) > GAME_TIME, "Time is not over yet, countdown still running.");
        lastPurchasedAddress.transfer(potValueETH);
        emit TookTheLastHit(lastPurchasedAddress, potValueETH);
        finalPotValueETH = potValueETH;
        potValueETH = 0;
        isPaused = true;
        requestRandomness(callbackGasLimit, requestConfirmations, numWords);
    }

    function _processEtherReceived(uint256 _amountIn) internal returns (uint256 amountOut) {
        uint256 _dividend = (_amountIn * DIVIDEND_CONTRIBUTION * 1000) / 100000;
        uint256 _pot = (_amountIn * POT_CONTRIBUTION * 1000) / 100000;
        uint256 _treasury = (_amountIn * TREASURY_CONTRIBUTION * 1000) / 100000;
        uint256 _lotto = _amountIn - _dividend - _pot - _treasury;

        // amountOut is dividend and pot together
        amountOut = _dividend + _pot;

        collectedFee += _treasury;
        lottoValueETH += _lotto;
        potValueETH += _pot;
        totalDividendsValueETH += _dividend;
    }

    function fulfillRandomWords(uint256, /*_requestId*/ uint256[] memory _randomWords) internal override {
        uint256 randomnumber = _randomWords[0] % numHits;
        address winner = hitters[randomnumber];
        payable(winner).transfer(lottoValueETH);
        emit LottoWon(winner, lottoValueETH);
        finalLottoValueETH = lottoValueETH;
        lottoValueETH = 0;
        finalLottoWinner = winner;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);
        require((msg.sender == owner() || from == address(0)), "You are not the owner, only owner can transfer tokens.");
    }

    receive() external payable {
        _processEtherReceived(msg.value);
    }
}

File 2 of 13 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

File 3 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 4 of 13 : ConfirmedOwner.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ConfirmedOwnerWithProposal.sol";

/**
 * @title The ConfirmedOwner contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
  constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}

File 5 of 13 : VRFV2WrapperConsumerBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../shared/interfaces/LinkTokenInterface.sol";
import "../interfaces/VRFV2WrapperInterface.sol";

/** *******************************************************************************
 * @notice Interface for contracts using VRF randomness through the VRF V2 wrapper
 * ********************************************************************************
 * @dev PURPOSE
 *
 * @dev Create VRF V2 requests without the need for subscription management. Rather than creating
 * @dev and funding a VRF V2 subscription, a user can use this wrapper to create one off requests,
 * @dev paying up front rather than at fulfillment.
 *
 * @dev Since the price is determined using the gas price of the request transaction rather than
 * @dev the fulfillment transaction, the wrapper charges an additional premium on callback gas
 * @dev usage, in addition to some extra overhead costs associated with the VRFV2Wrapper contract.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFV2WrapperConsumerBase. The consumer must be funded
 * @dev with enough LINK to make the request, otherwise requests will revert. To request randomness,
 * @dev call the 'requestRandomness' function with the desired VRF parameters. This function handles
 * @dev paying for the request based on the current pricing.
 *
 * @dev Consumers must implement the fullfillRandomWords function, which will be called during
 * @dev fulfillment with the randomness result.
 */
abstract contract VRFV2WrapperConsumerBase {
  LinkTokenInterface internal immutable LINK;
  VRFV2WrapperInterface internal immutable VRF_V2_WRAPPER;

  /**
   * @param _link is the address of LinkToken
   * @param _vrfV2Wrapper is the address of the VRFV2Wrapper contract
   */
  constructor(address _link, address _vrfV2Wrapper) {
    LINK = LinkTokenInterface(_link);
    VRF_V2_WRAPPER = VRFV2WrapperInterface(_vrfV2Wrapper);
  }

  /**
   * @dev Requests randomness from the VRF V2 wrapper.
   *
   * @param _callbackGasLimit is the gas limit that should be used when calling the consumer's
   *        fulfillRandomWords function.
   * @param _requestConfirmations is the number of confirmations to wait before fulfilling the
   *        request. A higher number of confirmations increases security by reducing the likelihood
   *        that a chain re-org changes a published randomness outcome.
   * @param _numWords is the number of random words to request.
   *
   * @return requestId is the VRF V2 request ID of the newly created randomness request.
   */
  function requestRandomness(
    uint32 _callbackGasLimit,
    uint16 _requestConfirmations,
    uint32 _numWords
  ) internal returns (uint256 requestId) {
    LINK.transferAndCall(
      address(VRF_V2_WRAPPER),
      VRF_V2_WRAPPER.calculateRequestPrice(_callbackGasLimit),
      abi.encode(_callbackGasLimit, _requestConfirmations, _numWords)
    );
    return VRF_V2_WRAPPER.lastRequestId();
  }

  /**
   * @notice fulfillRandomWords handles the VRF V2 wrapper response. The consuming contract must
   * @notice implement it.
   *
   * @param _requestId is the VRF V2 request ID.
   * @param _randomWords is the randomness result.
   */
  function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) internal virtual;

  function rawFulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords) external {
    require(msg.sender == address(VRF_V2_WRAPPER), "only VRF V2 wrapper can fulfill");
    fulfillRandomWords(_requestId, _randomWords);
  }
}

File 6 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 7 of 13 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 8 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 9 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 10 of 13 : ConfirmedOwnerWithProposal.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "../interfaces/IOwnable.sol";

/**
 * @title The ConfirmedOwner contract
 * @notice A contract with helpers for basic contract ownership.
 */
contract ConfirmedOwnerWithProposal is IOwnable {
  address private s_owner;
  address private s_pendingOwner;

  event OwnershipTransferRequested(address indexed from, address indexed to);
  event OwnershipTransferred(address indexed from, address indexed to);

  constructor(address newOwner, address pendingOwner) {
    require(newOwner != address(0), "Cannot set owner to zero");

    s_owner = newOwner;
    if (pendingOwner != address(0)) {
      _transferOwnership(pendingOwner);
    }
  }

  /**
   * @notice Allows an owner to begin transferring ownership to a new address,
   * pending.
   */
  function transferOwnership(address to) public override onlyOwner {
    _transferOwnership(to);
  }

  /**
   * @notice Allows an ownership transfer to be completed by the recipient.
   */
  function acceptOwnership() external override {
    require(msg.sender == s_pendingOwner, "Must be proposed owner");

    address oldOwner = s_owner;
    s_owner = msg.sender;
    s_pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /**
   * @notice Get the current owner
   */
  function owner() public view override returns (address) {
    return s_owner;
  }

  /**
   * @notice validate, transfer ownership, and emit relevant events
   */
  function _transferOwnership(address to) private {
    require(to != msg.sender, "Cannot transfer to self");

    s_pendingOwner = to;

    emit OwnershipTransferRequested(s_owner, to);
  }

  /**
   * @notice validate access
   */
  function _validateOwnership() internal view {
    require(msg.sender == s_owner, "Only callable by owner");
  }

  /**
   * @notice Reverts if called by anyone other than the contract owner.
   */
  modifier onlyOwner() {
    _validateOwnership();
    _;
  }
}

File 11 of 13 : LinkTokenInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success);

  function transferFrom(address from, address to, uint256 value) external returns (bool success);
}

File 12 of 13 : VRFV2WrapperInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface VRFV2WrapperInterface {
  /**
   * @return the request ID of the most recent VRF V2 request made by this wrapper. This should only
   * be relied option within the same transaction that the request was made.
   */
  function lastRequestId() external view returns (uint256);

  /**
   * @notice Calculates the price of a VRF request with the given callbackGasLimit at the current
   * @notice block.
   *
   * @dev This function relies on the transaction gas price which is not automatically set during
   * @dev simulation. To estimate the price at a specific gas price, use the estimatePrice function.
   *
   * @param _callbackGasLimit is the gas limit used to estimate the price.
   */
  function calculateRequestPrice(uint32 _callbackGasLimit) external view returns (uint256);

  /**
   * @notice Estimates the price of a VRF request with a specific gas limit and gas price.
   *
   * @dev This is a convenience function that can be called in simulation to better understand
   * @dev pricing.
   *
   * @param _callbackGasLimit is the gas limit used to estimate the price.
   * @param _requestGasPriceWei is the gas price in wei used for the estimation.
   */
  function estimateRequestPrice(uint32 _callbackGasLimit, uint256 _requestGasPriceWei) external view returns (uint256);
}

File 13 of 13 : IOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IOwnable {
  function owner() external returns (address);

  function transferOwnership(address recipient) external;

  function acceptOwnership() external;
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "@chainlink/=lib/chainlink/contracts/src/v0.8/",
    "chainlink/=lib/chainlink/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_gameTime","type":"uint256"},{"internalType":"address","name":"_zoomer","type":"address"},{"internalType":"address[]","name":"_nfts","type":"address[]"},{"internalType":"address","name":"_linkAddress","type":"address"},{"internalType":"address","name":"_vrfV2Wrapper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDividendsValueETH","type":"uint256"}],"name":"GotDividend","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LottoWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vapeTokenValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"potValueETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lottoValueETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDividendsValueETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextHitPrice","type":"uint256"}],"name":"TookAHit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TookTheLastHit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DIVIDEND_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAME_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOTTO_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_INVEST_TICK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ZOOMER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POT_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VAPE_PRICE_TICK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZOOMER_HITS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalLottoValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalLottoWinner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalPotValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"useraddress","type":"address"}],"name":"getMyDividend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasEnoughZoomer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasNft","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hitters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPurchasedAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPurchasedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lottoValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minInvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nfts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numHits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payMyDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paydDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"potValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"},{"internalType":"uint256[]","name":"_randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeAVapeHit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"takeTheLastHit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDividendsValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vapeTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zoomer","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101e060405266038d7ea4c6800060c0526601c6bf5263400060e0819052602361010081905261012052600f610140819052610160819052662386f26fc1000060075560089190915560146101808190526a084595161401484a0000006101a05260006009819055600a819055600b819055600c819055600d81905591829055556015805460ff1916600117905560178054680300000001000186a06001600160501b0319909116179055348015620000b757600080fd5b5060405162002b7738038062002b77833981016040819052620000da91620003b6565b338060008484604051806040016040528060048152602001635661706560e01b815250604051806040016040528060048152602001635641504560e01b81525081600390816200012b91906200055c565b5060046200013a82826200055c565b5050506001600160a01b03918216608052811660a0528216620001a45760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384811691909117909155811615620001d757620001d78162000256565b5050506101c085905260158054610100600160a81b0319166101006001600160a01b0387160217905582516200021590601690602086019062000302565b505042601055601780546001600160a01b039092166a010000000000000000000002600160501b600160f01b03199092169190911790555062000628915050565b336001600160a01b03821603620002b05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200019b565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b8280548282559060005260206000209081019282156200035a579160200282015b828111156200035a57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000323565b50620003689291506200036c565b5090565b5b808211156200036857600081556001016200036d565b80516001600160a01b03811681146200039b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a08688031215620003cf57600080fd5b855194506020620003e281880162000383565b60408801519095506001600160401b03808211156200040057600080fd5b818901915089601f8301126200041557600080fd5b8151818111156200042a576200042a620003a0565b8060051b604051601f19603f83011681018181108582111715620004525762000452620003a0565b60405291825284820192508381018501918c8311156200047157600080fd5b938501935b828510156200049a576200048a8562000383565b8452938501939285019262000476565b809850505050505050620004b16060870162000383565b9150620004c16080870162000383565b90509295509295909350565b600181811c90821680620004e257607f821691505b6020821081036200050357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200055757600081815260208120601f850160051c81016020861015620005325750805b601f850160051c820191505b8181101562000553578281556001016200053e565b5050505b505050565b81516001600160401b03811115620005785762000578620003a0565b6200059081620005898454620004cd565b8462000509565b602080601f831160018114620005c85760008415620005af5750858301515b600019600386901b1c1916600185901b17855562000553565b600085815260208120601f198616915b82811015620005f957888601518255948401946001909101908401620005d8565b5085821015620006185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c05161247b620006fc600039600081816108ae015281816111e201526116e101526000818161064901526115e20152600081816105df01526112730152600061040801526000818161030f0152610a3701526000818161087a01526109ef0152600081816106e601526109a701526000818161077801526113e801526000818161067d01526113b7015260008181610c1301528181611df40152611efd01526000611dca015261247b6000f3fe6080604052600436106102e85760003560e01c806379ba509711610190578063b187bd26116100dc578063d914221d11610095578063e7fcf03c1161006f578063e7fcf03c1461093a578063e811f50a14610950578063e96317ad14610966578063f2fde38b1461097b57600080fd5b8063d914221d146108e5578063dd62ed3e146108fa578063e071082b1461091a57600080fd5b8063b187bd2614610830578063b5ff29c71461084a578063bcbccd8214610860578063d357763714610868578063d575c06d1461089c578063d65ab5f2146108d057600080fd5b806395d89b4111610149578063a4847dec11610123578063a4847dec146107ba578063a89c223e146107da578063a9059cbb146107fa578063ae4ba0d51461081a57600080fd5b806395d89b41146107515780639c7119a814610766578063a457c2d71461079a57600080fd5b806379ba50971461069f57806381299120146106b4578063845f4c97146106d45780638da5cb5b146107085780638dc654a214610726578063902f6dc21461073b57600080fd5b8063313ce5671161024f578063629e8a371161020857806370807489116101e257806370807489146105cd57806370a082311461060157806375f741a71461063757806378c115631461066b57600080fd5b8063629e8a371461056b57806362c629dc1461058157806363fd9e38146105b757600080fd5b8063313ce567146104bf57806335faa416146104db57806339509351146104f05780633ce37c5b1461051057806347541b53146105355780634ed7ff631461054b57600080fd5b80631fe543e3116102a15780631fe543e3146103d657806320421162146103f6578063235cea981461042a57806323b872dd14610469578063265aa621146104895780632fa39ba6146104a957600080fd5b806302b86d11146102fd5780630532bc4a1461034457806306fdde0314610359578063095ea7b31461037b5780630c155321146103ab57806318160ddd146103c157600080fd5b366102f8576102f63461099b565b005b600080fd5b34801561030957600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561035057600080fd5b506102f6610b10565b34801561036557600080fd5b5061036e610b5c565b60405161033b91906120fd565b34801561038757600080fd5b5061039b610396366004612133565b610bee565b604051901515815260200161033b565b3480156103b757600080fd5b50610331600c5481565b3480156103cd57600080fd5b50600254610331565b3480156103e257600080fd5b506102f66103f1366004612173565b610c08565b34801561040257600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b34801561043657600080fd5b5060175461045190600160501b90046001600160a01b031681565b6040516001600160a01b03909116815260200161033b565b34801561047557600080fd5b5061039b61048436600461223d565b610c93565b34801561049557600080fd5b506104516104a4366004612279565b610cb7565b3480156104b557600080fd5b50610331600b5481565b3480156104cb57600080fd5b506040516012815260200161033b565b3480156104e757600080fd5b506102f6610ce1565b3480156104fc57600080fd5b5061039b61050b366004612133565b610d91565b34801561051c57600080fd5b506015546104519061010090046001600160a01b031681565b34801561054157600080fd5b5061033160145481565b34801561055757600080fd5b5061039b610566366004612292565b610db3565b34801561057757600080fd5b5061033160105481565b34801561058d57600080fd5b5061045161059c366004612279565b6012602052600090815260409020546001600160a01b031681565b3480156105c357600080fd5b5061033160075481565b3480156105d957600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b34801561060d57600080fd5b5061033161061c366004612292565b6001600160a01b031660009081526020819052604090205490565b34801561064357600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b34801561067757600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ab57600080fd5b506102f6610e77565b3480156106c057600080fd5b50600e54610451906001600160a01b031681565b3480156106e057600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b34801561071457600080fd5b506005546001600160a01b0316610451565b34801561073257600080fd5b506102f6610f25565b34801561074757600080fd5b50610331600a5481565b34801561075d57600080fd5b5061036e61105b565b34801561077257600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a657600080fd5b5061039b6107b5366004612133565b61106a565b3480156107c657600080fd5b506103316107d5366004612292565b6110e5565b3480156107e657600080fd5b50601154610451906001600160a01b031681565b34801561080657600080fd5b5061039b610815366004612133565b611137565b34801561082657600080fd5b5061033160085481565b34801561083c57600080fd5b5060155461039b9060ff1681565b34801561085657600080fd5b50610331600d5481565b6102f6611145565b34801561087457600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b3480156108a857600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000081565b3480156108dc57600080fd5b506102f6611480565b3480156108f157600080fd5b506102f6611498565b34801561090657600080fd5b506103316109153660046122ad565b611592565b34801561092657600080fd5b5061039b610935366004612292565b6115bd565b34801561094657600080fd5b5061033160095481565b34801561095c57600080fd5b50610331600f5481565b34801561097257600080fd5b506102f661165e565b34801561098757600080fd5b506102f6610996366004612292565b61183c565b600080620186a06109cc7f0000000000000000000000000000000000000000000000000000000000000000856122f6565b6109d8906103e86122f6565b6109e29190612323565b90506000620186a0610a147f0000000000000000000000000000000000000000000000000000000000000000866122f6565b610a20906103e86122f6565b610a2a9190612323565b90506000620186a0610a5c7f0000000000000000000000000000000000000000000000000000000000000000876122f6565b610a68906103e86122f6565b610a729190612323565b905060008183610a828689612337565b610a8c9190612337565b610a969190612337565b9050610aa2838561234a565b945081600f6000828254610ab6919061234a565b9250508190555080600a6000828254610acf919061234a565b925050819055508260096000828254610ae8919061234a565b9250508190555083600b6000828254610b01919061234a565b90915550949695505050505050565b610b1861184d565b600554600f546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610b54573d6000803e3d6000fd5b506000600f55565b606060038054610b6b9061235d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b979061235d565b8015610be45780601f10610bb957610100808354040283529160200191610be4565b820191906000526020600020905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b600033610bfc8185856118a2565b60019150505b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c855760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792056524620563220777261707065722063616e2066756c66696c6c0060448201526064015b60405180910390fd5b610c8f82826119c6565b5050565b600033610ca1858285611ab0565b610cac858585611b2a565b506001949350505050565b60168181548110610cc757600080fd5b6000918252602090912001546001600160a01b0316905081565b610ce961184d565b60155460ff16610d3b5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c79207377656570207768656e207061757365642e00000000006044820152606401610c7c565b60006009819055600a819055600b556005546001600160a01b03166001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610d8e573d6000803e3d6000fd5b50565b600033610bfc818585610da48383611592565b610dae919061234a565b6118a2565b6000805b601654811015610e6e57600060168281548110610dd657610dd6612397565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d91906123ad565b1115610e5c5750600192915050565b80610e66816123c6565b915050610db7565b50600092915050565b6006546001600160a01b03163314610eca5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610c7c565b600580546001600160a01b0319808216339081179093556006805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610f2d61184d565b6017546040516370a0823160e01b8152306004820152600160501b9091046001600160a01b031690819063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab91906123ad565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a91906123df565b610d8e5760405162461bcd60e51b81526020600482015260126024820152712ab730b13632903a37903a3930b739b332b960711b6044820152606401610c7c565b606060048054610b6b9061235d565b600033816110788286611592565b9050838110156110d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c7c565b610cac82868684036118a2565b6001600160a01b03811660009081526020818152604080832054601390925282205460025483919083600b5461111b91906122f6565b6111259190612323565b61112f9190612337565b949350505050565b600033610bfc818585611b2a565b60155460ff161561118e5760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903830bab9b2b21760691b6044820152606401610c7c565b6007543410156111e05760405162461bcd60e51b815260206004820152601a60248201527f4554482076616c75652062656c6f77206d696e20696e766573740000000000006044820152606401610c7c565b7f00000000000000000000000000000000000000000000000000000000000000006010544261120f9190612337565b11156112715760405162461bcd60e51b815260206004820152602b60248201527f54696d65206973206f7665722c20706f742063616e20626520636c61696d656460448201526a10313c903bb4b73732b91760a91b6064820152608401610c7c565b7f00000000000000000000000000000000000000000000000000000000000000006014541015611331576112a4336115bd565b806112b357506112b333610db3565b6113315760405162461bcd60e51b815260206004820152604360248201527f596f75206e656564206174206c65617374204d494e5f5a4f4f4d4552206f722060448201527f612077686974656c6973746564204e465420746f20706c61792074686520676160648201526236b29760e91b608482015260a401610c7c565b60148054600090815260126020526040812080546001600160a01b0319163317905581549190611360836123c6565b919050555060006113703461099b565b9050600060085482670de0b6b3a764000061138b91906122f6565b6113959190612323565b42601055601180546001600160a01b031916331790556007549091506113dc907f00000000000000000000000000000000000000000000000000000000000000009061234a565b60075560085461140d907f00000000000000000000000000000000000000000000000000000000000000009061234a565b60085561141a3382611cd9565b600954600a54600b546007546040805187815260208101879052908101949094526060840192909252608083015260a082015233907f8ba1656c325a14f30253080e90c36bc81768d8e6e4ef29d9d91c255a662eca479060c00160405180910390a25050565b61148861184d565b6015805460ff1916905542601055565b60006114a3336110e5565b116114e95760405162461bcd60e51b8152602060048201526016602482015275139bc8191a5d9a59195b9908199bdc881c185e5bdd5d60521b6044820152606401610c7c565b60006114f4336110e5565b3360009081526013602052604081208054929350839290919061151890849061234a565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561154a573d6000803e3d6000fd5b50600b5460405133917fbf9a7c73f2065a274d28fa0b44faeb27659be93eedefedd95a8cb2fa16f83da69161158791858252602082015260400190565b60405180910390a250565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6015546040516370a0823160e01b81526001600160a01b0383811660048301526000927f000000000000000000000000000000000000000000000000000000000000000092610100909104909116906370a0823190602401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165691906123ad565b101592915050565b60155460ff16156116a75760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903830bab9b2b21760691b6044820152606401610c7c565b6010544210156116df5760405162461bcd60e51b815260206004820152600360248201526227379760e91b6044820152606401610c7c565b7f00000000000000000000000000000000000000000000000000000000000000006010544261170e9190612337565b116117725760405162461bcd60e51b815260206004820152602e60248201527f54696d65206973206e6f74206f766572207965742c20636f756e74646f776e2060448201526d39ba34b63610393ab73734b7339760911b6064820152608401610c7c565b6011546009546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156117ae573d6000803e3d6000fd5b506011546009546040519081526001600160a01b03909116907fae29b17cdc8185857c2e9da966baf879e54a5b6ed9fe1b40abba585110d99b399060200160405180910390a260098054600c55600090556015805460ff19166001179055601754610d8e9063ffffffff8082169161ffff680100000000000000008204169164010000000090910416611da4565b61184461184d565b610d8e81611f7d565b6005546001600160a01b031633146118a05760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610c7c565b565b6001600160a01b0383166119045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c7c565b6001600160a01b0382166119655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c7c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000601454826000815181106119de576119de612397565b60200260200101516119f09190612401565b60008181526012602052604080822054600a5491519394506001600160a01b031692839282156108fc02929190818181858888f19350505050158015611a3a573d6000803e3d6000fd5b50806001600160a01b03167fc877d2a6c36bc8b2142f64847aa748d503babf9abfc1889fb06e782ba7c837d0600a54604051611a7891815260200190565b60405180910390a2600a8054600d5560009055600e80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6000611abc8484611592565b90506000198114611b245781811015611b175760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c7c565b611b2484848484036118a2565b50505050565b6001600160a01b038316611b8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c7c565b6001600160a01b038216611bf05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c7c565b611bfb838383612027565b6001600160a01b03831660009081526020819052604090205481811015611c735760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c7c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b24565b6001600160a01b038216611d2f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c7c565b611d3b60008383612027565b8060026000828254611d4d919061234a565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516310c1b4d560e21b815263ffffffff841660048201526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691634000aea0917f00000000000000000000000000000000000000000000000000000000000000009190821690634306d35490602401602060405180830381865afa158015611e3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6291906123ad565b6040805163ffffffff808b16602083015261ffff8a169282019290925290871660608201526080016040516020818303038152906040526040518463ffffffff1660e01b8152600401611eb793929190612415565b6020604051808303816000875af1158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa91906123df565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc2a88c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f91906123ad565b336001600160a01b03821603611fd55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c7c565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b6005546001600160a01b031633148061204757506001600160a01b038316155b6120b25760405162461bcd60e51b815260206004820152603660248201527f596f7520617265206e6f7420746865206f776e65722c206f6e6c79206f776e65604482015275391031b0b7103a3930b739b332b9103a37b5b2b7399760511b6064820152608401610c7c565b505050565b6000815180845260005b818110156120dd576020818501810151868301820152016120c1565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061211060208301846120b7565b9392505050565b80356001600160a01b038116811461212e57600080fd5b919050565b6000806040838503121561214657600080fd5b61214f83612117565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561218657600080fd5b8235915060208084013567ffffffffffffffff808211156121a657600080fd5b818601915086601f8301126121ba57600080fd5b8135818111156121cc576121cc61215d565b8060051b604051601f19603f830116810181811085821117156121f1576121f161215d565b60405291825284820192508381018501918983111561220f57600080fd5b938501935b8285101561222d57843584529385019392850192612214565b8096505050505050509250929050565b60008060006060848603121561225257600080fd5b61225b84612117565b925061226960208501612117565b9150604084013590509250925092565b60006020828403121561228b57600080fd5b5035919050565b6000602082840312156122a457600080fd5b61211082612117565b600080604083850312156122c057600080fd5b6122c983612117565b91506122d760208401612117565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c0257610c026122e0565b634e487b7160e01b600052601260045260246000fd5b6000826123325761233261230d565b500490565b81810381811115610c0257610c026122e0565b80820180821115610c0257610c026122e0565b600181811c9082168061237157607f821691505b60208210810361239157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156123bf57600080fd5b5051919050565b6000600182016123d8576123d86122e0565b5060010190565b6000602082840312156123f157600080fd5b8151801515811461211057600080fd5b6000826124105761241061230d565b500690565b60018060a01b038416815282602082015260606040820152600061243c60608301846120b7565b9594505050505056fea2646970667358221220097ed05bf06ee205eccd4f9193a0c62899e1acc90cf82ce87e1557401fe58fc264736f6c6343000815003300000000000000000000000000000000000000000000000000000000000151800000000000000000000000000d505c03d30e65f6e9b4ef88855a47a89e4b767600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca0000000000000000000000005a861794b927983406fce1d062e00b9368d97df60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b852c6b5892256c264cc2c888ea462189154d8d7000000000000000000000000ff72f37aa4eae3b7e1752e25db85b209f12c1a33

Deployed Bytecode

0x6080604052600436106102e85760003560e01c806379ba509711610190578063b187bd26116100dc578063d914221d11610095578063e7fcf03c1161006f578063e7fcf03c1461093a578063e811f50a14610950578063e96317ad14610966578063f2fde38b1461097b57600080fd5b8063d914221d146108e5578063dd62ed3e146108fa578063e071082b1461091a57600080fd5b8063b187bd2614610830578063b5ff29c71461084a578063bcbccd8214610860578063d357763714610868578063d575c06d1461089c578063d65ab5f2146108d057600080fd5b806395d89b4111610149578063a4847dec11610123578063a4847dec146107ba578063a89c223e146107da578063a9059cbb146107fa578063ae4ba0d51461081a57600080fd5b806395d89b41146107515780639c7119a814610766578063a457c2d71461079a57600080fd5b806379ba50971461069f57806381299120146106b4578063845f4c97146106d45780638da5cb5b146107085780638dc654a214610726578063902f6dc21461073b57600080fd5b8063313ce5671161024f578063629e8a371161020857806370807489116101e257806370807489146105cd57806370a082311461060157806375f741a71461063757806378c115631461066b57600080fd5b8063629e8a371461056b57806362c629dc1461058157806363fd9e38146105b757600080fd5b8063313ce567146104bf57806335faa416146104db57806339509351146104f05780633ce37c5b1461051057806347541b53146105355780634ed7ff631461054b57600080fd5b80631fe543e3116102a15780631fe543e3146103d657806320421162146103f6578063235cea981461042a57806323b872dd14610469578063265aa621146104895780632fa39ba6146104a957600080fd5b806302b86d11146102fd5780630532bc4a1461034457806306fdde0314610359578063095ea7b31461037b5780630c155321146103ab57806318160ddd146103c157600080fd5b366102f8576102f63461099b565b005b600080fd5b34801561030957600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000f81565b6040519081526020015b60405180910390f35b34801561035057600080fd5b506102f6610b10565b34801561036557600080fd5b5061036e610b5c565b60405161033b91906120fd565b34801561038757600080fd5b5061039b610396366004612133565b610bee565b604051901515815260200161033b565b3480156103b757600080fd5b50610331600c5481565b3480156103cd57600080fd5b50600254610331565b3480156103e257600080fd5b506102f66103f1366004612173565b610c08565b34801561040257600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000000f81565b34801561043657600080fd5b5060175461045190600160501b90046001600160a01b031681565b6040516001600160a01b03909116815260200161033b565b34801561047557600080fd5b5061039b61048436600461223d565b610c93565b34801561049557600080fd5b506104516104a4366004612279565b610cb7565b3480156104b557600080fd5b50610331600b5481565b3480156104cb57600080fd5b506040516012815260200161033b565b3480156104e757600080fd5b506102f6610ce1565b3480156104fc57600080fd5b5061039b61050b366004612133565b610d91565b34801561051c57600080fd5b506015546104519061010090046001600160a01b031681565b34801561054157600080fd5b5061033160145481565b34801561055757600080fd5b5061039b610566366004612292565b610db3565b34801561057757600080fd5b5061033160105481565b34801561058d57600080fd5b5061045161059c366004612279565b6012602052600090815260409020546001600160a01b031681565b3480156105c357600080fd5b5061033160075481565b3480156105d957600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000001481565b34801561060d57600080fd5b5061033161061c366004612292565b6001600160a01b031660009081526020819052604090205490565b34801561064357600080fd5b506103317f000000000000000000000000000000000000000000084595161401484a00000081565b34801561067757600080fd5b506103317f00000000000000000000000000000000000000000000000000038d7ea4c6800081565b3480156106ab57600080fd5b506102f6610e77565b3480156106c057600080fd5b50600e54610451906001600160a01b031681565b3480156106e057600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000002381565b34801561071457600080fd5b506005546001600160a01b0316610451565b34801561073257600080fd5b506102f6610f25565b34801561074757600080fd5b50610331600a5481565b34801561075d57600080fd5b5061036e61105b565b34801561077257600080fd5b506103317f0000000000000000000000000000000000000000000000000001c6bf5263400081565b3480156107a657600080fd5b5061039b6107b5366004612133565b61106a565b3480156107c657600080fd5b506103316107d5366004612292565b6110e5565b3480156107e657600080fd5b50601154610451906001600160a01b031681565b34801561080657600080fd5b5061039b610815366004612133565b611137565b34801561082657600080fd5b5061033160085481565b34801561083c57600080fd5b5060155461039b9060ff1681565b34801561085657600080fd5b50610331600d5481565b6102f6611145565b34801561087457600080fd5b506103317f000000000000000000000000000000000000000000000000000000000000002381565b3480156108a857600080fd5b506103317f000000000000000000000000000000000000000000000000000000000001518081565b3480156108dc57600080fd5b506102f6611480565b3480156108f157600080fd5b506102f6611498565b34801561090657600080fd5b506103316109153660046122ad565b611592565b34801561092657600080fd5b5061039b610935366004612292565b6115bd565b34801561094657600080fd5b5061033160095481565b34801561095c57600080fd5b50610331600f5481565b34801561097257600080fd5b506102f661165e565b34801561098757600080fd5b506102f6610996366004612292565b61183c565b600080620186a06109cc7f0000000000000000000000000000000000000000000000000000000000000023856122f6565b6109d8906103e86122f6565b6109e29190612323565b90506000620186a0610a147f0000000000000000000000000000000000000000000000000000000000000023866122f6565b610a20906103e86122f6565b610a2a9190612323565b90506000620186a0610a5c7f000000000000000000000000000000000000000000000000000000000000000f876122f6565b610a68906103e86122f6565b610a729190612323565b905060008183610a828689612337565b610a8c9190612337565b610a969190612337565b9050610aa2838561234a565b945081600f6000828254610ab6919061234a565b9250508190555080600a6000828254610acf919061234a565b925050819055508260096000828254610ae8919061234a565b9250508190555083600b6000828254610b01919061234a565b90915550949695505050505050565b610b1861184d565b600554600f546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610b54573d6000803e3d6000fd5b506000600f55565b606060038054610b6b9061235d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b979061235d565b8015610be45780601f10610bb957610100808354040283529160200191610be4565b820191906000526020600020905b815481529060010190602001808311610bc757829003601f168201915b5050505050905090565b600033610bfc8185856118a2565b60019150505b92915050565b336001600160a01b037f0000000000000000000000005a861794b927983406fce1d062e00b9368d97df61614610c855760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792056524620563220777261707065722063616e2066756c66696c6c0060448201526064015b60405180910390fd5b610c8f82826119c6565b5050565b600033610ca1858285611ab0565b610cac858585611b2a565b506001949350505050565b60168181548110610cc757600080fd5b6000918252602090912001546001600160a01b0316905081565b610ce961184d565b60155460ff16610d3b5760405162461bcd60e51b815260206004820152601b60248201527f43616e206f6e6c79207377656570207768656e207061757365642e00000000006044820152606401610c7c565b60006009819055600a819055600b556005546001600160a01b03166001600160a01b03166108fc479081150290604051600060405180830381858888f19350505050158015610d8e573d6000803e3d6000fd5b50565b600033610bfc818585610da48383611592565b610dae919061234a565b6118a2565b6000805b601654811015610e6e57600060168281548110610dd657610dd6612397565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d91906123ad565b1115610e5c5750600192915050565b80610e66816123c6565b915050610db7565b50600092915050565b6006546001600160a01b03163314610eca5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610c7c565b600580546001600160a01b0319808216339081179093556006805490911690556040516001600160a01b03909116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b610f2d61184d565b6017546040516370a0823160e01b8152306004820152600160501b9091046001600160a01b031690819063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab91906123ad565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a91906123df565b610d8e5760405162461bcd60e51b81526020600482015260126024820152712ab730b13632903a37903a3930b739b332b960711b6044820152606401610c7c565b606060048054610b6b9061235d565b600033816110788286611592565b9050838110156110d85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610c7c565b610cac82868684036118a2565b6001600160a01b03811660009081526020818152604080832054601390925282205460025483919083600b5461111b91906122f6565b6111259190612323565b61112f9190612337565b949350505050565b600033610bfc818585611b2a565b60155460ff161561118e5760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903830bab9b2b21760691b6044820152606401610c7c565b6007543410156111e05760405162461bcd60e51b815260206004820152601a60248201527f4554482076616c75652062656c6f77206d696e20696e766573740000000000006044820152606401610c7c565b7f00000000000000000000000000000000000000000000000000000000000151806010544261120f9190612337565b11156112715760405162461bcd60e51b815260206004820152602b60248201527f54696d65206973206f7665722c20706f742063616e20626520636c61696d656460448201526a10313c903bb4b73732b91760a91b6064820152608401610c7c565b7f00000000000000000000000000000000000000000000000000000000000000146014541015611331576112a4336115bd565b806112b357506112b333610db3565b6113315760405162461bcd60e51b815260206004820152604360248201527f596f75206e656564206174206c65617374204d494e5f5a4f4f4d4552206f722060448201527f612077686974656c6973746564204e465420746f20706c61792074686520676160648201526236b29760e91b608482015260a401610c7c565b60148054600090815260126020526040812080546001600160a01b0319163317905581549190611360836123c6565b919050555060006113703461099b565b9050600060085482670de0b6b3a764000061138b91906122f6565b6113959190612323565b42601055601180546001600160a01b031916331790556007549091506113dc907f00000000000000000000000000000000000000000000000000038d7ea4c680009061234a565b60075560085461140d907f0000000000000000000000000000000000000000000000000001c6bf526340009061234a565b60085561141a3382611cd9565b600954600a54600b546007546040805187815260208101879052908101949094526060840192909252608083015260a082015233907f8ba1656c325a14f30253080e90c36bc81768d8e6e4ef29d9d91c255a662eca479060c00160405180910390a25050565b61148861184d565b6015805460ff1916905542601055565b60006114a3336110e5565b116114e95760405162461bcd60e51b8152602060048201526016602482015275139bc8191a5d9a59195b9908199bdc881c185e5bdd5d60521b6044820152606401610c7c565b60006114f4336110e5565b3360009081526013602052604081208054929350839290919061151890849061234a565b9091555050604051339082156108fc029083906000818181858888f1935050505015801561154a573d6000803e3d6000fd5b50600b5460405133917fbf9a7c73f2065a274d28fa0b44faeb27659be93eedefedd95a8cb2fa16f83da69161158791858252602082015260400190565b60405180910390a250565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6015546040516370a0823160e01b81526001600160a01b0383811660048301526000927f000000000000000000000000000000000000000000084595161401484a00000092610100909104909116906370a0823190602401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165691906123ad565b101592915050565b60155460ff16156116a75760405162461bcd60e51b815260206004820152601360248201527221b7b73a3930b1ba1034b9903830bab9b2b21760691b6044820152606401610c7c565b6010544210156116df5760405162461bcd60e51b815260206004820152600360248201526227379760e91b6044820152606401610c7c565b7f00000000000000000000000000000000000000000000000000000000000151806010544261170e9190612337565b116117725760405162461bcd60e51b815260206004820152602e60248201527f54696d65206973206e6f74206f766572207965742c20636f756e74646f776e2060448201526d39ba34b63610393ab73734b7339760911b6064820152608401610c7c565b6011546009546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156117ae573d6000803e3d6000fd5b506011546009546040519081526001600160a01b03909116907fae29b17cdc8185857c2e9da966baf879e54a5b6ed9fe1b40abba585110d99b399060200160405180910390a260098054600c55600090556015805460ff19166001179055601754610d8e9063ffffffff8082169161ffff680100000000000000008204169164010000000090910416611da4565b61184461184d565b610d8e81611f7d565b6005546001600160a01b031633146118a05760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610c7c565b565b6001600160a01b0383166119045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c7c565b6001600160a01b0382166119655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c7c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000601454826000815181106119de576119de612397565b60200260200101516119f09190612401565b60008181526012602052604080822054600a5491519394506001600160a01b031692839282156108fc02929190818181858888f19350505050158015611a3a573d6000803e3d6000fd5b50806001600160a01b03167fc877d2a6c36bc8b2142f64847aa748d503babf9abfc1889fb06e782ba7c837d0600a54604051611a7891815260200190565b60405180910390a2600a8054600d5560009055600e80546001600160a01b0319166001600160a01b0392909216919091179055505050565b6000611abc8484611592565b90506000198114611b245781811015611b175760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c7c565b611b2484848484036118a2565b50505050565b6001600160a01b038316611b8e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c7c565b6001600160a01b038216611bf05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c7c565b611bfb838383612027565b6001600160a01b03831660009081526020819052604090205481811015611c735760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610c7c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611b24565b6001600160a01b038216611d2f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c7c565b611d3b60008383612027565b8060026000828254611d4d919061234a565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516310c1b4d560e21b815263ffffffff841660048201526000906001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca811691634000aea0917f0000000000000000000000005a861794b927983406fce1d062e00b9368d97df69190821690634306d35490602401602060405180830381865afa158015611e3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6291906123ad565b6040805163ffffffff808b16602083015261ffff8a169282019290925290871660608201526080016040516020818303038152906040526040518463ffffffff1660e01b8152600401611eb793929190612415565b6020604051808303816000875af1158015611ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efa91906123df565b507f0000000000000000000000005a861794b927983406fce1d062e00b9368d97df66001600160a01b031663fc2a88c36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f59573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f91906123ad565b336001600160a01b03821603611fd55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c7c565b600680546001600160a01b0319166001600160a01b03838116918217909255600554604051919216907fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae127890600090a350565b6005546001600160a01b031633148061204757506001600160a01b038316155b6120b25760405162461bcd60e51b815260206004820152603660248201527f596f7520617265206e6f7420746865206f776e65722c206f6e6c79206f776e65604482015275391031b0b7103a3930b739b332b9103a37b5b2b7399760511b6064820152608401610c7c565b505050565b6000815180845260005b818110156120dd576020818501810151868301820152016120c1565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061211060208301846120b7565b9392505050565b80356001600160a01b038116811461212e57600080fd5b919050565b6000806040838503121561214657600080fd5b61214f83612117565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561218657600080fd5b8235915060208084013567ffffffffffffffff808211156121a657600080fd5b818601915086601f8301126121ba57600080fd5b8135818111156121cc576121cc61215d565b8060051b604051601f19603f830116810181811085821117156121f1576121f161215d565b60405291825284820192508381018501918983111561220f57600080fd5b938501935b8285101561222d57843584529385019392850192612214565b8096505050505050509250929050565b60008060006060848603121561225257600080fd5b61225b84612117565b925061226960208501612117565b9150604084013590509250925092565b60006020828403121561228b57600080fd5b5035919050565b6000602082840312156122a457600080fd5b61211082612117565b600080604083850312156122c057600080fd5b6122c983612117565b91506122d760208401612117565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610c0257610c026122e0565b634e487b7160e01b600052601260045260246000fd5b6000826123325761233261230d565b500490565b81810381811115610c0257610c026122e0565b80820180821115610c0257610c026122e0565b600181811c9082168061237157607f821691505b60208210810361239157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156123bf57600080fd5b5051919050565b6000600182016123d8576123d86122e0565b5060010190565b6000602082840312156123f157600080fd5b8151801515811461211057600080fd5b6000826124105761241061230d565b500690565b60018060a01b038416815282602082015260606040820152600061243c60608301846120b7565b9594505050505056fea2646970667358221220097ed05bf06ee205eccd4f9193a0c62899e1acc90cf82ce87e1557401fe58fc264736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000d505c03d30e65f6e9b4ef88855a47a89e4b767600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca0000000000000000000000005a861794b927983406fce1d062e00b9368d97df60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000b852c6b5892256c264cc2c888ea462189154d8d7000000000000000000000000ff72f37aa4eae3b7e1752e25db85b209f12c1a33

-----Decoded View---------------
Arg [0] : _gameTime (uint256): 86400
Arg [1] : _zoomer (address): 0x0D505C03d30e65f6e9b4Ef88855a47a89e4b7676
Arg [2] : _nfts (address[]): 0xB852c6b5892256C264Cc2C888eA462189154D8d7,0xFF72F37aA4EAe3B7e1752e25DB85b209f12c1A33
Arg [3] : _linkAddress (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [4] : _vrfV2Wrapper (address): 0x5A861794B927983406fCE1D062e00b9368d97Df6

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [1] : 0000000000000000000000000d505c03d30e65f6e9b4ef88855a47a89e4b7676
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [4] : 0000000000000000000000005a861794b927983406fce1d062e00b9368d97df6
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 000000000000000000000000b852c6b5892256c264cc2c888ea462189154d8d7
Arg [7] : 000000000000000000000000ff72f37aa4eae3b7e1752e25db85b209f12c1a33


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.