Contract 0x52c7b4aa3f67d3533aaf1153430758c702a3594b

 

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0d25f6ac9c4045e350892fb8af6362ad9ab65edd24724aea3edae9f6b9284a6bWithdraw197730812022-08-09 5:04:56173 days 10 hrs ago0x0175c38d00a114bd29fbcaf832e7b1a21033644c IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000109728165 ETH
0x6881a8b469b8f37748af10c351f3289fe35e0caa4cf6058bd1ff26d3d576b280Withdraw105735512022-04-26 10:26:49278 days 4 hrs ago0xad9f9194c68bd83250a534a7da574687e1f102ff IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000229112337 ETH
0x2cc6c6db246896875322e4e8d92753afafb7b37fde87b3d411cfe39ad8de67b8Claim All Reward...105735382022-04-26 10:26:49278 days 4 hrs ago0xad9f9194c68bd83250a534a7da574687e1f102ff IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000195026097 ETH
0xce532b6868613b24620a13c63cdc8ca74c12802028d679a55d0d2802dc50c419Claim All Reward...85106072022-03-24 17:06:07310 days 22 hrs ago0xc74ff56b8400ee7d68204854d3f6da536cf71a22 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000160439418 ETH
0xedc776a9dcdff928d09c7b5312dea4b1032123be67a510c1e793a340406baeebWithdraw77561162022-03-11 20:45:27323 days 18 hrs ago0x6f9bb7e454f5b3eb2310343f0e99269dc2bb8a1d IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000152456589 ETH
0xc619ac767e155e783c467022145375c34e9c3fd29b38f4b73533dc1768f55cc3Claim All Reward...77558602022-03-11 20:41:32323 days 18 hrs ago0x6f9bb7e454f5b3eb2310343f0e99269dc2bb8a1d IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000128929312 ETH
0x4858c1b2b2623ab1febb8e7e3c66ea81563ef5eb2055495772a15ddcdda68901Withdraw64140252022-02-19 23:00:21343 days 16 hrs ago0x949666ee5d1be779801e4a02e90f1a2d9cb1835b IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000338897154 ETH
0xde45de1af9345f8ee4c912fab2410c3cc60e4da25d871031a0258fcd0cc333e1Claim All Reward...57741622022-02-10 6:37:26353 days 8 hrs ago0x98e9db4feafc72d177c77aed8ee97f4df71ea681 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000346197277 ETH
0x74b7314b36f31af1f0e10770499f5b88ff52f0c561e431bbdf9e524cfcae055bWithdraw57741092022-02-10 6:36:19353 days 8 hrs ago0x98e9db4feafc72d177c77aed8ee97f4df71ea681 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000406977729 ETH
0x5b33ca230da44508066972d0c89f60f52a1ef17e85b0fbadd07ccc4b2c905314Claim All Reward...54518192022-02-05 15:19:53357 days 23 hrs ago0x39de56518e136d472ef9645e7d6e1f7c6c8ed37b IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000416833273 ETH
0x066c6803509430e28847ec569a9640366c54283fb274cca6112009f9a4cc2482Withdraw54516082022-02-05 15:12:48358 days 3 mins ago0x39de56518e136d472ef9645e7d6e1f7c6c8ed37b IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000501952121 ETH
0x06b0d66b67ce07f1d77c27a5b44577bd00c90a4fda16bc53ca58a46a71ef540bClaim All Reward...54196112022-02-04 14:54:14359 days 22 mins ago0x2bff28a82bc4166d535bc9b803f77c09d47fb370 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000512696661 ETH
0x7a6c69b547d5f77c1d6a63e6bf37078aac657f9b8b6b5ae3fa4ca8b1d9d30076Withdraw54195692022-02-04 14:52:50359 days 23 mins ago0x2bff28a82bc4166d535bc9b803f77c09d47fb370 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000592157662 ETH
0xc184f3f23d45d4c10b89189afe0945f9a694c8d5a8d08ee436fd5585d391bc0fClaim All Reward...54117902022-02-04 9:15:11359 days 6 hrs ago0xce1ed029d571ac661ceb35ff39bf541e25883263 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000489562157 ETH
0x70125e2f48d661a63d5494818148526667b4862b831a6c137d74b5d6bb5c7a6aWithdraw53706422022-02-03 4:07:32360 days 11 hrs ago0xb9d24761ebb3e3a88b8cf20e77f56ccf026a2044 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000625809483 ETH
0xcf6b2f9765094725aa392a1ea7b31164ead32ea70823fd1524cf38a9a7167d0cWithdraw53177622022-02-01 14:04:58362 days 1 hr ago0xd6f82502f20647dd8d78dffb6ad7f8d8193d5e29 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000529696964 ETH
0x4fd20adbe41218b789495b6d5f0d9ede3c220bb967b44d5076d3239f851e1ef5Claim All Reward...53176582022-02-01 14:00:54362 days 1 hr ago0xd6f82502f20647dd8d78dffb6ad7f8d8193d5e29 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000447629275 ETH
0xfad0e8d450ae525ca53a288811594b94ca01de4dde57f6b9f8c608d28d295a82Withdraw52772902022-01-31 10:46:29363 days 4 hrs ago0x18c3a2a482efb7914b658836a153c8c562fa61cd IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000526319235 ETH
0xb99f43861aa2a9215bf50e12d706d1b04df48645df38648bdf2d211950851f08Claim All Reward...52772842022-01-31 10:46:00363 days 4 hrs ago0x18c3a2a482efb7914b658836a153c8c562fa61cd IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000500359556 ETH
0x764be45e648017f6058cdf8a1e94b64e5f8f7d78d87d1321e52ae83c182cd9b4Withdraw52764742022-01-31 9:55:53363 days 5 hrs ago0x493374100e511b1b091fa5bace1929dc154fee80 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000534577616 ETH
0x09ba5b901313a34378d856da66e4671977c380b509d0ca4e617c3f13cc2e7df9Claim All Reward...52764642022-01-31 9:55:53363 days 5 hrs ago0x493374100e511b1b091fa5bace1929dc154fee80 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000509110583 ETH
0x029fdd92504a897f544bad8db8fd68eb3c63cf6909b1191bbc0b47b0a0e30b50Withdraw52717972022-01-31 5:27:22363 days 9 hrs ago0xce1ed029d571ac661ceb35ff39bf541e25883263 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000603280968 ETH
0x3c4a3ac373bfda8d8bf0e628f4fd30a565cf862978e0b5c80ada37098052af5eClaim All Reward...52688602022-01-31 2:54:32363 days 12 hrs ago0x9b616ac1d31f17be9b23560d93699ca7732e2808 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000478502006 ETH
0xe5066c2aa170383accb411f8565cb1c35fd8ddec6eec27c4b9874f82c1c066f8Withdraw52688312022-01-31 2:53:24363 days 12 hrs ago0x9b616ac1d31f17be9b23560d93699ca7732e2808 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000562503731 ETH
0x70f36f946771d4e4e774026be97d6100582da113b83f26c3b4d9c7606ee9a65bClaim All Reward...52674882022-01-31 1:58:13363 days 13 hrs ago0x06864f65c07c3468724d7c770bba695e818f8d71 IN 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0 ETH0.000534231839 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0d25f6ac9c4045e350892fb8af6362ad9ab65edd24724aea3edae9f6b9284a6b197730812022-08-09 5:04:56173 days 10 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0x0d25f6ac9c4045e350892fb8af6362ad9ab65edd24724aea3edae9f6b9284a6b197730812022-08-09 5:04:56173 days 10 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x973cab76c35bb1da47e044a63546c69a8ac1143c0 ETH
0x6881a8b469b8f37748af10c351f3289fe35e0caa4cf6058bd1ff26d3d576b280105735512022-04-26 10:26:49278 days 4 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x6881a8b469b8f37748af10c351f3289fe35e0caa4cf6058bd1ff26d3d576b280105735512022-04-26 10:26:49278 days 4 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0x2cc6c6db246896875322e4e8d92753afafb7b37fde87b3d411cfe39ad8de67b8105735382022-04-26 10:26:49278 days 4 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0xce532b6868613b24620a13c63cdc8ca74c12802028d679a55d0d2802dc50c41985106072022-03-24 17:06:07310 days 22 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0xedc776a9dcdff928d09c7b5312dea4b1032123be67a510c1e793a340406baeeb77561162022-03-11 20:45:27323 days 18 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0xedc776a9dcdff928d09c7b5312dea4b1032123be67a510c1e793a340406baeeb77561162022-03-11 20:45:27323 days 18 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0xc619ac767e155e783c467022145375c34e9c3fd29b38f4b73533dc1768f55cc377558602022-03-11 20:41:32323 days 18 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0x4858c1b2b2623ab1febb8e7e3c66ea81563ef5eb2055495772a15ddcdda6890164140252022-02-19 23:00:21343 days 16 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x4858c1b2b2623ab1febb8e7e3c66ea81563ef5eb2055495772a15ddcdda6890164140252022-02-19 23:00:21343 days 16 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0xde45de1af9345f8ee4c912fab2410c3cc60e4da25d871031a0258fcd0cc333e157741622022-02-10 6:37:26353 days 8 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0x74b7314b36f31af1f0e10770499f5b88ff52f0c561e431bbdf9e524cfcae055b57741092022-02-10 6:36:19353 days 8 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x74b7314b36f31af1f0e10770499f5b88ff52f0c561e431bbdf9e524cfcae055b57741092022-02-10 6:36:19353 days 8 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0x5b33ca230da44508066972d0c89f60f52a1ef17e85b0fbadd07ccc4b2c90531454518192022-02-05 15:19:53357 days 23 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0x066c6803509430e28847ec569a9640366c54283fb274cca6112009f9a4cc248254516082022-02-05 15:12:48358 days 3 mins ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x066c6803509430e28847ec569a9640366c54283fb274cca6112009f9a4cc248254516082022-02-05 15:12:48358 days 3 mins ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0x06b0d66b67ce07f1d77c27a5b44577bd00c90a4fda16bc53ca58a46a71ef540b54196112022-02-04 14:54:14359 days 22 mins ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0x7a6c69b547d5f77c1d6a63e6bf37078aac657f9b8b6b5ae3fa4ca8b1d9d3007654195692022-02-04 14:52:50359 days 23 mins ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x7a6c69b547d5f77c1d6a63e6bf37078aac657f9b8b6b5ae3fa4ca8b1d9d3007654195692022-02-04 14:52:50359 days 23 mins ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0xc184f3f23d45d4c10b89189afe0945f9a694c8d5a8d08ee436fd5585d391bc0f54117902022-02-04 9:15:11359 days 6 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x940ff3c38eb7a45347f52f6a07f6a201f6830c600 ETH
0x70125e2f48d661a63d5494818148526667b4862b831a6c137d74b5d6bb5c7a6a53706422022-02-03 4:07:32360 days 11 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x70125e2f48d661a63d5494818148526667b4862b831a6c137d74b5d6bb5c7a6a53706422022-02-03 4:07:32360 days 11 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
0x043b83f00e32da9a48fd7acbfd2c490645dd28a5d3178d85b1bcbd7efba90d0053421162022-02-02 8:37:40361 days 6 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b 0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb0 ETH
0x043b83f00e32da9a48fd7acbfd2c490645dd28a5d3178d85b1bcbd7efba90d0053421162022-02-02 8:37:40361 days 6 hrs ago 0x52c7b4aa3f67d3533aaf1153430758c702a3594b0x65e17c52128396443d4a9a61eacf0970f05f8a200 ETH
[ Download CSV Export 
Loading

Minimal Proxy Contract for 0x973cab76c35bb1da47e044a63546c69a8ac1143c

Contract Name:
ERC20MineV3

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license
Decompile ByteCode

Contract Source Code (Solidity)

Similar Contracts
/**
 *Submitted for verification at Arbiscan on 2021-08-30
*/

// File: contracts/intf/IERC20.sol

// This is a file copied from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

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

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

    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// File: contracts/lib/SafeMath.sol

/**
 * @title SafeMath
 * @author DODO Breeder
 *
 * @notice Math operations with safety checks that revert on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "MUL_ERROR");

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "DIVIDING_ERROR");
        return a / b;
    }

    function divCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 quotient = div(a, b);
        uint256 remainder = a - quotient * b;
        if (remainder > 0) {
            return quotient + 1;
        } else {
            return quotient;
        }
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SUB_ERROR");
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "ADD_ERROR");
        return c;
    }

    function sqrt(uint256 x) internal pure returns (uint256 y) {
        uint256 z = x / 2 + 1;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}

// File: contracts/lib/SafeERC20.sol


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
        );
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) {
            // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/lib/ReentrancyGuard.sol

/**
 * @title ReentrancyGuard
 * @author DODO Breeder
 *
 * @notice Protect functions from Reentrancy Attack
 */
contract ReentrancyGuard {
    // https://solidity.readthedocs.io/en/latest/control-structures.html?highlight=zero-state#scoping-and-declarations
    // zero-state of _ENTERED_ is false
    bool private _ENTERED_;

    modifier preventReentrant() {
        require(!_ENTERED_, "REENTRANT");
        _ENTERED_ = true;
        _;
        _ENTERED_ = false;
    }
}

// File: contracts/lib/DecimalMath.sol

/**
 * @title DecimalMath
 * @author DODO Breeder
 *
 * @notice Functions for fixed point number with 18 decimals
 */
library DecimalMath {
    using SafeMath for uint256;

    uint256 internal constant ONE = 10**18;
    uint256 internal constant ONE2 = 10**36;

    function mulFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d) / (10**18);
    }

    function mulCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(d).divCeil(10**18);
    }

    function divFloor(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).div(d);
    }

    function divCeil(uint256 target, uint256 d) internal pure returns (uint256) {
        return target.mul(10**18).divCeil(d);
    }

    function reciprocalFloor(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).div(target);
    }

    function reciprocalCeil(uint256 target) internal pure returns (uint256) {
        return uint256(10**36).divCeil(target);
    }
}

