Contract 0x19d054836192200c71eec12bc9f255b1fae8ee80

Contract Overview

Balance:
0 HT

HT Value:
$0.00

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0x528c8ff144690b908ad3d36dff4ec54d218d20c901de4c872e2c64677e20978155516922021-06-13 1:46:407 secs ago0xd58726046e0ce39d226a6b4c0f2697e3b846d32b IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0x0a568aa2ce40b94549734affcc534dea2d34b9584c6b8bf5c298dfa2e83836f055516902021-06-13 1:46:3413 secs ago0x01dfb7e9c95e93d38fb9d78f8703f501b256e8cc IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0x466764ce8908e18b5e98a658569a3a69361ed277f3cabb6eff78b585b20648f855516902021-06-13 1:46:3413 secs ago0x8eb06d381718f93c0872fe1119864ddbc3abcce3 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0xb6dd61905e3400176f51f1a5a89c5100137f2bb3effb03ee1c60908e2892aa1a55516902021-06-13 1:46:3413 secs ago0x3ec27a96402b2bc7fa96b2bf15e5f34f6e8d8717 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000095642
0xec56ff0f90aebe5a0dcc155afafc2c6e73c4549e45c65183bff2d2ff6e52c38455516902021-06-13 1:46:3413 secs ago0x88a5e36087c66ba17d3430585fc163afb0f4539c IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000109729
0xedb3779a91f8a66f29a58a722afd1da341b4f2f12b89ac68b9c8347d533880e655516892021-06-13 1:46:3116 secs ago0x4a5ae36bcb0a8ee83300517adab6e31eddabc0c6 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0x5e453ac9c9d66f14f5cfbb3dafe739650c89b7c2712dbbcda020ef8c29482a1955516892021-06-13 1:46:3116 secs ago0xab06efd9a0542f077265ed527fce8ee78ede9a3f IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0xa0789de3af72ac4beb2c42ad8f5ed0a59c5ce43611960433d95786344a4c4e1055516892021-06-13 1:46:3116 secs ago0x02328bd0831ead05422e64ab0e5b7c6a7631bd57 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.0001811392
0x948dc7ba78877a0ca430eea43c16cb86760ae8356b27dbfa2abe907af29c145e55516872021-06-13 1:46:2522 secs ago0x8c15af8dbaf978e886ed1de7ff619f6d0666244e IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000095642
0x5876751c8a7e42aac708893231c9c68e96419a3465481e92a52a5d6b90668a9255516872021-06-13 1:46:2522 secs ago0x6e8016df7793d37907ca4c47f0ef978a873c9537 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0xc5a4c88e6ed3ab70f93aefeef83a96c85adca79fbd522851cec00a098b7a2f7f55516862021-06-13 1:46:2225 secs ago0x8eb06d381718f93c0872fe1119864ddbc3abcce3 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0x04474a652719b04a9ab76782b74873f5aa41df2b5948f4d7e2308df770256fca55516852021-06-13 1:46:1928 secs ago0x3ec27a96402b2bc7fa96b2bf15e5f34f6e8d8717 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0x9fa609f0dd0a141ed28471b68bbf1386a7ef0b83f5381fd25a881a8d8ae0390e55516842021-06-13 1:46:1631 secs ago0x01dfb7e9c95e93d38fb9d78f8703f501b256e8cc IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0x9af81b02e6467e1c32dafaecd7a4519b47f87f4181ac32197fd6b4c2054aff0a55516832021-06-13 1:46:1334 secs ago0x88a5e36087c66ba17d3430585fc163afb0f4539c IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000072176
0xb02f462363e9d14350739aaccfc377ee095658bb600ce185ef20e990e2e92eab55516832021-06-13 1:46:1334 secs ago0x10e4fd09db9e52f3d5df6eaf5798ae217bd9447c IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0x5db84b5376f535aadbe628c8ada7f85570475d534f1dee37e484f3ec8c1979a655516832021-06-13 1:46:1334 secs ago0x8c15af8dbaf978e886ed1de7ff619f6d0666244e IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0xd7582ac7091281d6b5dd8029507d92f8605ab643335250e46e4f9b66e2b0689355516822021-06-13 1:46:1037 secs ago0x44e608c751e1af83b7972388b3184be7d45eaa41 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000074781
0x1e57da590520bcbb26049a298d8b9d5e9308c411085f1517a9466610684d7ceb55516812021-06-13 1:46:0740 secs ago0x4a5ae36bcb0a8ee83300517adab6e31eddabc0c6 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00006181
0xfce2bfa41c1399818e06f7d7f7d278f412b08f1b384a8b6a416b89ebd25a0a0355516812021-06-13 1:46:0740 secs ago0x8cafa79c4fb423e7001bcc7ddbf89e28c9058559 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0xc6c58598b26cf3dfb5c9d8edf909e839f0d24f2cc35420002f242abd6c10fdb855516802021-06-13 1:46:0443 secs ago0x97cd6e20b0bff3a4abf27727c43322a4b5e950b5 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00006181
0x2dae0b62ed3be7fb8bd5df4f0b9be271f6504e45397c93c6192f8edf8815a3ed55516802021-06-13 1:46:0443 secs ago0x02328bd0831ead05422e64ab0e5b7c6a7631bd57 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000095298
0x467f19150e708d9bba94eea974f310b4a2040b41ac61d6169be3ab405656b91c55516792021-06-13 1:46:0146 secs ago0xc6e1036fdde967fcb02be77568da7cbae6d2310e IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00009563
0x525c8d010164af7fbd0191eec97504885bd3868e28a052563849ca040a330e3655516792021-06-13 1:46:0146 secs ago0xe9785edd56022a6a7de988e7ea579d42addb6d87 IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
0x17ff691e6e11d90e4e75f42a6fdcf8ec24a0743dd02fcbc6227b7036775fce6855516752021-06-13 1:45:4958 secs ago0x10e4fd09db9e52f3d5df6eaf5798ae217bd9447c IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.00006181
0xf41c3f7ae9fbbe0e9bb629da745e6df1b8c949752d232bff700cf2813c5d380a55516752021-06-13 1:45:4958 secs ago0xc6e1036fdde967fcb02be77568da7cbae6d2310e IN  0x19d054836192200c71eec12bc9f255b1fae8ee800 HT0.000079415
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AirdropMDX

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-02-25
*/

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

