Contract 0xA5A20d78109A48A9aB87EB3D015886dbef06a6D1 1

Contract Overview

Balance:
0 HT

HT Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc3fcde13fc7ba8a47f4e3219551cdeab950aec3ef1140b95a74fda3837de3805Stake72603332021-08-11 9:39:2739 days 16 hrs ago0xf67bc5b9f2818d21f9f921aaf48f6d8851f53ab4 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x43fac92f9e59d2683178db83f8dd78ea637de1b957c4d4c7c612ddfb8637682aStake72575192021-08-11 7:18:4539 days 18 hrs ago0xe4afbd5f9fae34f36c7ef0fb7312824def193bc5 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xf5801bb9d8855867e4b7ac80ca71dc6e0138f2fda18a2f9d2ece7ba3a5f8beafStake72564882021-08-11 6:27:1239 days 19 hrs ago0x93c5d545cc4192ca076b5eeefd189df47628536b IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x134e38f27f1bca330e8a61b7bc3d7e3341e6cafd47b85f93796c15e82078c7c8Stake71990812021-08-09 6:36:5041 days 19 hrs ago0x93a71af95c84f18e40fefcb6999fd732df84108c IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x639dc26fd25751eb1f7dd82aa8095eca3986c0bc967ef0a9c07171b3d33a2082Stake71984972021-08-09 6:07:3841 days 19 hrs ago0xafcb3f2eabeb07467aa28f4c7ab98695e226ba5d IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xaa34ab35ca1b08b7a3e0268b499ff417f4291595eb054079213f5a4ef3174a15Stake71976912021-08-09 5:27:2041 days 20 hrs ago0xc19724ab80d72f3670fc09b54676cc8e98e2014a IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x45260e93aa5c462b78044bdc1eebcd55c5fe38e423f5a920e8e832bb30a1b017Stake71763242021-08-08 11:38:5842 days 14 hrs ago0xc55246bfa7971727a800797eecc54db009e669e6 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00033154875
0xfe44f7d4a2eb02d0eac30bcc2184f9dbc25838f3c9ca2d99542b9a8cdf1b03e8Stake71724802021-08-08 8:26:4642 days 17 hrs ago0xaa221a7beb2af4050ff61b1f1f4852c6911a7aa3 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xcc85dbe6dfd46544a7620fab28d10844df1cad9db2dd6266aa5f9921e102f519Stake71710212021-08-08 7:13:4942 days 18 hrs ago0xc1a05e35c236ad8dbd2727f6496217b6bcf1592e IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xa6d72d7d52d3cfb0b15a90f66a2abef9eb703303837a816af22524cf3c48ea66Stake71455242021-08-07 9:58:5843 days 16 hrs ago0x0249aeb1a817719375585fd5aefa51b2b7ed5e1b IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x88d23e6381f0314871d2194b8349cfd319fe42069409ab3b302887e57505bebfStake71451072021-08-07 9:38:0743 days 16 hrs ago0xb9b6ff90d3857c8f3e4f969f03304a325479d93f IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00033154875
0x062525f11986d8c9260954d1addb0d0533fd7e7643800064f49f1e9cfc3b03c5Stake71449102021-08-07 9:28:1643 days 16 hrs ago0x96d695e3eb09256e2111dc85b70c886834730f2a IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x54f38a7d3abf675e693d855cd35a81494015e1438163166896e83f927a513686Stake71442492021-08-07 8:55:1343 days 17 hrs ago0x9e8125bc6df638013eac2415c3dfcc191564b946 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xff5bdbae040463d00b40821f367ca2177a349781798d8c4b542d25856492465bStake71436302021-08-07 8:24:1643 days 17 hrs ago0x1787f7377453eb2ffe2bdb1f68d43c8d169e9757 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xf0f9d256965a9c8761487b3a3427d26af252818ca9e05028446bb205ddda6a79Stake71436252021-08-07 8:24:0143 days 17 hrs ago0x61778c02077ceccb1ca20699e9494a0fe93089e8 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x1ce80592f09a8481edab5ef13dc1eca2e426a07c4ef7ced585cd4ae3a33916feStake71436072021-08-07 8:23:0743 days 17 hrs ago0x738d1c73f687d58560b39369e89ff11c2b8494cc IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x98f61d033053719cb9d747f66d5dd8a7d9af1a6b62455bdd4b432643d390bdfaStake71426732021-08-07 7:36:2543 days 18 hrs ago0xa22b6fe4cd497a714bd26f295867fb330d76bc31 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x55030a067aae571cd3f18aef31623c8c29019e35934e5e1368c893fd210b7698Stake71424932021-08-07 7:27:2543 days 18 hrs ago0xdc57cb1a43b15f82579b928a20287da1b34a8677 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xb8b0856aa68465a8b2c23c43c3f9a4ce6a1db74ea923f6b23694627b4b198cc4Stake71422602021-08-07 7:15:4643 days 18 hrs ago0x273b80a138ac8760e9a2ffacd73ff041071e9330 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x0393d377f96249db5d35e4c25ab160d1033681fec3cab5483af962ed5aead281Stake71421572021-08-07 7:10:3743 days 18 hrs ago0xc7c4c87a642331e861e0e50ddc46e85b661baf69 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xd9c0637393f1c45cd682c9abf386c3a331a7459a6b7b237b92b9d1967a19ca67Stake71420632021-08-07 7:05:5543 days 18 hrs ago0x2c070490b8da851dc24977737d4f5f20a94009e4 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x0bfe455cfe60e43290ab0363d8782ee7ec930fd4578dbab9cf28e9fb03496205Stake71415702021-08-07 6:41:1643 days 19 hrs ago0x09811164b2167781234429f4c3ac56590b721d67 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0xcc11db1e6d0ed318dd165155b97b5f3d3ee6f67a92d95133187da26d818f350eStake71414332021-08-07 6:34:2543 days 19 hrs ago0x1d20deac58301e6281fecd68c55689386b30b421 IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x7c7db62e10fc7154d6d59373a45e86ba68144a78ceca253a4b534b20361488faStake71413652021-08-07 6:31:0143 days 19 hrs ago0x6a7e4ad50ef9c4f3f9ff85b9fd2bc19824eb000f IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
0x980cf77152d31b877022335f56228f594235f055c411c759e47eec1e7a04ed0fStake71413042021-08-07 6:27:5843 days 19 hrs ago0x7e634782e166fb5207e72779b9bac2642f9e31fe IN  0xa5a20d78109a48a9ab87eb3d015886dbef06a6d10 HT0.00036529875
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DPNode

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 4: DPNode.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0;