// File: contracts/lib/InitializableOwnable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract InitializableOwnable {
    address public _OWNER_;
    address public _NEW_OWNER_;
    bool internal _INITIALIZED_;

    // ============ Events ============

    event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    // ============ Modifiers ============

    modifier notInitialized() {
        require(!_INITIALIZED_, "DODO_INITIALIZED");
        _;
    }

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    function initOwner(address newOwner) public notInitialized {
        _INITIALIZED_ = true;
        _OWNER_ = newOwner;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() public {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/lib/Ownable.sol

/**
 * @title Ownable
 * @author DODO Breeder
 *
 * @notice Ownership related functions
 */
contract Ownable {
    address public _OWNER_;
    address public _NEW_OWNER_;

    // ============ Events ============

    event OwnershipTransferPrepared(address indexed previousOwner, address indexed newOwner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    // ============ Modifiers ============

    modifier onlyOwner() {
        require(msg.sender == _OWNER_, "NOT_OWNER");
        _;
    }

    // ============ Functions ============

    constructor() internal {
        _OWNER_ = msg.sender;
        emit OwnershipTransferred(address(0), _OWNER_);
    }

    function transferOwnership(address newOwner) external virtual onlyOwner {
        emit OwnershipTransferPrepared(_OWNER_, newOwner);
        _NEW_OWNER_ = newOwner;
    }

    function claimOwnership() external {
        require(msg.sender == _NEW_OWNER_, "INVALID_CLAIM");
        emit OwnershipTransferred(_OWNER_, _NEW_OWNER_);
        _OWNER_ = _NEW_OWNER_;
        _NEW_OWNER_ = address(0);
    }
}

// File: contracts/DODOToken/DODOMineV3/RewardVault.sol


interface IRewardVault {
    function reward(address to, uint256 amount) external;
    function withdrawLeftOver(address to, uint256 amount) external; 
    function syncValue() external;
    function _TOTAL_REWARD_() external view returns(uint256);
}

contract RewardVault is Ownable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    uint256 public _REWARD_RESERVE_;
    uint256 public _TOTAL_REWARD_;
    address public _REWARD_TOKEN_;

    // ============ Event =============
    event DepositReward(uint256 totalReward, uint256 inputReward, uint256 rewardReserve);

    constructor(address _rewardToken) public {
        _REWARD_TOKEN_ = _rewardToken;
    }

    function reward(address to, uint256 amount) external onlyOwner {
        require(_REWARD_RESERVE_ >= amount, "VAULT_NOT_ENOUGH");
        _REWARD_RESERVE_ = _REWARD_RESERVE_.sub(amount);
        IERC20(_REWARD_TOKEN_).safeTransfer(to, amount);
    }

    function withdrawLeftOver(address to,uint256 amount) external onlyOwner {
        require(_REWARD_RESERVE_ >= amount, "VAULT_NOT_ENOUGH");
        _REWARD_RESERVE_ = _REWARD_RESERVE_.sub(amount);
        IERC20(_REWARD_TOKEN_).safeTransfer(to, amount);
    }

    function syncValue() external {
        uint256 rewardBalance = IERC20(_REWARD_TOKEN_).balanceOf(address(this));
        uint256 rewardInput = rewardBalance.sub(_REWARD_RESERVE_);

        _TOTAL_REWARD_ = _TOTAL_REWARD_.add(rewardInput);
        _REWARD_RESERVE_ = rewardBalance;

        emit DepositReward(_TOTAL_REWARD_, rewardInput, _REWARD_RESERVE_);
    }
}

// File: contracts/DODOToken/DODOMineV3/BaseMine.sol



contract BaseMine is InitializableOwnable {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    // ============ Storage ============

    struct RewardTokenInfo {
        address rewardToken;
        uint256 startBlock;
        uint256 endBlock;
        address rewardVault;
        uint256 rewardPerBlock;
        uint256 accRewardPerShare;
        uint256 lastRewardBlock;
        uint256 workThroughReward;
        uint256 lastFlagBlock;
        mapping(address => uint256) userRewardPerSharePaid;
        mapping(address => uint256) userRewards;
    }

    RewardTokenInfo[] public rewardTokenInfos;

    uint256 internal _totalSupply;
    mapping(address => uint256) internal _balances;

    // ============ Event =============

    event Claim(uint256 indexed i, address indexed user, uint256 reward);
    event UpdateReward(uint256 indexed i, uint256 rewardPerBlock);
    event UpdateEndBlock(uint256 indexed i, uint256 endBlock);
    event NewRewardToken(uint256 indexed i, address rewardToken);
    event RemoveRewardToken(address rewardToken);
    event WithdrawLeftOver(address owner, uint256 i);

    // ============ View  ============

    function getPendingReward(address user, uint256 i) public view returns (uint256) {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        uint256 accRewardPerShare = rt.accRewardPerShare;
        if (rt.lastRewardBlock != block.number) {
            accRewardPerShare = _getAccRewardPerShare(i);
        }
        return
            DecimalMath.mulFloor(
                balanceOf(user), 
                accRewardPerShare.sub(rt.userRewardPerSharePaid[user])
            ).add(rt.userRewards[user]);
    }

    function getPendingRewardByToken(address user, address rewardToken) external view returns (uint256) {
        return getPendingReward(user, getIdByRewardToken(rewardToken));
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address user) public view returns (uint256) {
        return _balances[user];
    }

    function getRewardTokenById(uint256 i) external view returns (address) {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        return rt.rewardToken;
    }

    function getIdByRewardToken(address rewardToken) public view returns(uint256) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                return i;
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    function getRewardNum() external view returns(uint256) {
        return rewardTokenInfos.length;
    }

    function getVaultByRewardToken(address rewardToken) public view returns(address) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                return rewardTokenInfos[i].rewardVault;
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    function getVaultDebtByRewardToken(address rewardToken) public view returns(uint256) {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            if (rewardToken == rewardTokenInfos[i].rewardToken) {
                uint256 totalDepositReward = IRewardVault(rewardTokenInfos[i].rewardVault)._TOTAL_REWARD_();
                uint256 gap = rewardTokenInfos[i].endBlock.sub(rewardTokenInfos[i].lastFlagBlock);
                uint256 totalReward = rewardTokenInfos[i].workThroughReward.add(gap.mul(rewardTokenInfos[i].rewardPerBlock));
                if(totalDepositReward >= totalReward) {
                    return 0;
                }else {
                    return totalReward.sub(totalDepositReward);
                }
            }
        }
        require(false, "DODOMineV3: TOKEN_NOT_FOUND");
    }

    // ============ Claim ============

    function claimReward(uint256 i) public {
        require(i<rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(msg.sender, i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        uint256 reward = rt.userRewards[msg.sender];
        if (reward > 0) {
            rt.userRewards[msg.sender] = 0;
            IRewardVault(rt.rewardVault).reward(msg.sender, reward);
            emit Claim(i, msg.sender, reward);
        }
    }

    function claimAllRewards() external {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            claimReward(i);
        }
    }

    // =============== Ownable  ================

    function addRewardToken(
        address rewardToken,
        uint256 rewardPerBlock,
        uint256 startBlock,
        uint256 endBlock
    ) external onlyOwner {
        require(rewardToken != address(0), "DODOMineV3: TOKEN_INVALID");
        require(startBlock > block.number, "DODOMineV3: START_BLOCK_INVALID");
        require(endBlock > startBlock, "DODOMineV3: DURATION_INVALID");

        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            require(
                rewardToken != rewardTokenInfos[i].rewardToken,
                "DODOMineV3: TOKEN_ALREADY_ADDED"
            );
        }

        RewardTokenInfo storage rt = rewardTokenInfos.push();
        rt.rewardToken = rewardToken;
        rt.startBlock = startBlock;
        rt.lastFlagBlock = startBlock;
        rt.endBlock = endBlock;
        rt.rewardPerBlock = rewardPerBlock;
        rt.rewardVault = address(new RewardVault(rewardToken));

        uint256 rewardAmount = rewardPerBlock.mul(endBlock.sub(startBlock));
        IERC20(rewardToken).safeTransfer(rt.rewardVault, rewardAmount);
        RewardVault(rt.rewardVault).syncValue();

        emit NewRewardToken(len, rewardToken);
    }

    function setEndBlock(uint256 i, uint256 newEndBlock)
        external
        onlyOwner
    {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(address(0), i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];


        uint256 totalDepositReward = RewardVault(rt.rewardVault)._TOTAL_REWARD_();
        uint256 gap = newEndBlock.sub(rt.lastFlagBlock);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(rt.rewardPerBlock));
        require(totalDepositReward >= totalReward, "DODOMineV3: REWARD_NOT_ENOUGH");

        require(block.number < newEndBlock, "DODOMineV3: END_BLOCK_INVALID");
        require(block.number > rt.startBlock, "DODOMineV3: NOT_START");
        require(block.number < rt.endBlock, "DODOMineV3: ALREADY_CLOSE");

        rt.endBlock = newEndBlock;
        emit UpdateEndBlock(i, newEndBlock);
    }

    function setReward(uint256 i, uint256 newRewardPerBlock)
        external
        onlyOwner
    {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        _updateReward(address(0), i);
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        
        require(block.number < rt.endBlock, "DODOMineV3: ALREADY_CLOSE");
        
        rt.workThroughReward = rt.workThroughReward.add((block.number.sub(rt.lastFlagBlock)).mul(rt.rewardPerBlock));
        rt.rewardPerBlock = newRewardPerBlock;
        rt.lastFlagBlock = block.number;

        uint256 totalDepositReward = RewardVault(rt.rewardVault)._TOTAL_REWARD_();
        uint256 gap = rt.endBlock.sub(block.number);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(newRewardPerBlock));
        require(totalDepositReward >= totalReward, "DODOMineV3: REWARD_NOT_ENOUGH");

        emit UpdateReward(i, newRewardPerBlock);
    }

    function withdrawLeftOver(uint256 i, uint256 amount) external onlyOwner {
        require(i < rewardTokenInfos.length, "DODOMineV3: REWARD_ID_NOT_FOUND");
        
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        require(block.number > rt.endBlock, "DODOMineV3: MINING_NOT_FINISHED");
        
        uint256 gap = rt.endBlock.sub(rt.lastFlagBlock);
        uint256 totalReward = rt.workThroughReward.add(gap.mul(rt.rewardPerBlock));
        uint256 totalDepositReward = IRewardVault(rt.rewardVault)._TOTAL_REWARD_();
        require(amount <= totalDepositReward.sub(totalReward), "DODOMineV3: NOT_ENOUGH");

        IRewardVault(rt.rewardVault).withdrawLeftOver(msg.sender,amount);

        emit WithdrawLeftOver(msg.sender, i);
    }


    function directTransferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "DODOMineV3: ZERO_ADDRESS");
        emit OwnershipTransferred(_OWNER_, newOwner);
        _OWNER_ = newOwner;
    }

    // ============ Internal  ============

    function _updateReward(address user, uint256 i) internal {
        RewardTokenInfo storage rt = rewardTokenInfos[i];
        if (rt.lastRewardBlock != block.number){
            rt.accRewardPerShare = _getAccRewardPerShare(i);
            rt.lastRewardBlock = block.number;
        }
        if (user != address(0)) {
            rt.userRewards[user] = getPendingReward(user, i);
            rt.userRewardPerSharePaid[user] = rt.accRewardPerShare;
        }
    }

    function _updateAllReward(address user) internal {
        uint256 len = rewardTokenInfos.length;
        for (uint256 i = 0; i < len; i++) {
            _updateReward(user, i);
        }
    }

    function _getUnrewardBlockNum(uint256 i) internal view returns (uint256) {
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        if (block.number < rt.startBlock || rt.lastRewardBlock > rt.endBlock) {
            return 0;
        }
        uint256 start = rt.lastRewardBlock < rt.startBlock ? rt.startBlock : rt.lastRewardBlock;
        uint256 end = rt.endBlock < block.number ? rt.endBlock : block.number;
        return end.sub(start);
    }

    function _getAccRewardPerShare(uint256 i) internal view returns (uint256) {
        RewardTokenInfo memory rt = rewardTokenInfos[i];
        if (totalSupply() == 0) {
            return rt.accRewardPerShare;
        }
        return
            rt.accRewardPerShare.add(
                DecimalMath.divFloor(_getUnrewardBlockNum(i).mul(rt.rewardPerBlock), totalSupply())
            );
    }

}