abstract 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 () internal {
        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;
    }
}

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on 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;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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 SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    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;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be 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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }
}


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

    struct UserInfo {
        uint256 amount;
        uint256 rewardDebt;
    }

    struct PoolInfo {
        IERC20 lpToken;
        uint256 allocPoint;
        uint256 lastRewardBlock;
        uint256 accMDXPerShare;
        uint256 mdxAmount;
    }

    address public mdx;
    // Airdrop tokens for per block.
    uint256 public mdxPerBlock;
    // Info of each pool.
    PoolInfo[] public poolInfo;
    // Info of each user that stakes LP tokens.
    mapping(uint256 => mapping(address => UserInfo)) public userInfo;
    // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalAllocPoint = 0;
    // The block number when mdx mining starts.
    uint256 public startBlock;
    // The block number when mdx mining end;
    uint256 public endBlock;
    // Airdrop cycle default 1day
    uint256 public cycle;

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

    constructor(
        address _mdx,
        uint256 _cycle
    ) public {
        mdx = _mdx;
        cycle = _cycle;
    }

    function poolLength() external view returns (uint256) {
        return poolInfo.length;
    }

    function newAirdrop(uint256 _mdxAmount, uint256 _newPerBlock, uint256 _startBlock) public onlyOwner {
        require(block.number > endBlock && _startBlock >= endBlock, "Not finished");
        massUpdatePools();
        uint256 beforeAmount = IERC20(mdx).balanceOf(address(this));
        TransferHelper.safeTransferFrom(mdx, msg.sender, address(this), _mdxAmount);
        uint256 afterAmount = IERC20(mdx).balanceOf(address(this));
        uint256 balance = afterAmount.sub(beforeAmount);
        require(balance == _mdxAmount, "Error balance");
        require(balance > 0 && (cycle * _newPerBlock) <= balance, "Balance not enough");
        mdxPerBlock = _newPerBlock;
        startBlock = _startBlock;
        endBlock = _startBlock.add(cycle);
        updatePoolLastRewardBlock(_startBlock);
    }

    function updatePoolLastRewardBlock(uint256 _lastRewardBlock) private {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            PoolInfo storage pool = poolInfo[pid];
            pool.lastRewardBlock = _lastRewardBlock;
        }
    }

    function setCycle(uint256 _newCycle) public onlyOwner {
        cycle = _newCycle;
    }

    // Add a new lp to the pool. Can only be called by the owner.
    // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do.
    function add(uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate) public onlyOwner {
        require(address(_lpToken) != address(0), "lpToken is the zero address");
        if (_withUpdate) {
            massUpdatePools();
        }
        uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock;
        totalAllocPoint = totalAllocPoint.add(_allocPoint);
        poolInfo.push(PoolInfo({
        lpToken : _lpToken,
        allocPoint : _allocPoint,
        lastRewardBlock : lastRewardBlock,
        accMDXPerShare : 0,
        mdxAmount : 0
        }));
    }

    // Update the given pool's wht allocation point. Can only be called by the owner.
    function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOwner {
        if (_withUpdate) {
            massUpdatePools();
        }
        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
    }

    // Update reward variables for all pools. Be careful of gas spending!
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; ++pid) {
            updatePool(pid);
        }
    }

    // Update reward variables of the given pool to be up-to-date.
    function updatePool(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        uint256 number = block.number > endBlock ? endBlock : block.number;
        if (number <= pool.lastRewardBlock) {
            return;
        }
        uint256 lpSupply;
        if (address(pool.lpToken) == mdx) {
            lpSupply = pool.mdxAmount;
        } else {
            lpSupply = pool.lpToken.balanceOf(address(this));
        }
        if (lpSupply == 0) {
            pool.lastRewardBlock = number;
            return;
        }
        uint256 multiplier = number.sub(pool.lastRewardBlock);
        uint256 mdxReward = multiplier.mul(mdxPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
        pool.accMDXPerShare = pool.accMDXPerShare.add(mdxReward.mul(1e12).div(lpSupply));
        pool.lastRewardBlock = number;
    }


    function pending(uint256 _pid, address _user) external view returns (uint256) {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 accMDXPerShare = pool.accMDXPerShare;
        uint256 lpSupply;
        if (address(pool.lpToken) == mdx) {
            lpSupply = pool.mdxAmount;
        } else {
            lpSupply = pool.lpToken.balanceOf(address(this));
        }
        uint256 number = block.number > endBlock ? endBlock : block.number;
        if (number > pool.lastRewardBlock && lpSupply != 0) {
            uint256 multiplier = number.sub(pool.lastRewardBlock);
            uint256 mdxReward = multiplier.mul(mdxPerBlock).mul(pool.allocPoint).div(totalAllocPoint);
            accMDXPerShare = accMDXPerShare.add(mdxReward.mul(1e12).div(lpSupply));
        }
        return user.amount.mul(accMDXPerShare).div(1e12).sub(user.rewardDebt);
    }


    // Deposit LP tokens dividends WHT;
    function deposit(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        updatePool(_pid);
        if (user.amount > 0) {
            uint256 pendingAmount = user.amount.mul(pool.accMDXPerShare).div(1e12).sub(user.rewardDebt);
            if (pendingAmount > 0) {
                safeMDXTransfer(msg.sender, pendingAmount, pool.mdxAmount);
            }
        }
        if (_amount > 0) {
            pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
            user.amount = user.amount.add(_amount);
            if (address(pool.lpToken) == mdx) {
                pool.mdxAmount = pool.mdxAmount.add(_amount);
            }
        }
        user.rewardDebt = user.amount.mul(pool.accMDXPerShare).div(1e12);
        emit Deposit(msg.sender, _pid, _amount);
    }

    // Withdraw LP tokens.
    function withdraw(uint256 _pid, uint256 _amount) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        require(user.amount >= _amount, "withdraw: not good");
        updatePool(_pid);
        uint256 pendingAmount = user.amount.mul(pool.accMDXPerShare).div(1e12).sub(user.rewardDebt);
        if (pendingAmount > 0) {
            safeMDXTransfer(msg.sender, pendingAmount, pool.mdxAmount);
        }
        if (_amount > 0) {
            user.amount = user.amount.sub(_amount);
            if (address(pool.lpToken) == mdx) {
                pool.mdxAmount = pool.mdxAmount.sub(_amount);
            }
            pool.lpToken.safeTransfer(address(msg.sender), _amount);
        }
        user.rewardDebt = user.amount.mul(pool.accMDXPerShare).div(1e12);
        emit Withdraw(msg.sender, _pid, _amount);
    }

    // Withdraw without caring about rewards. EMERGENCY ONLY.
    function emergencyWithdraw(uint256 _pid) public {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][msg.sender];
        uint256 amount = user.amount;
        user.amount = 0;
        user.rewardDebt = 0;
        if (address(pool.lpToken) == mdx) {
            pool.mdxAmount = pool.mdxAmount.sub(amount);
        }
        pool.lpToken.safeTransfer(address(msg.sender), amount);
        emit EmergencyWithdraw(msg.sender, _pid, amount);
    }

    // Safe mdx transfer function, just in case if rounding error causes pool to not have enough mdxs.
    function safeMDXTransfer(address _to, uint256 _amount, uint256 _poolMDXAmount) internal {
        uint256 mdxBalance = IERC20(mdx).balanceOf(address(this));
        mdxBalance = mdxBalance.sub(_poolMDXAmount);
        if (_amount > mdxBalance) {
            IERC20(mdx).transfer(_to, mdxBalance);
        } else {
            IERC20(mdx).transfer(_to, _amount);
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_mdx","type":"address"},{"internalType":"uint256","name":"_cycle","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mdx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdxPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mdxAmount","type":"uint256"},{"internalType":"uint256","name":"_newPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"name":"newAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accMDXPerShare","type":"uint256"},{"internalType":"uint256","name":"mdxAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCycle","type":"uint256"}],"name":"setCycle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060055534801561001557600080fd5b50604051611d50380380611d508339818101604052604081101561003857600080fd5b508051602090910151600061004b6100be565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b0393909316929092179091556008556100c2565b3390565b611c7f806100d16000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636190c9d5116100b85780638da5cb5b1161007c5780638da5cb5b1461030b5780638fa39a881461031357806393f1a40b1461031b578063e2bbb15814610360578063e4c75c2714610383578063f2fde38b146103af57610142565b80636190c9d5146102ab578063630b5ba1146102b357806364482f79146102bb5780636d93c3ba146102e6578063715018a61461030357610142565b8063441a3e701161010a578063441a3e70146101f957806348cd4cb11461021c5780634ebe495c1461022457806351eb05a61461024d5780635312ea8e1461026a5780635672ab551461028757610142565b8063081e3eda14610147578063083c6323146101615780631526fe271461016957806317caf6f1146101bb5780631eaaa045146101c3575b600080fd5b61014f6103d5565b60408051918252519081900360200190f35b61014f6103db565b6101866004803603602081101561017f57600080fd5b50356103e1565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b61014f610429565b6101f7600480360360608110156101d957600080fd5b508035906001600160a01b036020820135169060400135151561042f565b005b6101f76004803603604081101561020f57600080fd5b5080359060200135610636565b61014f6107c7565b6101f76004803603606081101561023a57600080fd5b50803590602081013590604001356107cd565b6101f76004803603602081101561026357600080fd5b5035610a63565b6101f76004803603602081101561028057600080fd5b5035610bd6565b61028f610c9f565b604080516001600160a01b039092168252519081900360200190f35b61014f610cae565b6101f7610cb4565b6101f7600480360360608110156102d157600080fd5b50803590602081013590604001351515610cd7565b6101f7600480360360208110156102fc57600080fd5b5035610da8565b6101f7610e05565b61028f610ea7565b61014f610eb6565b6103476004803603604081101561033157600080fd5b50803590602001356001600160a01b0316610ebc565b6040805192835260208301919091528051918290030190f35b6101f76004803603604081101561037657600080fd5b5080359060200135610ee0565b61014f6004803603604081101561039957600080fd5b50803590602001356001600160a01b0316611023565b6101f7600480360360208110156103c557600080fd5b50356001600160a01b03166111cb565b60035490565b60075481565b600381815481106103ee57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60055481565b6104376112c3565b6000546001600160a01b03908116911614610487576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b6001600160a01b0382166104e2576040805162461bcd60e51b815260206004820152601b60248201527f6c70546f6b656e20697320746865207a65726f20616464726573730000000000604482015290519081900360640190fd5b80156104f0576104f0610cb4565b6000600654431161050357600654610505565b435b60055490915061051590856112c7565b60059081556040805160a0810182526001600160a01b039586168152602081019687529081019283526000606082018181526080830182815260038054600181018255935292517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9290940291820180546001600160a01b031916949097169390931790955594517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c85015590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d840155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85e8301555090517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85f90910155565b60006003838154811061064557fe5b6000918252602080832086845260048252604080852033865290925292208054600590920290920192508311156106b8576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b6106c184610a63565b60006106fb82600101546106f564e8d4a510006106ef8760030154876000015461132890919063ffffffff16565b90611381565b906113c3565b905080156107125761071233828560040154611405565b831561076957815461072490856113c3565b825560015483546001600160a01b039081169116141561075357600483015461074d90856113c3565b60048401555b8254610769906001600160a01b031633866115a0565b600383015482546107849164e8d4a51000916106ef91611328565b6001830155604080518581529051869133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a35050505050565b60065481565b6107d56112c3565b6000546001600160a01b03908116911614610825576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b6007544311801561083857506007548110155b610878576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08199a5b9a5cda195960a21b604482015290519081900360640190fd5b610880610cb4565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156108cb57600080fd5b505afa1580156108df573d6000803e3d6000fd5b505050506040513d60208110156108f557600080fd5b5051600154909150610912906001600160a01b03163330876115f7565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561095d57600080fd5b505afa158015610971573d6000803e3d6000fd5b505050506040513d602081101561098757600080fd5b50519050600061099782846113c3565b90508581146109dd576040805162461bcd60e51b815260206004820152600d60248201526c4572726f722062616c616e636560981b604482015290519081900360640190fd5b6000811180156109f1575080856008540211155b610a37576040805162461bcd60e51b8152602060048201526012602482015271084c2d8c2dcc6ca40dcdee840cadcdeeaced60731b604482015290519081900360640190fd5b60028590556006849055600854610a4f9085906112c7565b600755610a5b8461174c565b505050505050565b600060038281548110610a7257fe5b9060005260206000209060050201905060006007544311610a935743610a97565b6007545b905081600201548111610aab575050610bd3565b60015482546000916001600160a01b0391821691161415610ad157506004820154610b4a565b8254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610b1b57600080fd5b505afa158015610b2f573d6000803e3d6000fd5b505050506040513d6020811015610b4557600080fd5b505190505b80610b5b5750600290910155610bd3565b6000610b748460020154846113c390919063ffffffff16565b90506000610ba16005546106ef8760010154610b9b6002548761132890919063ffffffff16565b90611328565b9050610bc4610bb9846106ef8464e8d4a51000611328565b6003870154906112c7565b60038601555050506002909101555b50565b600060038281548110610be557fe5b6000918252602080832085845260048252604080852033865290925290832080548482556001808301959095559354600590930290910180549094509092916001600160a01b0391821691161415610c4c576004830154610c4690826113c3565b60048401555b8254610c62906001600160a01b031633836115a0565b604080518281529051859133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050565b6001546001600160a01b031681565b60085481565b60035460005b81811015610cd357610ccb81610a63565b600101610cba565b5050565b610cdf6112c3565b6000546001600160a01b03908116911614610d2f576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b8015610d3d57610d3d610cb4565b610d7a82610d7460038681548110610d5157fe5b9060005260206000209060050201600101546005546113c390919063ffffffff16565b906112c7565b6005819055508160038481548110610d8e57fe5b906000526020600020906005020160010181905550505050565b610db06112c3565b6000546001600160a01b03908116911614610e00576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b600855565b610e0d6112c3565b6000546001600160a01b03908116911614610e5d576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b60025481565b60046020908152600092835260408084209091529082529020805460019091015482565b600060038381548110610eef57fe5b60009182526020808320868452600482526040808520338652909252922060059091029091019150610f2084610a63565b805415610f6e576000610f5582600101546106f564e8d4a510006106ef8760030154876000015461132890919063ffffffff16565b90508015610f6c57610f6c33828560040154611405565b505b8215610fc6578154610f8b906001600160a01b0316333086611788565b8054610f9790846112c7565b815560015482546001600160a01b0390811691161415610fc6576004820154610fc090846112c7565b60048301555b60038201548154610fe19164e8d4a51000916106ef91611328565b6001820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a350505050565b6000806003848154811061103357fe5b600091825260208083208784526004825260408085206001600160a01b0389811687529352842060059390930201600381015460015482549296509394909390929081169116141561108a57506004830154611103565b8354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156110d457600080fd5b505afa1580156110e8573d6000803e3d6000fd5b505050506040513d60208110156110fe57600080fd5b505190505b600060075443116111145743611118565b6007545b905084600201548111801561112c57508115155b1561119557600061114a8660020154836113c390919063ffffffff16565b905060006111716005546106ef8960010154610b9b6002548761132890919063ffffffff16565b9050611190611189856106ef8464e8d4a51000611328565b86906112c7565b945050505b6111bd84600101546106f564e8d4a510006106ef87896000015461132890919063ffffffff16565b955050505050505b92915050565b6111d36112c3565b6000546001600160a01b03908116911614611223576040805162461bcd60e51b81526020600482018190526024820152600080516020611bdc833981519152604482015290519081900360640190fd5b6001600160a01b0381166112685760405162461bcd60e51b8152600401808060200182810382526026815260200180611b6f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b600082820183811015611321576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082611337575060006111c5565b8282028284828161134457fe5b04146113215760405162461bcd60e51b8152600401808060200182810382526021815260200180611bbb6021913960400191505060405180910390fd5b600061132183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117e2565b600061132183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611884565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d602081101561147a57600080fd5b5051905061148881836113c3565b90508083111561151a576001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505050506040513d602081101561151257600080fd5b5061159a9050565b6001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561157057600080fd5b505af1158015611584573d6000803e3d6000fd5b505050506040513d6020811015610a5b57600080fd5b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115f29084906118de565b505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061167c5780518252601f19909201916020918201910161165d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146116de576040519150601f19603f3d011682016040523d82523d6000602084013e6116e3565b606091505b5091509150818015611711575080511580611711575080806020019051602081101561170e57600080fd5b50515b610a5b5760405162461bcd60e51b8152600401808060200182810382526024815260200180611c266024913960400191505060405180910390fd5b60035460005b818110156115f25760006003828154811061176957fe5b6000918252602090912060026005909202010184905550600101611752565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261159a9085906118de565b6000818361186e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561183357818101518382015260200161181b565b50505050905090810190601f1680156118605780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161187a57fe5b0495945050505050565b600081848411156118d65760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561183357818101518382015260200161181b565b505050900390565b6060611933826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661198f9092919063ffffffff16565b8051909150156115f25780806020019051602081101561195257600080fd5b50516115f25760405162461bcd60e51b815260040180806020018281038252602a815260200180611bfc602a913960400191505060405180910390fd5b606061199e84846000856119a6565b949350505050565b6060824710156119e75760405162461bcd60e51b8152600401808060200182810382526026815260200180611b956026913960400191505060405180910390fd5b6119f085611b02565b611a41576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611a805780518252601f199092019160209182019101611a61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ae2576040519150601f19603f3d011682016040523d82523d6000602084013e611ae7565b606091505b5091509150611af7828286611b08565b979650505050505050565b3b151590565b60608315611b17575081611321565b825115611b275782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561183357818101518382015260200161181b56fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a264697066735822122001813133947f7464361eb0232a954a6a7778415f3c8a2da4517d71f532450e7d64736f6c634300060c003300000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000000000000000007080

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