import '../Context.sol';
import '../Libraries.sol';

contract DPNode is Operator {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IERC20 public stakeToken;

    uint256 public DURATION = 90 days;
    uint256 public STAKE_ETO_AMOUNT = 3000 ether;

    struct NodeInfo {
        address account;
        uint256 stakeAmount;
        uint256 starttime;
        uint256 endtime;
        bool success;
    }

    mapping(address => NodeInfo) public nodes;
    mapping(address => bool) public nodeStatus;

    mapping(address => NodeInfo) public loseNodes;
    mapping(address => bool) public loseNodeStatus;

    constructor(address etoTokenAddress) {
        stakeToken = IERC20(etoTokenAddress);
    }

    function changeStakeToken(address token) external onlyOperator {
        stakeToken = IERC20(token);
    }

    function changeDURATION(uint256 dayCount) external onlyOperator {
        DURATION = dayCount * 1 days;
    }

    function changeDURATIONInSeconds(uint256 second) external onlyOperator {
        DURATION = second;
    }

    function paybackStakeToken() public onlyOperator {
        stakeToken.transfer(msg.sender, stakeToken.balanceOf(address(this)));
    }

    function updateNodeResult(address account, bool success)
        public
        onlyOperator
    {
        require(nodeStatus[account], 'account must be node');

        require(
            block.timestamp >= nodes[account].endtime,
            'result time must be later than endtime'
        );

        // if true, account win,
        if (success) {
            nodes[account].success = success;
        } else {
            //if false, node lose

            //transfer eto to operator
            stakeToken.safeTransfer(msg.sender, nodes[account].stakeAmount);

            //modify data

            NodeInfo memory node = NodeInfo({
                account: account,
                starttime: nodes[account].starttime,
                stakeAmount: nodes[account].stakeAmount,
                endtime: nodes[account].endtime,
                success: false
            });
            loseNodes[account] = node;
            loseNodeStatus[account] = true;

            delete nodes[account];
            delete nodeStatus[account];
        }
    }

    function stake() external {
        require(!nodeStatus[msg.sender], 'account had been node already');

        //transfer
        stakeToken.transferFrom(msg.sender, address(this), STAKE_ETO_AMOUNT);
        //modify data
        NodeInfo memory node = NodeInfo({
            account: msg.sender,
            starttime: block.timestamp,
            stakeAmount: STAKE_ETO_AMOUNT,
            endtime: block.timestamp + DURATION,
            success: false
        });

        nodes[msg.sender] = node;
        nodeStatus[msg.sender] = true;

        delete loseNodes[msg.sender];
        delete loseNodeStatus[msg.sender];
    }

    function withdraw() external {
        require(canWithdraw(msg.sender), 'can not withdraw');

        //transfer
        stakeToken.safeTransfer(msg.sender, nodes[msg.sender].stakeAmount);

        //modify data
        delete nodes[msg.sender];
        delete nodeStatus[msg.sender];

        delete loseNodes[msg.sender];
        delete loseNodeStatus[msg.sender];
    }

    function canWithdraw(address account) public view returns (bool) {
        //1. must be node
        if (!nodeStatus[account]) {
            return false;
        }

        //2. must finish
        if (!nodes[account].success) {
            return false;
        }

        //3. must be >= 90 days
        if (block.timestamp < nodes[account].endtime) {
            return false;
        }

        return true;
    }

    //0 not open,1 node ing, 2 node lose,3 canwithdraw
    function queryAccountStatus(address account) public view returns (int8) {
        if (nodeStatus[account]) {
            if (canWithdraw(account)) return 3;
            else return 1;
        }

        if (loseNodeStatus[account]) {
            return 2;
        }

        return 0;
    }
}