// File: contracts/DODOToken/DODOMineV3/ERC20MineV3.sol



contract ERC20MineV3 is ReentrancyGuard, BaseMine {
    using SafeERC20 for IERC20;
    using SafeMath for uint256;

    // ============ Storage ============

    address public _TOKEN_;

    function init(address owner, address token) external {
        super.initOwner(owner);
        _TOKEN_ = token;
    }

    // ============ Event  ============

    event Deposit(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);

    // ============ Deposit && Withdraw && Exit ============

    function deposit(uint256 amount) external preventReentrant {
        require(amount > 0, "DODOMineV3: CANNOT_DEPOSIT_ZERO");

        _updateAllReward(msg.sender);

        uint256 erc20OriginBalance = IERC20(_TOKEN_).balanceOf(address(this));
        IERC20(_TOKEN_).safeTransferFrom(msg.sender, address(this), amount);
        uint256 actualStakeAmount = IERC20(_TOKEN_).balanceOf(address(this)).sub(erc20OriginBalance);
        
        _totalSupply = _totalSupply.add(actualStakeAmount);
        _balances[msg.sender] = _balances[msg.sender].add(actualStakeAmount);

        emit Deposit(msg.sender, actualStakeAmount);
    }

    function withdraw(uint256 amount) external preventReentrant {
        require(amount > 0, "DODOMineV3: CANNOT_WITHDRAW_ZERO");

        _updateAllReward(msg.sender);
        _totalSupply = _totalSupply.sub(amount);
        _balances[msg.sender] = _balances[msg.sender].sub(amount);
        IERC20(_TOKEN_).safeTransfer(msg.sender, amount);

        emit Withdraw(msg.sender, amount);
    }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"}],"name":"NewRewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"}],"name":"RemoveRewardToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"UpdateEndBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"i","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"UpdateReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"i","type":"uint256"}],"name":"WithdrawLeftOver","type":"event"},{"inputs":[],"name":"_NEW_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_OWNER_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOKEN_","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"directTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getIdByRewardToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getPendingRewardByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getRewardTokenById","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getVaultByRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"getVaultDebtByRewardToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokenInfos","outputs":[{"internalType":"address","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"address","name":"rewardVault","type":"address"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"workThroughReward","type":"uint256"},{"internalType":"uint256","name":"lastFlagBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"setEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"newRewardPerBlock","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLeftOver","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.