00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c0000000000000000000000000000000000000000000000000000000000007080

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000025d2e80cb6b86881fd7e07dd263fb79f4abe033c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000007080


Deployed ByteCode Sourcemap

20721:8992:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22106:95;;;:::i;:::-;;;;;;;;;;;;;;;;21626:23;;;:::i;21217:26::-;;;;;;;;;;;;;;;;-1:-1:-1;21217:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;21217:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21458:34;;;:::i;23593:606::-;;;;;;;;;;;;;;;;-1:-1:-1;23593:606:0;;;-1:-1:-1;;;;;23593:606:0;;;;;;;;;;;;:::i;:::-;;27743:900;;;;;;;;;;;;;;;;-1:-1:-1;27743:900:0;;;;;;;:::i;21548:25::-;;;:::i;22209:818::-;;;;;;;;;;;;;;;;-1:-1:-1;22209:818:0;;;;;;;;;;;;:::i;24937:859::-;;;;;;;;;;;;;;;;-1:-1:-1;24937:859:0;;:::i;28714:499::-;;;;;;;;;;;;;;;;-1:-1:-1;28714:499:0;;:::i;21094:18::-;;;:::i;:::-;;;;-1:-1:-1;;;;;21094:18:0;;;;;;;;;;;;;;21691:20;;;:::i;24681:180::-;;;:::i;24294:304::-;;;;;;;;;;;;;;;;-1:-1:-1;24294:304:0;;;;;;;;;;;;;;:::i;23334:90::-;;;;;;;;;;;;;;;;-1:-1:-1;23334:90:0;;:::i;1599:148::-;;;:::i;957:79::-;;;:::i;21157:26::-;;;:::i;21299:64::-;;;;;;;;;;;;;;;;-1:-1:-1;21299:64:0;;;;;;-1:-1:-1;;;;;21299:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26795:912;;;;;;;;;;;;;;;;-1:-1:-1;26795:912:0;;;;;;;:::i;25806:938::-;;;;;;;;;;;;;;;;-1:-1:-1;25806:938:0;;;;;;-1:-1:-1;;;;;25806:938:0;;:::i;1902:244::-;;;;;;;;;;;;;;;;-1:-1:-1;1902:244:0;-1:-1:-1;;;;;1902:244:0;;:::i;22106:95::-;22178:8;:15;22106:95;:::o;21626:23::-;;;;:::o;21217:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21217:26:0;;;;-1:-1:-1;21217:26:0;;;;;:::o;21458:34::-;;;;:::o;23593:606::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23698:31:0;::::1;23690:71;;;::::0;;-1:-1:-1;;;23690:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23776:11;23772:61;;;23804:17;:15;:17::i;:::-;23843:23;23884:10;;23869:12;:25;:53;;23912:10;;23869:53;;;23897:12;23869:53;23951:15;::::0;23843:79;;-1:-1:-1;23951:32:0::1;::::0;23971:11;23951:19:::1;:32::i;:::-;23933:15;:50:::0;;;24008:182:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24008:182:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;24008:182:0;;;;;;;;;;;;23994:8:::1;:197:::0;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;23994:197:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23994:197:0;;;;;;;23593:606::o;27743:900::-;27810:21;27834:8;27843:4;27834:14;;;;;;;;;;;;;;;;27883;;;:8;:14;;;;;;27898:10;27883:26;;;;;;;27928:11;;27834:14;;;;;;;;-1:-1:-1;27928:22:0;-1:-1:-1;27928:22:0;27920:53;;;;;-1:-1:-1;;;27920:53:0;;;;;;;;;;;;-1:-1:-1;;;27920:53:0;;;;;;;;;;;;;;;27984:16;27995:4;27984:10;:16::i;:::-;28011:21;28035:67;28086:4;:15;;;28035:46;28076:4;28035:36;28051:4;:19;;;28035:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46::i;:::-;:50;;:67::i;:::-;28011:91;-1:-1:-1;28117:17:0;;28113:108;;28151:58;28167:10;28179:13;28194:4;:14;;;28151:15;:58::i;:::-;28235:11;;28231:279;;28277:11;;:24;;28293:7;28277:15;:24::i;:::-;28263:38;;28345:3;;28328:12;;-1:-1:-1;;;;;28328:12:0;;;28345:3;;28320:28;28316:113;;;28386:14;;;;:27;;28405:7;28386:18;:27::i;:::-;28369:14;;;:44;28316:113;28443:12;;:55;;-1:-1:-1;;;;;28443:12:0;28477:10;28490:7;28443:25;:55::i;:::-;28554:19;;;;28538:11;;:46;;28579:4;;28538:36;;:15;:36::i;:46::-;28520:15;;;:64;28600:35;;;;;;;;28621:4;;28609:10;;28600:35;;;;;;;;;27743:900;;;;;:::o;21548:25::-;;;;:::o;22209:818::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;22343:8:::1;;22328:12;:23;:50;;;;;22370:8;;22355:11;:23;;22328:50;22320:75;;;::::0;;-1:-1:-1;;;22320:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22320:75:0;;;;;;;;;;;;;::::1;;22406:17;:15;:17::i;:::-;22464:3;::::0;22457:36:::1;::::0;;-1:-1:-1;;;22457:36:0;;22487:4:::1;22457:36;::::0;::::1;::::0;;;22434:20:::1;::::0;-1:-1:-1;;;;;22464:3:0::1;::::0;22457:21:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;22464:3;22457:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22457:36:0;22536:3:::1;::::0;22457:36;;-1:-1:-1;22504:75:0::1;::::0;-1:-1:-1;;;;;22536:3:0::1;22541:10;22561:4;22568:10:::0;22504:31:::1;:75::i;:::-;22619:3;::::0;22612:36:::1;::::0;;-1:-1:-1;;;22612:36:0;;22642:4:::1;22612:36;::::0;::::1;::::0;;;22590:19:::1;::::0;-1:-1:-1;;;;;22619:3:0::1;::::0;22612:21:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;22619:3;22612:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22612:36:0;;-1:-1:-1;22659:15:0::1;22677:29;22612:36:::0;22693:12;22677:15:::1;:29::i;:::-;22659:47;;22736:10;22725:7;:21;22717:47;;;::::0;;-1:-1:-1;;;22717:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22717:47:0;;;;;;;;;;;;;::::1;;22793:1;22783:7;:11;:48;;;;;22824:7;22807:12;22799:5;;:20;22798:33;;22783:48;22775:79;;;::::0;;-1:-1:-1;;;22775:79:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;22775:79:0;;;;;;;;;;;;;::::1;;22865:11;:26:::0;;;22902:10:::1;:24:::0;;;22964:5:::1;::::0;22948:22:::1;::::0;22915:11;;22948:15:::1;:22::i;:::-;22937:8;:33:::0;22981:38:::1;23007:11:::0;22981:25:::1;:38::i;:::-;1239:1;;;22209:818:::0;;;:::o;24937:859::-;24989:21;25013:8;25022:4;25013:14;;;;;;;;;;;;;;;;;;24989:38;;25038:14;25070:8;;25055:12;:23;:49;;25092:12;25055:49;;;25081:8;;25055:49;25038:66;;25129:4;:20;;;25119:6;:30;25115:69;;25166:7;;;;25115:69;25250:3;;25233:12;;25194:16;;-1:-1:-1;;;;;25233:12:0;;;25250:3;;25225:28;25221:167;;;-1:-1:-1;25281:14:0;;;;25221:167;;;25339:12;;:37;;;-1:-1:-1;;;25339:37:0;;25370:4;25339:37;;;;;;-1:-1:-1;;;;;25339:12:0;;;;:22;;:37;;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25339:37:0;;-1:-1:-1;25221:167:0;25402:13;25398:96;;-1:-1:-1;25432:20:0;;;;:29;25476:7;;25398:96;25504:18;25525:32;25536:4;:20;;;25525:6;:10;;:32;;;;:::i;:::-;25504:53;;25568:17;25588:69;25641:15;;25588:48;25620:4;:15;;;25588:27;25603:11;;25588:10;:14;;:27;;;;:::i;:::-;:31;;:48::i;:69::-;25568:89;-1:-1:-1;25690:58:0;25714:33;25738:8;25714:19;25568:89;25728:4;25714:13;:19::i;:33::-;25690:19;;;;;:23;:58::i;:::-;25668:19;;;:80;-1:-1:-1;;;25759:20:0;;;;:29;24937:859;;:::o;28714:499::-;28773:21;28797:8;28806:4;28797:14;;;;;;;;;;;;;;;;28846;;;:8;:14;;;;;;28861:10;28846:26;;;;;;;;28900:11;;28922:15;;;-1:-1:-1;28948:15:0;;;:19;;;;29007:3;;28797:14;;;;;;;28990:12;;28797:14;;-1:-1:-1;28846:26:0;;28900:11;-1:-1:-1;;;;;28990:12:0;;;29007:3;;28982:28;28978:104;;;29044:14;;;;:26;;29063:6;29044:18;:26::i;:::-;29027:14;;;:43;28978:104;29092:12;;:54;;-1:-1:-1;;;;;29092:12:0;29126:10;29139:6;29092:25;:54::i;:::-;29162:43;;;;;;;;29192:4;;29180:10;;29162:43;;;;;;;;;28714:499;;;;:::o;21094:18::-;;;-1:-1:-1;;;;;21094:18:0;;:::o;21691:20::-;;;;:::o;24681:180::-;24743:8;:15;24726:14;24769:85;24797:6;24791:3;:12;24769:85;;;24827:15;24838:3;24827:10;:15::i;:::-;24805:5;;24769:85;;;;24681:180;:::o;24294:304::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;24392:11:::1;24388:61;;;24420:17;:15;:17::i;:::-;24477:63;24528:11;24477:46;24497:8;24506:4;24497:14;;;;;;;;;;;;;;;;;;:25;;;24477:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;24459:15;:81;;;;24579:11;24551:8;24560:4;24551:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;24294:304:::0;;;:::o;23334:90::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;23399:5:::1;:17:::0;23334:90::o;1599:148::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;1706:1:::1;1690:6:::0;;1669:40:::1;::::0;-1:-1:-1;;;;;1690:6:0;;::::1;::::0;1669:40:::1;::::0;1706:1;;1669:40:::1;1737:1;1720:19:::0;;-1:-1:-1;;;;;;1720:19:0::1;::::0;;1599:148::o;957:79::-;995:7;1022:6;-1:-1:-1;;;;;1022:6:0;957:79;:::o;21157:26::-;;;;:::o;21299:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26795:912::-;26861:21;26885:8;26894:4;26885:14;;;;;;;;;;;;;;;;26934;;;:8;:14;;;;;;26949:10;26934:26;;;;;;;26885:14;;;;;;;;-1:-1:-1;26971:16:0;26943:4;26971:10;:16::i;:::-;27002:11;;:15;26998:269;;27034:21;27058:67;27109:4;:15;;;27058:46;27099:4;27058:36;27074:4;:19;;;27058:4;:11;;;:15;;:36;;;;:::i;:67::-;27034:91;-1:-1:-1;27144:17:0;;27140:116;;27182:58;27198:10;27210:13;27225:4;:14;;;27182:15;:58::i;:::-;26998:269;;27281:11;;27277:298;;27309:12;;:74;;-1:-1:-1;;;;;27309:12:0;27347:10;27368:4;27375:7;27309:29;:74::i;:::-;27412:11;;:24;;27428:7;27412:15;:24::i;:::-;27398:38;;27480:3;;27463:12;;-1:-1:-1;;;;;27463:12:0;;;27480:3;;27455:28;27451:113;;;27521:14;;;;:27;;27540:7;27521:18;:27::i;:::-;27504:14;;;:44;27451:113;27619:19;;;;27603:11;;:46;;27644:4;;27603:36;;:15;:36::i;:46::-;27585:15;;;:64;27665:34;;;;;;;;27685:4;;27673:10;;27665:34;;;;;;;;;26795:912;;;;:::o;25806:938::-;25875:7;25895:21;25919:8;25928:4;25919:14;;;;;;;;;;;;;;;;25968;;;:8;:14;;;;;;-1:-1:-1;;;;;25968:21:0;;;;;;;;;25919:14;;;;;;26025:19;;;;26111:3;;26094:12;;25919:14;;-1:-1:-1;25968:21:0;;26025:19;;25919:14;;26111:3;;;26094:12;;26086:28;26082:167;;;-1:-1:-1;26142:14:0;;;;26082:167;;;26200:12;;:37;;;-1:-1:-1;;;26200:37:0;;26231:4;26200:37;;;;;;-1:-1:-1;;;;;26200:12:0;;;;:22;;:37;;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26200:37:0;;-1:-1:-1;26082:167:0;26259:14;26291:8;;26276:12;:23;:49;;26313:12;26276:49;;;26302:8;;26276:49;26259:66;;26349:4;:20;;;26340:6;:29;:46;;;;-1:-1:-1;26373:13:0;;;26340:46;26336:321;;;26403:18;26424:32;26435:4;:20;;;26424:6;:10;;:32;;;;:::i;:::-;26403:53;;26471:17;26491:69;26544:15;;26491:48;26523:4;:15;;;26491:27;26506:11;;26491:10;:14;;:27;;;;:::i;:69::-;26471:89;-1:-1:-1;26592:53:0;26611:33;26635:8;26611:19;26471:89;26625:4;26611:13;:19::i;:33::-;26592:14;;:18;:53::i;:::-;26575:70;;26336:321;;;26674:62;26720:4;:15;;;26674:41;26710:4;26674:31;26690:14;26674:4;:11;;;:15;;:31;;;;:::i;:62::-;26667:69;;;;;;;25806:938;;;;;:::o;1902:244::-;1179:12;:10;:12::i;:::-;1169:6;;-1:-1:-1;;;;;1169:6:0;;;:22;;;1161:67;;;;;-1:-1:-1;;;1161:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1161:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;1991:22:0;::::1;1983:73;;;;-1:-1:-1::0;;;1983:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2093:6;::::0;;2072:38:::1;::::0;-1:-1:-1;;;;;2072:38:0;;::::1;::::0;2093:6;::::1;::::0;2072:38:::1;::::0;::::1;2121:6;:17:::0;;-1:-1:-1;;;;;;2121:17:0::1;-1:-1:-1::0;;;;;2121:17:0;;;::::1;::::0;;;::::1;::::0;;1902:244::o;93:106::-;181:10;93:106;:::o;15085:181::-;15143:7;15175:5;;;15199:6;;;;15191:46;;;;;-1:-1:-1;;;15191:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15257:1;15085:181;-1:-1:-1;;;15085:181:0:o;16439:471::-;16497:7;16742:6;16738:47;;-1:-1:-1;16772:1:0;16765:8;;16738:47;16809:5;;;16813:1;16809;:5;:1;16833:5;;;;;:10;16825:56;;;;-1:-1:-1;;;16825:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17386:132;17444:7;17471:39;17475:1;17478;17471:39;;;;;;;;;;;;;;;;;:3;:39::i;15549:136::-;15607:7;15634:43;15638:1;15641;15634:43;;;;;;;;;;;;;;;;;:3;:43::i;29325:385::-;29452:3;;29445:36;;;-1:-1:-1;;;29445:36:0;;29475:4;29445:36;;;;;;29424:18;;-1:-1:-1;;;;;29452:3:0;;29445:21;;:36;;;;;;;;;;;;;;29452:3;29445:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29445:36:0;;-1:-1:-1;29505:30:0;29445:36;29520:14;29505;:30::i;:::-;29492:43;;29560:10;29550:7;:20;29546:157;;;29594:3;;29587:37;;;-1:-1:-1;;;29587:37:0;;-1:-1:-1;;;;;29587:37:0;;;;;;;;;;;;;;;29594:3;;;;;29587:20;;:37;;;;;;;;;;;;;;29594:3;;29587:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29546:157:0;;-1:-1:-1;29546:157:0;;29664:3;;29657:34;;;-1:-1:-1;;;29657:34:0;;-1:-1:-1;;;;;29657:34:0;;;;;;;;;;;;;;;29664:3;;;;;29657:20;;:34;;;;;;;;;;;;;;29664:3;;29657:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29546:157;29325:385;;;;:::o;11749:177::-;11859:58;;;-1:-1:-1;;;;;11859:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11859:58:0;-1:-1:-1;;;11859:58:0;;;11832:86;;11852:5;;11832:19;:86::i;:::-;11749:177;;;:::o;20310:402::-;20535:51;;;-1:-1:-1;;;;;20535:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20535:51:0;-1:-1:-1;;;20535:51:0;;;20524:63;;;;20489:12;;20503:17;;20524:10;;;;20535:51;20524:63;;;20535:51;20524:63;;20535:51;20524:63;;;;;;;;;;-1:-1:-1;;20524:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20488:99;;;;20606:7;:57;;;;-1:-1:-1;20618:11:0;;:16;;:44;;;20649:4;20638:24;;;;;;;;;;;;;;;-1:-1:-1;20638:24:0;20618:44;20598:106;;;;-1:-1:-1;;;20598:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23035:291;23132:8;:15;23115:14;23158:161;23186:6;23180:3;:12;23158:161;;;23216:21;23240:8;23249:3;23240:13;;;;;;;;;;;;;;;;23268:20;23240:13;;;;;23268:20;:39;;;-1:-1:-1;23194:5:0;;23158:161;;11934:205;12062:68;;;-1:-1:-1;;;;;12062:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12062:68:0;-1:-1:-1;;;12062:68:0;;;12035:96;;12055:5;;12035:19;:96::i;18014:278::-;18100:7;18135:12;18128:5;18120:28;;;;-1:-1:-1;;;18120:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18159:9;18175:1;18171;:5;;;;;;;18014:278;-1:-1:-1;;;;;18014:278:0:o;15988:192::-;16074:7;16110:12;16102:6;;;;16094:29;;;;-1:-1:-1;;;16094:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16146:5:0;;;15988:192::o;14054:761::-;14478:23;14504:69;14532:4;14504:69;;;;;;;;;;;;;;;;;14512:5;-1:-1:-1;;;;;14504:27:0;;;:69;;;;;:::i;:::-;14588:17;;14478:95;;-1:-1:-1;14588:21:0;14584:224;;14730:10;14719:30;;;;;;;;;;;;;;;-1:-1:-1;14719:30:0;14711:85;;;;-1:-1:-1;;;14711:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8320:195;8423:12;8455:52;8477:6;8485:4;8491:1;8494:12;8455:21;:52::i;:::-;8448:59;8320:195;-1:-1:-1;;;;8320:195:0:o;9372:530::-;9499:12;9557:5;9532:21;:30;;9524:81;;;;-1:-1:-1;;;9524:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9624:18;9635:6;9624:10;:18::i;:::-;9616:60;;;;;-1:-1:-1;;;9616:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9750:12;9764:23;9791:6;-1:-1:-1;;;;;9791:11:0;9811:5;9819:4;9791:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9791:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9749:75;;;;9842:52;9860:7;9869:10;9881:12;9842:17;:52::i;:::-;9835:59;9372:530;-1:-1:-1;;;;;;;9372:530:0:o;5402:422::-;5769:20;5808:8;;;5402:422::o;10908:742::-;11023:12;11052:7;11048:595;;;-1:-1:-1;11083:10:0;11076:17;;11048:595;11197:17;;:21;11193:439;;11460:10;11454:17;11521:15;11508:10;11504:2;11500:19;11493:44;11408:148;11596:20;;-1:-1:-1;;;11596:20:0;;;;;;;;;;;;;;;;;11603:12;;11596:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

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