File 2 of 4: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;


abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor (){
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


contract Operator is Context, Ownable {
    address private _operator;

    event OperatorTransferred(
        address indexed previousOperator,
        address indexed newOperator
    );

    constructor(){
        _operator = _msgSender();
        emit OperatorTransferred(address(0), _operator);
    }

    function operator() public view returns (address) {
        return _operator;
    }
        
    modifier onlyOperator() {
        require(_operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    function isOperator() public view returns (bool) {
        return _msgSender() == _operator;
    }
    
    function transferOperator(address newOperator_) public onlyOwner {
        _transferOperator(newOperator_);
    }

    function _transferOperator(address newOperator_) internal {
        require(
            newOperator_ != address(0),
            "operator: zero address given for new operator"
        );
        emit OperatorTransferred(address(0), newOperator_);
        _operator = newOperator_;
    }
}

File 3 of 4: Interfaces.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

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

File 4 of 4: Libraries.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;

import './Interfaces.sol';

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, 'SafeMath: addition overflow');

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, 'SafeMath: subtraction overflow');
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, 'SafeMath: multiplication overflow');

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, 'SafeMath: division by zero');
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, 'SafeMath: modulo by zero');
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            'Address: insufficient balance'
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}('');
        require(
            success,
            'Address: unable to send value, recipient may have reverted'
        );
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, 'Address: low-level call failed');
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                'Address: low-level call with value failed'
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            'Address: insufficient balance for call'
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), 'Address: call to non-contract');

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    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)
        );
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    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)
        );
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance =
            token.allowance(address(this), spender).add(value);
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance =
            token.allowance(address(this), spender).sub(
                value,
                'SafeERC20: decreased allowance below zero'
            );
        _callOptionalReturn(
            token,
            abi.encodeWithSelector(
                token.approve.selector,
                spender,
                newAllowance
            )
        );
    }

    /**
     * @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. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata =
            address(token).functionCall(
                data,
                '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'
            );
        }
    }
}

library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account)
        internal
        view
        returns (bool)
    {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

contract WhitelistAdminRole {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor() {
        _addWhitelistAdmin(msg.sender);
    }

    modifier onlyWhitelistAdmin() {
        require(
            isWhitelistAdmin(msg.sender),
            "WhitelistAdminRole: caller does not have the WhitelistAdmin role"
        );
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(msg.sender);
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function removeWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _removeWhitelistAdmin(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"etoTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","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"},{"inputs":[],"name":"DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKE_ETO_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dayCount","type":"uint256"}],"name":"changeDURATION","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"second","type":"uint256"}],"name":"changeDURATIONInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"changeStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loseNodeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loseNodes","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nodeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nodes","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","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":"paybackStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"queryAccountStatus","outputs":[{"internalType":"int8","name":"","type":"int8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"success","type":"bool"}],"name":"updateNodeResult","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526276a70060035568a2a15d09519be0000060045534801561002457600080fd5b5060405161155c38038061155c8339818101604052602081101561004757600080fd5b50516000610053610116565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506100a5610116565b600180546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b039290921691909117905561011a565b3390565b611433806101296000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c8063570ca735116100b85780638da5cb5b1161007c5780638da5cb5b1461035c5780638ed042ec1461036457806396b747b21461036c578063d062bb8d14610392578063d15b41b31461039a578063f2fde38b146103c057610141565b8063570ca735146102d257806357e636fe146102da5780635e1cd7f314610300578063715018a6146103265780637820cce31461032e57610141565b80631be052891161010a5780631be052891461025657806329605e77146102705780633a4b66f1146102965780633ccfd60b1461029e5780634456eda2146102a657806351ed6a30146102ae57610141565b80622d7bde1461014657806309a6ed5914610165578063166b4bd0146101a2578063189a5a17146101bf57806319262d301461021c575b600080fd5b6101636004803603602081101561015c57600080fd5b50356103e6565b005b61018b6004803603602081101561017b57600080fd5b50356001600160a01b0316610439565b6040805160009290920b8252519081900360200190f35b610163600480360360208110156101b857600080fd5b50356104aa565b6101e5600480360360208110156101d557600080fd5b50356001600160a01b03166104f8565b604080516001600160a01b039096168652602086019490945284840192909252606084015215156080830152519081900360a00190f35b6102426004803603602081101561023257600080fd5b50356001600160a01b0316610534565b604080519115158252519081900360200190f35b61025e6105ba565b60408051918252519081900360200190f35b6101636004803603602081101561028657600080fd5b50356001600160a01b03166105c0565b610163610636565b610163610807565b61024261090e565b6102b6610934565b604080516001600160a01b039092168252519081900360200190f35b6102b6610943565b610242600480360360208110156102f057600080fd5b50356001600160a01b0316610952565b6102426004803603602081101561031657600080fd5b50356001600160a01b0316610967565b61016361097c565b6101636004803603604081101561034457600080fd5b506001600160a01b0381351690602001351515610a30565b6102b6610c83565b610163610c92565b6101636004803603602081101561038257600080fd5b50356001600160a01b0316610dd4565b61025e610e3f565b6101e5600480360360208110156103b057600080fd5b50356001600160a01b0316610e45565b610163600480360360208110156103d657600080fd5b50356001600160a01b0316610e81565b6001546001600160a01b0316331461042f5760405162461bcd60e51b815260040180806020018281038252602481526020018061138a6024913960400191505060405180910390fd5b6201518002600355565b6001600160a01b03811660009081526006602052604081205460ff16156104785761046382610534565b15610470575060036104a5565b5060016104a5565b6001600160a01b03821660009081526008602052604090205460ff16156104a1575060026104a5565b5060005b919050565b6001546001600160a01b031633146104f35760405162461bcd60e51b815260040180806020018281038252602481526020018061138a6024913960400191505060405180910390fd5b600355565b600560205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919060ff1685565b6001600160a01b03811660009081526006602052604081205460ff1661055c575060006104a5565b6001600160a01b03821660009081526005602052604090206004015460ff16610587575060006104a5565b6001600160a01b0382166000908152600560205260409020600301544210156105b2575060006104a5565b506001919050565b60035481565b6105c8610f8b565b6000546001600160a01b0390811691161461062a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61063381610f8f565b50565b3360009081526006602052604090205460ff161561069b576040805162461bcd60e51b815260206004820152601d60248201527f6163636f756e7420686164206265656e206e6f646520616c7265616479000000604482015290519081900360640190fd5b60025460048054604080516323b872dd60e01b815233938101939093523060248401526044830191909152516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b505050506040513d602081101561072557600080fd5b5061073090506112fc565b506040805160a0810182523380825260048054602080850191825242858701818152600380549092016060880190815260006080890181815297815260058552898120985189546001600160a01b03919091166001600160a01b0319918216178a55955160018a81019190915592516002808b01919091559151898501559651978601805498151560ff19998a161790556006845288872080548916831790556007845288872080549095168555908401869055830185905582018490559101805484169055600890529190912080549091169055565b61081033610534565b610854576040805162461bcd60e51b815260206004820152601060248201526f63616e206e6f7420776974686472617760801b604482015290519081900360640190fd5b3360008181526005602052604090206001015460025461087f926001600160a01b039091169161102c565b33600090815260056020908152604080832080546001600160a01b031990811682556001808301869055600280840187905560038085018890556004948501805460ff1990811690915560068852868920805482169055600788528689208054909516855592840188905590830187905582018690559101805482169055600890925290912080549091169055565b6001546000906001600160a01b0316610925610f8b565b6001600160a01b031614905090565b6002546001600160a01b031681565b6001546001600160a01b031690565b60086020526000908152604090205460ff1681565b60066020526000908152604090205460ff1681565b610984610f8b565b6000546001600160a01b039081169116146109e6576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001546001600160a01b03163314610a795760405162461bcd60e51b815260040180806020018281038252602481526020018061138a6024913960400191505060405180910390fd5b6001600160a01b03821660009081526006602052604090205460ff16610add576040805162461bcd60e51b81526020600482015260146024820152736163636f756e74206d757374206265206e6f646560601b604482015290519081900360640190fd5b6001600160a01b038216600090815260056020526040902060030154421015610b375760405162461bcd60e51b81526004018080602001828103825260268152602001806113ae6026913960400191505060405180910390fd5b8015610b69576001600160a01b0382166000908152600560205260409020600401805460ff1916821515179055610c7f565b6001600160a01b03808316600090815260056020526040902060010154600254610b96921690339061102c565b610b9e6112fc565b506040805160a0810182526001600160a01b0380851680835260008181526005602090815285822060018082018054848901908152600280850180548b8d019081526003808801805460608f0190815260808f018c81529c8c5260078b528f8c209e518f549e166001600160a01b03199e8f16178f5595518e8901559151938d01939093559251918b019190915596516004998a01805491151560ff19928316179055600886528a87208054821690941790935583549097168355849055938390559382905593909201805482169055600690925291909120805490911690555b5050565b6000546001600160a01b031690565b6001546001600160a01b03163314610cdb5760405162461bcd60e51b815260040180806020018281038252602481526020018061138a6024913960400191505060405180910390fd5b600254604080516370a0823160e01b815230600482015290516001600160a01b039092169163a9059cbb91339184916370a08231916024808301926020929190829003018186803b158015610d2f57600080fd5b505afa158015610d43573d6000803e3d6000fd5b505050506040513d6020811015610d5957600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050506040513d6020811015610c7f57600080fd5b6001546001600160a01b03163314610e1d5760405162461bcd60e51b815260040180806020018281038252602481526020018061138a6024913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60045481565b600760205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919060ff1685565b610e89610f8b565b6000546001600160a01b03908116911614610eeb576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116610f305760405162461bcd60e51b81526004018080602001828103825260268152602001806113376026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038116610fd45760405162461bcd60e51b815260040180806020018281038252602d81526020018061135d602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261107e908490611083565b505050565b60606110d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111349092919063ffffffff16565b80519091501561107e578080602001905160208110156110f757600080fd5b505161107e5760405162461bcd60e51b815260040180806020018281038252602a8152602001806113d4602a913960400191505060405180910390fd5b6060611143848460008561114b565b949350505050565b6060611156856112f6565b6111a7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106111e65780518252601f1990920191602091820191016111c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611248576040519150601f19603f3d011682016040523d82523d6000602084013e61124d565b606091505b509150915081156112615791506111439050565b8051156112715780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156112bb5781810151838201526020016112a3565b50505050905090810190601f1680156112e85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3b151590565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600015158152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f726f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f72726573756c742074696d65206d757374206265206c61746572207468616e20656e6474696d655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fd1ed5e177cb91ac639308087b3237acf8bcf5e1867a3dc88b6182ad6810d6ac64736f6c63430007000033000000000000000000000000f649e5f6c811df360e5d7e5a8e52b11b4642fb2a

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

000000000000000000000000f649e5f6c811df360e5d7e5a8e52b11b4642fb2a

-----Decoded View---------------
Arg [0] : etoTokenAddress (address): 0xf649e5f6c811df360e5d7e5a8e52b11b4642fb2a

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f649e5f6c811df360e5d7e5a8e52b11b4642fb2a


Deployed ByteCode Sourcemap

111:3999:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;896:109;;;;;;;;;;;;;;;;-1:-1:-1;896:109:1;;:::i;:::-;;3818:290;;;;;;;;;;;;;;;;-1:-1:-1;3818:290:1;-1:-1:-1;;;;;3818:290:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;1011:105;;;;;;;;;;;;;;;;-1:-1:-1;1011:105:1;;:::i;488:41::-;;;;;;;;;;;;;;;;-1:-1:-1;488:41:1;-1:-1:-1;;;;;488:41:1;;:::i;:::-;;;;-1:-1:-1;;;;;488:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3339:418;;;;;;;;;;;;;;;;-1:-1:-1;3339:418:1;-1:-1:-1;;;;;3339:418:1;;:::i;:::-;;;;;;;;;;;;;;;;;;241:33;;;:::i;:::-;;;;;;;;;;;;;;;;2718:113:0;;;;;;;;;;;;;;;;-1:-1:-1;2718:113:0;-1:-1:-1;;;;;2718:113:0;;:::i;2325:630:1:-;;;:::i;2961:372::-;;;:::i;2610:98:0:-;;;:::i;210:24:1:-;;;:::i;:::-;;;;-1:-1:-1;;;;;210:24:1;;;;;;;;;;;;;;2383:83:0;;;:::i;635:46:1:-;;;;;;;;;;;;;;;;-1:-1:-1;635:46:1;-1:-1:-1;;;;;635:46:1;;:::i;535:42::-;;;;;;;;;;;;;;;;-1:-1:-1;535:42:1;-1:-1:-1;;;;;535:42:1;;:::i;1534:145:0:-;;;:::i;1262:1057:1:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1262:1057:1;;;;;;;;;;:::i;911:77:0:-;;;:::i;1122:134:1:-;;;:::i;784:106::-;;;;;;;;;;;;;;;;-1:-1:-1;784:106:1;-1:-1:-1;;;;;784:106:1;;:::i;280:44::-;;;:::i;584:45::-;;;;;;;;;;;;;;;;-1:-1:-1;584:45:1;-1:-1:-1;;;;;584:45:1;;:::i;1828:240:0:-;;;;;;;;;;;;;;;;-1:-1:-1;1828:240:0;-1:-1:-1;;;;;1828:240:0;;:::i;896:109:1:-;2522:9:0;;-1:-1:-1;;;;;2522:9:0;2535:10;2522:23;2514:72;;;;-1:-1:-1;;;2514:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;992:6:1::1;981:17;970:8;:28:::0;896:109::o;3818:290::-;-1:-1:-1;;;;;3904:19:1;;3884:4;3904:19;;;:10;:19;;;;;;;;3900:111;;;3943:20;3955:7;3943:11;:20::i;:::-;3939:61;;;-1:-1:-1;3972:1:1;3965:8;;3939:61;-1:-1:-1;3999:1:1;3992:8;;3939:61;-1:-1:-1;;;;;4025:23:1;;;;;;:14;:23;;;;;;;;4021:62;;;-1:-1:-1;4071:1:1;4064:8;;4021:62;-1:-1:-1;4100:1:1;3818:290;;;;:::o;1011:105::-;2522:9:0;;-1:-1:-1;;;;;2522:9:0;2535:10;2522:23;2514:72;;;;-1:-1:-1;;;2514:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1092:8:1::1;:17:::0;1011:105::o;488:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;488:41:1;;;;;;;;;;;;:::o;3339:418::-;-1:-1:-1;;;;;3445:19:1;;3398:4;3445:19;;;:10;:19;;;;;;;;3440:63;;-1:-1:-1;3487:5:1;3480:12;;3440:63;-1:-1:-1;;;;;3543:14:1;;;;;;:5;:14;;;;;:22;;;;;3538:66;;-1:-1:-1;3588:5:1;3581:12;;3538:66;-1:-1:-1;;;;;3668:14:1;;;;;;:5;:14;;;;;:22;;;3650:15;:40;3646:83;;;-1:-1:-1;3713:5:1;3706:12;;3646:83;-1:-1:-1;3746:4:1;3339:418;;;:::o;241:33::-;;;;:::o;2718:113:0:-;1125:12;:10;:12::i;:::-;1115:6;;-1:-1:-1;;;;;1115:6:0;;;:22;;;1107:67;;;;;-1:-1:-1;;;1107:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2793:31:::1;2811:12;2793:17;:31::i;:::-;2718:113:::0;:::o;2325:630:1:-;2381:10;2370:22;;;;:10;:22;;;;;;;;2369:23;2361:65;;;;;-1:-1:-1;;;2361:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;2456:10;;2507:16;;;2456:68;;;-1:-1:-1;;;2456:68:1;;2480:10;2456:68;;;;;;;2500:4;2456:68;;;;;;;;;;;;-1:-1:-1;;;;;2456:10:1;;;;:23;;:68;;;;;;;;;;;;;;;:10;;:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2556:20:1;;-1:-1:-1;2556:20:1;:::i;:::-;-1:-1:-1;2579:213:1;;;;;;;;2611:10;2579:213;;;2688:16;;;2579:213;;;;;;;2646:15;2579:213;;;;;;2745:8;;;2727:26;;;2579:213;;;;;;-1:-1:-1;2579:213:1;;;;;;2803:17;;;:5;:17;;;;;:24;;;;-1:-1:-1;;;;;2803:24:1;;;;-1:-1:-1;;;;;;2803:24:1;;;;;;;;2579:213;2803:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2803:24:1;;;;;;2837:10;:22;;;;;:29;;;;;;;;2884:9;:21;;;;;2877:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2922:14;:26;;;;;;2915:33;;;;;;;2325:630::o;2961:372::-;3008:23;3020:10;3008:11;:23::i;:::-;3000:52;;;;;-1:-1:-1;;;3000:52:1;;;;;;;;;;;;-1:-1:-1;;;3000:52:1;;;;;;;;;;;;;;;3106:10;3118:17;;;;:5;:17;;;;;:29;;;3082:10;;:66;;-1:-1:-1;;;;;3082:10:1;;;;:23;:66::i;:::-;3194:10;3188:17;;;;:5;:17;;;;;;;;3181:24;;-1:-1:-1;;;;;;3181:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3181:24:1;;;;;;3222:10;:22;;;;;3215:29;;;;;;3262:9;:21;;;;;3255:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3300:14;:26;;;;;;3293:33;;;;;;;2961:372::o;2610:98:0:-;2692:9;;2653:4;;-1:-1:-1;;;;;2692:9:0;2676:12;:10;:12::i;:::-;-1:-1:-1;;;;;2676:25:0;;2669:32;;2610:98;:::o;210:24:1:-;;;-1:-1:-1;;;;;210:24:1;;:::o;2383:83:0:-;2450:9;;-1:-1:-1;;;;;2450:9:0;2383:83;:::o;635:46:1:-;;;;;;;;;;;;;;;:::o;535:42::-;;;;;;;;;;;;;;;:::o;1534:145:0:-;1125:12;:10;:12::i;:::-;1115:6;;-1:-1:-1;;;;;1115:6:0;;;:22;;;1107:67;;;;;-1:-1:-1;;;1107:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1640:1:::1;1624:6:::0;;1603:40:::1;::::0;-1:-1:-1;;;;;1624:6:0;;::::1;::::0;1603:40:::1;::::0;1640:1;;1603:40:::1;1670:1;1653:19:::0;;-1:-1:-1;;;;;;1653:19:0::1;::::0;;1534:145::o;1262:1057:1:-;2522:9:0;;-1:-1:-1;;;;;2522:9:0;2535:10;2522:23;2514:72;;;;-1:-1:-1;;;2514:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1377:19:1;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;1369:52;;;::::0;;-1:-1:-1;;;1369:52:1;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;1369:52:1;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1472:14:1;::::1;;::::0;;;:5:::1;:14;::::0;;;;:22:::1;;::::0;1453:15:::1;:41;;1432:126;;;;-1:-1:-1::0;;;1432:126:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1606:7;1602:711;;;-1:-1:-1::0;;;;;1629:14:1;::::1;;::::0;;;:5:::1;:14;::::0;;;;:22:::1;;:32:::0;;-1:-1:-1;;1629:32:1::1;::::0;::::1;;;::::0;;1602:711:::1;;;-1:-1:-1::0;;;;;1802:14:1;;::::1;;::::0;;;:5:::1;:14;::::0;;;;:26:::1;;::::0;1766:10:::1;::::0;:63:::1;::::0;:10:::1;::::0;1790::::1;::::0;1766:23:::1;:63::i;:::-;1871:20;;:::i;:::-;-1:-1:-1::0;1894:249:1::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;1894:249:1;;::::1;::::0;;;-1:-1:-1;2021:14:1;;;:5:::1;1894:249;2021:14:::0;;;;;;:26:::1;::::0;;::::1;::::0;;1894:249;;::::1;::::0;;;1966:24:::1;::::0;;::::1;::::0;;1894:249;;;;;;2074:22:::1;::::0;;::::1;::::0;;1894:249;;;;;;;;;;;;2157:18;;;:9:::1;:18:::0;;;;;:25;;;;;::::1;-1:-1:-1::0;;;;;;2157:25:1;;::::1;;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;2157:25:1;;::::1;;::::0;;2196:14:::1;:23:::0;;;;;:30;;;::::1;::::0;;::::1;::::0;;;2241:21;;;;::::1;::::0;;;;;;;;;;;;;;;;::::1;::::0;;;::::1;::::0;;2283:10:::1;:19:::0;;;;;;;2276:26;;;;::::1;::::0;;1602:711:::1;1262:1057:::0;;:::o;911:77:0:-;949:7;975:6;-1:-1:-1;;;;;975:6:0;911:77;:::o;1122:134:1:-;2522:9:0;;-1:-1:-1;;;;;2522:9:0;2535:10;2522:23;2514:72;;;;-1:-1:-1;;;2514:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1181:10:1::1;::::0;1213:35:::1;::::0;;-1:-1:-1;;;1213:35:1;;1242:4:::1;1213:35;::::0;::::1;::::0;;;-1:-1:-1;;;;;1181:10:1;;::::1;::::0;:19:::1;::::0;1201:10:::1;::::0;1181;;1213:20:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;1181:10;1213:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;1213:35:1;1181:68:::1;::::0;;-1:-1:-1;;;;;;1181:68:1::1;::::0;;;;;;-1:-1:-1;;;;;1181:68:1;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;1213:35:::1;::::0;1181:68;;;;;;;-1:-1:-1;1181:68:1;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;784:106:::0;2522:9:0;;-1:-1:-1;;;;;2522:9:0;2535:10;2522:23;2514:72;;;;-1:-1:-1;;;2514:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;857:10:1::1;:26:::0;;-1:-1:-1;;;;;;857:26:1::1;-1:-1:-1::0;;;;;857:26:1;;;::::1;::::0;;;::::1;::::0;;784:106::o;280:44::-;;;;:::o;584:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;584:45:1;;;;;;;;;;;;:::o;1828:240:0:-;1125:12;:10;:12::i;:::-;1115:6;;-1:-1:-1;;;;;1115:6:0;;;:22;;;1107:67;;;;;-1:-1:-1;;;1107:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1916:22:0;::::1;1908:73;;;;-1:-1:-1::0;;;1908:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2017:6;::::0;;1996:38:::1;::::0;-1:-1:-1;;;;;1996:38:0;;::::1;::::0;2017:6;::::1;::::0;1996:38:::1;::::0;::::1;2044:6;:17:::0;;-1:-1:-1;;;;;;2044:17:0::1;-1:-1:-1::0;;;;;2044:17:0;;;::::1;::::0;;;::::1;::::0;;1828:240::o;92:104::-;179:10;92:104;:::o;2837:287::-;-1:-1:-1;;;;;2926:26:0;;2905:118;;;;-1:-1:-1;;;2905:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3038:45;;-1:-1:-1;;;;;3038:45:0;;;3066:1;;3038:45;;3066:1;;3038:45;3093:9;:24;;-1:-1:-1;;;;;;3093:24:0;-1:-1:-1;;;;;3093:24:0;;;;;;;;;;2837:287::o;5833:239:3:-;5997:58;;;-1:-1:-1;;;;;5997:58:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5997:58:3;-1:-1:-1;;;5997:58:3;;;5945:120;;5978:5;;5945:19;:120::i;:::-;5833:239;;;:::o;8631:867::-;9050:23;9088:115;9133:4;9088:115;;;;;;;;;;;;;;;;;9096:5;-1:-1:-1;;;;;9088:27:3;;;:115;;;;;:::i;:::-;9217:17;;9050:153;;-1:-1:-1;9217:21:3;9213:279;;9386:10;9375:30;;;;;;;;;;;;;;;-1:-1:-1;9375:30:3;9350:131;;;;-1:-1:-1;;;9350:131:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3764:224;3897:12;3928:53;3951:6;3959:4;3965:1;3968:12;3928:22;:53::i;:::-;3921:60;3764:224;-1:-1:-1;;;;3764:224:3:o;4735:1006::-;4903:12;4935:18;4946:6;4935:10;:18::i;:::-;4927:60;;;;;-1:-1:-1;;;4927:60:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;5058:12;5072:23;5111:6;-1:-1:-1;;;;;5111:11:3;5130:8;5140:4;5111:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5111:34:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5057:88;;;;5159:7;5155:580;;;5189:10;-1:-1:-1;5182:17:3;;-1:-1:-1;5182:17:3;5155:580;5300:17;;:21;5296:429;;5558:10;5552:17;5618:15;5605:10;5601:2;5597:19;5590:44;5507:145;5697:12;5690:20;;-1:-1:-1;;;5690:20:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2663:433;3035:20;3081:8;;;2663:433::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://fd1ed5e177cb91ac639308087b3237acf8bcf5e1867a3dc88b6182ad6810d6ac
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading