ETH Price: $2,516.12 (+0.71%)

Contract

0xC1AA7BA3E97667a8464ef91319513409Aa038537
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0221581,000
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.011079500
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0017504879
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0155106700
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0177264800
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0018612784.00000145
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0017726480
Transfer110679552020-10-16 16:15:361477 days ago1602864936IN
0xC1AA7BA3...9Aa038537
2 ETH0.0017947981
Transfer109836012020-10-03 14:56:241490 days ago1601736984IN
0xC1AA7BA3...9Aa038537
0 ETH0.00100848
Transfer109835912020-10-03 14:54:371490 days ago1601736877IN
0xC1AA7BA3...9Aa038537
0 ETH0.0010550
Transfer109613472020-09-30 3:19:101493 days ago1601435950IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.0015953772
Transfer109613412020-09-30 3:17:551493 days ago1601435875IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00315150
Transfer109613302020-09-30 3:15:301493 days ago1601435730IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00151272
Transfer109613272020-09-30 3:14:301493 days ago1601435670IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00151272
Transfer109512822020-09-28 13:37:071495 days ago1601300227IN
0xC1AA7BA3...9Aa038537
0.2867 ETH0.0014845867
Transfer109511072020-09-28 13:00:141495 days ago1601298014IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00299797135.3
Transfer109510972020-09-28 12:58:101495 days ago1601297890IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00304672137.5
Transfer109510932020-09-28 12:57:341495 days ago1601297854IN
0xC1AA7BA3...9Aa038537
0.5 ETH0.00304672137.5
Withdraw Funds109509522020-09-28 12:26:081495 days ago1601295968IN
0xC1AA7BA3...9Aa038537
0 ETH0.00590989142
Transfer109508652020-09-28 12:05:411495 days ago1601294741IN
0xC1AA7BA3...9Aa038537
0.13 ETH0.00321291145
Transfer109508432020-09-28 11:58:471495 days ago1601294327IN
0xC1AA7BA3...9Aa038537
0.33 ETH0.00872707135
Transfer109508382020-09-28 11:58:291495 days ago1601294309IN
0xC1AA7BA3...9Aa038537
1 ETH0.01258778133.00000134
Has Started109508382020-09-28 11:58:291495 days ago1601294309IN
0xC1AA7BA3...9Aa038537
0 ETH0.00222773104.50000023
Transfer109508192020-09-28 11:55:021495 days ago1601294102IN
0xC1AA7BA3...9Aa038537
0.13 ETH0.01381817146
Transfer109508152020-09-28 11:53:551495 days ago1601294035IN
0xC1AA7BA3...9Aa038537
0.25 ETH0.012929200
View all transactions

Latest 9 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
109509522020-09-28 12:26:081495 days ago1601295968
0xC1AA7BA3...9Aa038537
159.43105771 ETH
109509522020-09-28 12:26:081495 days ago1601295968
0xC1AA7BA3...9Aa038537
372.00580134 ETH
109243882020-09-24 9:05:001499 days ago1600938300
0xC1AA7BA3...9Aa038537
0.32 ETH
108994292020-09-20 13:14:491503 days ago1600607689
0xC1AA7BA3...9Aa038537
21.31215375 ETH
108994292020-09-20 13:14:491503 days ago1600607689
0xC1AA7BA3...9Aa038537
49.72835875 ETH
108733992020-09-16 13:21:051507 days ago1600262465
0xC1AA7BA3...9Aa038537
41.50047183 ETH
108733992020-09-16 13:21:051507 days ago1600262465
0xC1AA7BA3...9Aa038537
96.83443427 ETH
108475232020-09-12 13:56:471511 days ago1599919007
0xC1AA7BA3...9Aa038537
47.1 ETH
108475232020-09-12 13:56:471511 days ago1599919007
0xC1AA7BA3...9Aa038537
109.9 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
IPMCrowdSale

Compiler Version
v0.6.2+commit.bacdbe57

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-10
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

    /**
     * @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);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
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) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @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");
        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);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;




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

// File: contracts/crowdsale/crowdsale.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.2;


interface ERCMintable {
    //function crowdSaleMint(address to, uint256 amount) external returns(bool);
    function mint(address to, uint256 amount) external;
}

/**
* @title IPM Token CrowdSale
* @dev  CrowdSale contract for IPM Token:
*
*       Tokens for Sale: 9M IPM
*       Minted on demand up to the hard cap per round. 
*       Unsold supply won't be minted and will result in a
*       lower circulating supply after the sale. Unsold tokens of each round
*       don't transfer to the next round
*
*       PRIVATE ROUND:
*       - whitelisted
*       - garuanteed allocation, overminted gets reduced from last round
*       - duration of 2 days (10.09.2020 - 12.09.2020)
*       - Min-Max allocation per address 2 ETH - 50 ETH
*       - 1M flexible Cap (ETH price on launch could result in more)
*       - 1 IPM = ~0.15 USD
*
*       ROUND 1:
*       - duration of 2 days (14.09.2020 - 16.09.2020)
*       - 1 IPM = ~0.2 USD
*       - 1M IPM Hard Cap
*
*       ROUND 2:
*       - duration of 2 days (18.09.2020 - 20.09.2020)
*       - 1 IPM = 0.3 USD
*       - 2M IPM Hard Cap
*
*       ROUND 3:
*       - duration of 6 days (22.09.2020 - 28.09.2020)
*       - 1 IPM = 0.4 USD
*       - 5M IPM Hard Cap (possible less, based on private round)
*
*       After CrowdSale:
*       Cooldown phase of 5 days begins
*       and will unpause all tokens.
*
* More at https://timers.network/
*
* @author @KTimersnetwork
*/
contract IPMCrowdSale {
    using SafeMath for uint256;


    //////////////////////////////////////
    // Contract configuration           //
    //////////////////////////////////////
    // owner
    address owner;

    // allow pausing of contract to halt everything beside
    // administrative functions
    bool public paused    =   true;

    // min payment for private round
    uint256 public constant PRIVATE_PAYMENT_MIN =   2 ether;

    // min payment for other rounds
    uint256 public constant PUBLIC_PAYMENT_MIN  =   0.1 ether;

    // max payment is always equal
    uint256 public constant PAYMENT_MAX =   50 ether;


    // crowdsale can mint 9m IPM at maximum for all rounds
    uint256 public constant MAXIMUM_MINTABLE_TOKENS =   9000000000000000000000000;

    // start of private round 09/10/2020 @ 12:00pm UTC
    uint256 public constant PRIVATE_ROUND_START     =   1599739200;
    // end of private round 09/12/2020 @ 12:00pm UTC
    uint256 public constant PRIVATE_ROUND_END       =   1599912000;
    // private sale limit 1m 
    uint256 public constant PRIVATE_ROUND_CAP       =   1000000 * (10**18);

    // start of round 1 09/14/2020 @ 12:00pm UTC
    uint256 public constant ROUND_1_START           =   1600084800;
    // end of round 1 09/16/2020 @ 12:00pm UTC
    uint256 public constant ROUND_1_END             =   1600257600;
    // round 1 sale limit 1m
    uint256 public constant ROUND_1_CAP             =   1000000 * (10**18);

    // start of round 2 09/18/2020 @ 12:00pm UTC
    uint256 public constant ROUND_2_START           =   1600430400;
    // end of round 2 09/20/2020 @ 12:00pm UTC
    uint256 public constant ROUND_2_END             =   1600603200;
    // round 2 sale limit 2m
    uint256 public constant ROUND_2_CAP             =   2000000 * (10**18);

    // start of round 3 09/22/2020 @ 12:00pm UTC
    uint256 public constant ROUND_3_START           =   1600776000;
    // end of round 3 09/28/2020 @ 12:00pm UTC
    uint256 public constant ROUND_3_END             =   1601294400;
    // round 3 sale limit 5m
    uint256 public constant ROUND_3_CAP             =   5000000 * (10**18);

    // sold tokens private round
    uint256 public privateRoundSold;
    // sold tokens round 1
    uint256 public round1Sold;
    // sold tokens round 2
    uint256 public round2Sold;
    // sold tokens round 3
    uint256 public round3Sold;

    // private round white list 
    mapping(address => uint256) public whitelist;
    // contributors
    mapping(address => uint256) public contributors;

    // current rate
    uint256 public ipmPerETH;

    // IPM token references
    address public ipmTokenAddress;

    // withdrawal
    address public foundation1Address;
    address public foundation2Address;

    //////////////////////////////////////
    // Control functions / modifiers    //
    //////////////////////////////////////
    function isPrivateRoundActive() public view returns(bool) {
        return (now >= PRIVATE_ROUND_START && now < PRIVATE_ROUND_END);
    }
    function isRound1Active() public view returns(bool) {
        return (now >= ROUND_1_START && now < ROUND_1_END);
    }

    function isRound2Active() public view returns(bool) {
        return (now >= ROUND_2_START && now < ROUND_2_END);
    }

    function isRound3Active() public view returns(bool) {
        return (now >= ROUND_3_START && now < ROUND_3_END);
    }

    function hasStarted() public view returns(bool) {
        return (now > PRIVATE_ROUND_START);
    }

    function hasEnded() public view returns(bool) {
        return (now > ROUND_3_END);
    }

    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier ifPaused() {
        require(paused == true);
        _;
    }

    modifier ifNotPaused() {
        require(paused == false);
        _;
    }

    modifier saleActive() {
        require(hasStarted() == true, "Error: Sale has not started");
        require(hasEnded() == false, "Error: Sale has already ended");
        require(isPrivateRoundActive() || isRound1Active() || isRound2Active() || isRound3Active(), "Error: No round active at the moment");
        _;
    }

    //////////////////////////////////////
    // Events                           //
    //////////////////////////////////////
    event IPMPurchase(
        address indexed beneficiary,
        uint256 tokensPurchased,
        uint256 weiUsed
    );

    //////////////////////////////////////
    // Implementation                   //
    //////////////////////////////////////

    constructor() public {        
        paused  =   true;
        owner   =   msg.sender;
    }

    function getCurrentIPMRatio() external view returns(uint256) {
        return ipmPerETH;
    }

    function getCurrentRound() external view returns(string memory) {
        if(hasEnded()) {
            return "Finished";
        }
        if(isRound1Active()) {
            return "Pre-Sale Round 1";
        } else if(isRound2Active()) {
            return "Pre-Sale Round 2";
        } else if(isRound3Active()) {
            return "Pre-Sale Round 3";
        }
        return "Private Sale";
    }

    function getCurrentCap() public view returns (uint256) {
        if(hasEnded()) {
            return 0;
        }
        if(isRound1Active()) {
            return ROUND_1_CAP;
        } else if(isRound2Active()) {
            return ROUND_2_CAP;
        } else if(isRound3Active()) {
            return ROUND_3_CAP;
        }
        return PRIVATE_ROUND_CAP;
    }


    /**
     * @dev Used to update the current eth price of 1 IPM
     *      Function is needed to set the final price ahead
     *      of each round and for possible big price changes
     *      of eth itself to keep somewhat stable usd prices
     */
    function updateIPMPerETH(uint256 _tokens) external onlyOwner {
        require(hasEnded() == false, "Error: CrowdSale has ended, no need to update ratio");
        require(_tokens > 0, "Error: IPM per ETH can't be 0");
        require(_tokens != ipmPerETH, "Error: Prices are identical, no changes needed");
        require(_tokens < 100000, "Error: Amount of tokens per ETH seems unrealistically high. Input error?");

        ipmPerETH  =   _tokens;
    }

    function unpause() external onlyOwner ifPaused {
        paused = false;
    }   
    function pause() external onlyOwner ifNotPaused {
        paused = true;
    }


    function getTokenAddress() external view returns(address) {
        return ipmTokenAddress;
    }

    function setIPMTokenContract(address _token) external onlyOwner ifPaused {
        ipmTokenAddress =   _token;
    }

    function setWhitelist(address[] calldata _beneficiaries, uint256[] calldata _weiAmounts) external onlyOwner {
        require(_beneficiaries.length > 0, "Error: Beneficiaries are empty");
        require(_weiAmounts.length > 0, "Error: Investments are empty");
        require(_beneficiaries.length == _weiAmounts.length, "Error: Addresses length is not equal investments");
        
        for(uint256 i=0;i<_beneficiaries.length;i++) {
            whitelist[_beneficiaries[i]]    =   _weiAmounts[i];
        }
    }

    function addOrUpdateWhitelistEntry(address _beneficiary, uint256 _weiAmount) external onlyOwner {
        require(_weiAmount >= PRIVATE_PAYMENT_MIN, "Error: Investment is below private sell minimum");
        require(_weiAmount <= PAYMENT_MAX, "Error: Investment is above maximum sell amount");

        whitelist[_beneficiary]   =   _weiAmount;
    }

    function removeWhitelistEntry(address _beneficiary) external onlyOwner {
        require(whitelist[_beneficiary] > 0, "Error: Address is not whitelisted");
        whitelist[_beneficiary] =   0;
        delete whitelist[_beneficiary];

    }

    function isWhitelisted(address _beneficiary) public view returns(bool) {
        require(_beneficiary != address(0), 'Error: Address cannot be empty');
        return (whitelist[_beneficiary] > 0) ? true:false;
    }

    function setFoundation1Address(address _foundationAddress) external onlyOwner {
        require(_foundationAddress != address(0), 'Error: Address cannot be empty');
        foundation1Address = _foundationAddress;
    }

    function setFoundation2Address(address _foundationAddress) external onlyOwner {
        require(_foundationAddress != address(0), 'Error: Address cannot be empty');
        foundation2Address = _foundationAddress;
    }

    function withdrawFunds() external onlyOwner {
        require(hasStarted() == true, "Error: No reason to withdraw funds before sale has started");
        require(
            isPrivateRoundActive() == false &&
            isRound1Active() == false &&
            isRound2Active() == false &&
            isRound3Active() == false,
            "Error: Withdrawal during active rounds is not allowed"
        );
        require(foundation1Address != address(0), 'Error: No foundation1 wallet set');
        require(foundation2Address != address(0), 'Error: No foundation2 wallet set');

        uint256 fundsAvailable              =   address(this).balance;
        require(fundsAvailable > 0, "Error: No funds available to withdraw");

        uint256 amountForFoundation1Wallet  =   fundsAvailable.div(100).mul(70); 
        uint256 amountForFoundation2Wallet  =   fundsAvailable.sub(amountForFoundation1Wallet);
        require(amountForFoundation1Wallet.add(amountForFoundation2Wallet) == fundsAvailable, "Error: Amount to be sent is not equal the funds");

        payable(foundation1Address).transfer(amountForFoundation1Wallet);
        payable(foundation2Address).transfer(amountForFoundation2Wallet);  
    }

    /**
    * @dev Default fallback function that will also allow
    *      the contract owner to deposit additional ETH,
    *      without triggering the IPM purchase functionality.
    */
    receive() external payable {
        require(msg.value > 0, "Error: No ether received. Msg.value is empty");
        // no need for owner to buy
        if(msg.sender != owner) {
            // let others buy tokens
            _buyTokens(msg.sender, msg.value);
        }
    }

    function _buyTokens(address _beneficiary, uint256 _amountPayedInWei) internal saleActive {
        require(_beneficiary != address(0), "Error: Burn/Mint address cant purchase tokens");
        require(_hasAllowance(_beneficiary), "Error: Address is not allowed to purchase");
        
        require(_amountPayedInWei <= PAYMENT_MAX, "Error: Paymed exceeds maximum single purchase");
        
        uint256 tokensForPayment    =   _calculateTokensForPayment(_amountPayedInWei);
        uint256 tokensLeft          =   _getCurrentRemainingIPM();

        require(tokensForPayment > 0, "Error: payment too low. no tokens for this wei amount");
        require(tokensLeft > 0, "Error: No tokens left for this round");
        require(tokensLeft >= tokensForPayment, "Error: Purchase exceeds remaining tokens for this round");

        if(isPrivateRoundActive()) {
            uint256 alreadyPurchased    =   contributors[_beneficiary];
            uint256 allowedToPurchase   =   whitelist[_beneficiary];

            if(alreadyPurchased == 0) {
                require(_amountPayedInWei >= PRIVATE_PAYMENT_MIN, "Error: Payment smaller than minimum payment");
            }

            uint256 combinedPurchase    =   alreadyPurchased.add(_amountPayedInWei);

            require(combinedPurchase <= allowedToPurchase, "Error: This purchase exceeds the whitelisted limited");
        } 
        
        require(_amountPayedInWei >= PUBLIC_PAYMENT_MIN, "Error: Payment smaller than minimum payment");
        
        ERCMintable(ipmTokenAddress).mint(_beneficiary, tokensForPayment);
        
        if(isRound1Active()) {
            round1Sold = round1Sold.add(tokensForPayment);
        } else if(isRound2Active()) {
            round2Sold = round2Sold.add(tokensForPayment);
        } else if(isRound3Active()) {
            round3Sold = round3Sold.add(tokensForPayment);
        } else {
            privateRoundSold = privateRoundSold.add(tokensForPayment);
        }
        contributors[_beneficiary] =    contributors[_beneficiary].add(_amountPayedInWei);

        emit IPMPurchase(
            _beneficiary,
            tokensForPayment,
            _amountPayedInWei
        ); 
    }

    function _calculateTokensForPayment(uint256 payedWei) internal view returns(uint256) {
        require(payedWei > 0, "Error: Invalid wei amount");

        return payedWei.mul(ipmPerETH);
    }

    function _hasAllowance(address _beneficiary) internal view returns(bool) {
        if(isPrivateRoundActive()) {
            return (whitelist[_beneficiary] > 0);
        }
        return true;
    }

    function _getCurrentRemainingIPM() internal view returns(uint256) {
        if(isRound1Active()) {
            return ROUND_1_CAP.sub(round1Sold);
        } else if(isRound2Active()) {
            return ROUND_2_CAP.sub(round2Sold);
        } else if(isRound3Active()) {
            return ROUND_3_CAP.sub(round3Sold.add(_getPrivateRoundOverhead()));
        }
        return PRIVATE_ROUND_CAP.add(ROUND_3_CAP).sub(privateRoundSold);
    }

    function _getPrivateRoundOverhead() internal view returns(uint256) {
        if(privateRoundSold > PRIVATE_ROUND_CAP) {
            return privateRoundSold.sub(PRIVATE_ROUND_CAP);
        }

        return 0;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokensPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weiUsed","type":"uint256"}],"name":"IPMPurchase","type":"event"},{"inputs":[],"name":"MAXIMUM_MINTABLE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYMENT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_PAYMENT_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_ROUND_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PAYMENT_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_1_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_2_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_END","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUND_3_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_weiAmount","type":"uint256"}],"name":"addOrUpdateWhitelistEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contributors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundation1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundation2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIPMRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRound","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipmPerETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ipmTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPrivateRoundActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound1Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound2Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRound3Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateRoundSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"removeWhitelistEntry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"round1Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"round2Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"round3Sold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_foundationAddress","type":"address"}],"name":"setFoundation1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_foundationAddress","type":"address"}],"name":"setFoundation2Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setIPMTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_weiAmounts","type":"uint256[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"updateIPMPerETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000805460ff60a01b1916600160a01b17905534801561002357600080fd5b50600080546001600160a01b031960ff60a01b19909116600160a01b171633179055612356806100546000396000f3fe6080604052600436106102975760003560e01c80637c99b6c81161015a578063d7bdf637116100c1578063ecb70fb71161007a578063ecb70fb714610808578063ece7328a1461081d578063f013e0e114610832578063f216718214610901578063f3d377461461092b578063f62516ca14610940576102f9565b8063d7bdf6371461078a578063d8c307001461079f578063db937190146107b4578063dfef26c1146107c9578063e6bb9b94146107de578063e75f1292146107f3576102f9565b8063a32bf59711610113578063a32bf597146106ac578063a812108414610736578063b97e93f61461074b578063be68beda14610760578063c4645cc914610775578063d7bd1185146104ab576102f9565b80637c99b6c8146105ce5780637ca0294d146106015780638456cb591461063a57806386d0b48c1461064f5780639b19251a146106645780639d53343914610697576102f9565b8063270bf499116101fe57806344691f7e116101b757806344691f7e1461053257806344e4f334146105475780635c975abb1461055c57806360c9a5f81461057157806366d27d1a146105a457806374e129c8146105b9576102f9565b8063270bf499146104965780632a511c3b146104ab5780633804ad79146104c05780633af32abf146104d55780633d960ec3146105085780633f4ba83a1461051d576102f9565b80631a3d948a116102505780631a3d948a146103dc5780631f6d49421461040f5780631fbe327514610442578063203921601461045757806324600fc31461046c57806324b9f4c414610481576102f9565b8063010e4284146102fe5780630672a86914610331578063082f9bd4146103625780630a5461591461038b57806310fe9ae8146103b257806312182bd8146103c7576102f9565b366102f957600034116102db5760405162461bcd60e51b815260040180806020018281038252602c815260200180612085602c913960400191505060405180910390fd5b6000546001600160a01b031633146102f7576102f73334610955565b005b600080fd5b34801561030a57600080fd5b506102f76004803603602081101561032157600080fd5b50356001600160a01b0316610ec2565b34801561033d57600080fd5b50610346610f47565b604080516001600160a01b039092168252519081900360200190f35b34801561036e57600080fd5b50610377610f56565b604080519115158252519081900360200190f35b34801561039757600080fd5b506103a0610f75565b60408051918252519081900360200190f35b3480156103be57600080fd5b50610346610f7d565b3480156103d357600080fd5b506103a0610f8c565b3480156103e857600080fd5b506102f7600480360360208110156103ff57600080fd5b50356001600160a01b0316610f9b565b34801561041b57600080fd5b506103a06004803603602081101561043257600080fd5b50356001600160a01b0316610fef565b34801561044e57600080fd5b50610377611001565b34801561046357600080fd5b506103a061101d565b34801561047857600080fd5b506102f7611023565b34801561048d57600080fd5b506103a06112f2565b3480156104a257600080fd5b506103a0611301565b3480156104b757600080fd5b506103a061130d565b3480156104cc57600080fd5b506103a061131b565b3480156104e157600080fd5b50610377600480360360208110156104f857600080fd5b50356001600160a01b0316611328565b34801561051457600080fd5b506103a06113b4565b34801561052957600080fd5b506102f76113ba565b34801561053e57600080fd5b506103776113fb565b34801561055357600080fd5b506103a0611405565b34801561056857600080fd5b5061037761140d565b34801561057d57600080fd5b506102f76004803603602081101561059457600080fd5b50356001600160a01b031661141d565b3480156105b057600080fd5b506103466114b1565b3480156105c557600080fd5b506103a06114c0565b3480156105da57600080fd5b506102f7600480360360208110156105f157600080fd5b50356001600160a01b03166114cf565b34801561060d57600080fd5b506102f76004803603604081101561062457600080fd5b506001600160a01b038135169060200135611563565b34801561064657600080fd5b506102f7611625565b34801561065b57600080fd5b506103a0611668565b34801561067057600080fd5b506103a06004803603602081101561068757600080fd5b50356001600160a01b031661166e565b3480156106a357600080fd5b506103a0611680565b3480156106b857600080fd5b506106c1611688565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106fb5781810151838201526020016106e3565b50505050905090810190601f1680156107285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561074257600080fd5b506103a0611791565b34801561075757600080fd5b50610377611797565b34801561076c57600080fd5b506103a06117b3565b34801561078157600080fd5b506103776117b9565b34801561079657600080fd5b506103a06117d5565b3480156107ab57600080fd5b506103a06117dd565b3480156107c057600080fd5b506103a061185f565b3480156107d557600080fd5b506103a0611867565b3480156107ea57600080fd5b506103a061186f565b3480156107ff57600080fd5b506103a0611877565b34801561081457600080fd5b5061037761187f565b34801561082957600080fd5b50610346611889565b34801561083e57600080fd5b506102f76004803603604081101561085557600080fd5b81019060208101813564010000000081111561087057600080fd5b82018360208201111561088257600080fd5b803590602001918460208302840111640100000000831117156108a457600080fd5b9193909290916020810190356401000000008111156108c257600080fd5b8201836020820111156108d457600080fd5b803590602001918460208302840111640100000000831117156108f657600080fd5b509092509050611898565b34801561090d57600080fd5b506102f76004803603602081101561092457600080fd5b50356119f1565b34801561093757600080fd5b506103a0611b28565b34801561094c57600080fd5b506103a0611b34565b61095d6113fb565b15156001146109b3576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2053616c6520686173206e6f7420737461727465640000000000604482015290519081900360640190fd5b6109bb61187f565b15610a0d576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2053616c652068617320616c726561647920656e646564000000604482015290519081900360640190fd5b610a15610f56565b80610a235750610a23611001565b80610a315750610a31611797565b80610a3f5750610a3f6117b9565b610a7a5760405162461bcd60e51b815260040180806020018281038252602481526020018061217d6024913960400191505060405180910390fd5b6001600160a01b038216610abf5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121a1602d913960400191505060405180910390fd5b610ac882611b3a565b610b035760405162461bcd60e51b81526004018080602001828103825260298152602001806121336029913960400191505060405180910390fd5b6802b5e3af16b1880000811115610b4b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121fc602d913960400191505060405180910390fd5b6000610b5682611b6a565b90506000610b62611bd4565b905060008211610ba35760405162461bcd60e51b81526004018080602001828103825260358152602001806122ec6035913960400191505060405180910390fd5b60008111610be25760405162461bcd60e51b81526004018080602001828103825260248152602001806120b16024913960400191505060405180910390fd5b81811015610c215760405162461bcd60e51b8152600401808060200182810382526037815260200180611f246037913960400191505060405180910390fd5b610c29610f56565b15610cf6576001600160a01b03841660009081526006602090815260408083205460059092529091205481610c9f57671bc16d674ec80000851015610c9f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b6000610cb1838763ffffffff611cae16565b905081811115610cf25760405162461bcd60e51b81526004018080602001828103825260348152602001806122836034913960400191505060405180910390fd5b5050505b67016345785d8a0000831015610d3d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b600854604080516340c10f1960e01b81526001600160a01b03878116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b158015610d9257600080fd5b505af1158015610da6573d6000803e3d6000fd5b50505050610db2611001565b15610dd257600254610dca908363ffffffff611cae16565b600255610e39565b610dda611797565b15610dfa57600354610df2908363ffffffff611cae16565b600355610e39565b610e026117b9565b15610e2257600454610e1a908363ffffffff611cae16565b600455610e39565b600154610e35908363ffffffff611cae16565b6001555b6001600160a01b038416600090815260066020526040902054610e62908463ffffffff611cae16565b6001600160a01b038516600081815260066020908152604091829020939093558051858152928301869052805191927f62ea3479470df7563c5a39f2835a33a651f2d09d29d392aa142ada944f9fdc2b929081900390910190a250505050565b6000546001600160a01b03163314610ed957600080fd5b6001600160a01b038116600090815260056020526040902054610f2d5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f5b6021913960400191505060405180910390fd5b6001600160a01b0316600090815260056020526040812055565b6009546001600160a01b031681565b6000635f5a15404210158015610f6f5750635f5cb84042105b90505b90565b635f5cb84081565b6008546001600160a01b031690565b6a01a784379d99db4200000081565b6000546001600160a01b03163314610fb257600080fd5b600054600160a01b900460ff161515600114610fcd57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60066020526000908152604090205481565b6000635f5f5b404210158015610f6f575050635f61fe40421090565b60025481565b6000546001600160a01b0316331461103a57600080fd5b6110426113fb565b15156001146110825760405162461bcd60e51b815260040180806020018281038252603a815260200180611f7c603a913960400191505060405180910390fd5b61108a610f56565b15801561109c575061109a611001565b155b80156110ad57506110ab611797565b155b80156110be57506110bc6117b9565b155b6110f95760405162461bcd60e51b81526004018080602001828103825260358152602001806122b76035913960400191505060405180910390fd5b6009546001600160a01b0316611156576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e312077616c6c657420736574604482015290519081900360640190fd5b600a546001600160a01b03166111b3576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e322077616c6c657420736574604482015290519081900360640190fd5b47806111f05760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb66025913960400191505060405180910390fd5b6000611214604661120884606463ffffffff611d1116565b9063ffffffff611d5316565b90506000611228838363ffffffff611dac16565b90508261123b838363ffffffff611cae16565b146112775760405162461bcd60e51b815260040180806020018281038252602f815260200180612254602f913960400191505060405180910390fd5b6009546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156112b1573d6000803e3d6000fd5b50600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112ec573d6000803e3d6000fd5b50505050565b6a0422ca8b0a00a42500000081565b671bc16d674ec8000081565b69d3c21bcecceda100000081565b6802b5e3af16b188000081565b60006001600160a01b038216611385576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b6001600160a01b0382166000908152600560205260409020546113a95760006113ac565b60015b90505b919050565b60035481565b6000546001600160a01b031633146113d157600080fd5b600054600160a01b900460ff1615156001146113ec57600080fd5b6000805460ff60a01b19169055565b635f5a1540421190565b635f69e74081565b600054600160a01b900460ff1681565b6000546001600160a01b0316331461143457600080fd5b6001600160a01b03811661148f576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b6a0771d2fa45345aa900000081565b6000546001600160a01b031633146114e657600080fd5b6001600160a01b038116611541576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157a57600080fd5b671bc16d674ec800008110156115c15760405162461bcd60e51b815260040180806020018281038252602f81526020018061200e602f913960400191505060405180910390fd5b6802b5e3af16b18800008111156116095760405162461bcd60e51b815260040180806020018281038252602e8152602001806120d5602e913960400191505060405180910390fd5b6001600160a01b03909116600090815260056020526040902055565b6000546001600160a01b0316331461163c57600080fd5b600054600160a01b900460ff161561165357600080fd5b6000805460ff60a01b1916600160a01b179055565b60045481565b60056020526000908152604090205481565b635f61fe4081565b606061169261187f565b156116bc5750604080518082019091526008815267119a5b9a5cda195960c21b6020820152610f72565b6116c4611001565b156116f6575060408051808201909152601081526f5072652d53616c6520526f756e64203160801b6020820152610f72565b6116fe611797565b15611730575060408051808201909152601081526f28393296a9b0b632902937bab732101960811b6020820152610f72565b6117386117b9565b1561176a575060408051808201909152601081526f5072652d53616c6520526f756e64203360801b6020820152610f72565b5060408051808201909152600c81526b507269766174652053616c6560a01b602082015290565b60015481565b6000635f64a1404210158015610f6f575050635f674440421090565b60075490565b6000635f69e7404210158015610f6f575050635f71d040421090565b635f5a154081565b60006117e761187f565b156117f457506000610f72565b6117fc611001565b15611812575069d3c21bcecceda1000000610f72565b61181a611797565b1561183157506a01a784379d99db42000000610f72565b6118396117b9565b1561185057506a0422ca8b0a00a425000000610f72565b5069d3c21bcecceda100000090565b635f67444081565b635f5f5b4081565b635f64a14081565b635f71d04081565b635f71d040421190565b6008546001600160a01b031681565b6000546001600160a01b031633146118af57600080fd5b82611901576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a2042656e656669636961726965732061726520656d7074790000604482015290519081900360640190fd5b80611953576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20496e766573746d656e74732061726520656d70747900000000604482015290519081900360640190fd5b8281146119915760405162461bcd60e51b81526004018080602001828103825260308152602001806121036030913960400191505060405180910390fd5b60005b838110156119ea578282828181106119a857fe5b90506020020135600560008787858181106119bf57fe5b602090810292909201356001600160a01b031683525081019190915260400160002055600101611994565b5050505050565b6000546001600160a01b03163314611a0857600080fd5b611a1061187f565b15611a4c5760405162461bcd60e51b8152600401808060200182810382526033815260200180611fdb6033913960400191505060405180910390fd5b60008111611aa1576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2049504d20706572204554482063616e27742062652030000000604482015290519081900360640190fd5b600754811415611ae25760405162461bcd60e51b815260040180806020018281038252602e8152602001806121ce602e913960400191505060405180910390fd5b620186a08110611b235760405162461bcd60e51b815260040180806020018281038252604881526020018061203d6048913960600191505060405180910390fd5b600755565b67016345785d8a000081565b60075481565b6000611b44610f56565b156113a957506001600160a01b03811660009081526005602052604090205415156113af565b6000808211611bc0576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642077656920616d6f756e7400000000000000604482015290519081900360640190fd5b6007546113ac90839063ffffffff611d5316565b6000611bde611001565b15611c0857600254611c019069d3c21bcecceda10000009063ffffffff611dac16565b9050610f72565b611c10611797565b15611c3457600354611c01906a01a784379d99db420000009063ffffffff611dac16565b611c3c6117b9565b15611c7657611c01611c5e611c4f611dee565b6004549063ffffffff611cae16565b6a0422ca8b0a00a4250000009063ffffffff611dac16565b600154610f6f90611ca269d3c21bcecceda10000006a0422ca8b0a00a42500000063ffffffff611cae16565b9063ffffffff611dac16565b600082820183811015611d08576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611d0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e27565b600082611d6257506000611d0b565b82820282848281611d6f57fe5b0414611d085760405162461bcd60e51b815260040180806020018281038252602181526020018061215c6021913960400191505060405180910390fd5b6000611d0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ec9565b600069d3c21bcecceda10000006001541115611e2157600154611c019069d3c21bcecceda100000063ffffffff611dac16565b50600090565b60008183611eb35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e78578181015183820152602001611e60565b50505050905090810190601f168015611ea55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611ebf57fe5b0495945050505050565b60008184841115611f1b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e78578181015183820152602001611e60565b50505090039056fe4572726f723a20507572636861736520657863656564732072656d61696e696e6720746f6b656e7320666f72207468697320726f756e644572726f723a2041646472657373206973206e6f742077686974656c69737465644572726f723a204e6f20726561736f6e20746f2077697468647261772066756e6473206265666f72652073616c652068617320737461727465644572726f723a204e6f2066756e647320617661696c61626c6520746f2077697468647261774572726f723a2043726f776453616c652068617320656e6465642c206e6f206e65656420746f2075706461746520726174696f4572726f723a20496e766573746d656e742069732062656c6f7720707269766174652073656c6c206d696e696d756d4572726f723a20416d6f756e74206f6620746f6b656e732070657220455448207365656d7320756e7265616c6973746963616c6c7920686967682e20496e707574206572726f723f4572726f723a204e6f2065746865722072656365697665642e204d73672e76616c756520697320656d7074794572726f723a204e6f20746f6b656e73206c65667420666f72207468697320726f756e644572726f723a20496e766573746d656e742069732061626f7665206d6178696d756d2073656c6c20616d6f756e744572726f723a20416464726573736573206c656e677468206973206e6f7420657175616c20696e766573746d656e74734572726f723a2041646472657373206973206e6f7420616c6c6f77656420746f207075726368617365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774572726f723a204e6f20726f756e642061637469766520617420746865206d6f6d656e744572726f723a204275726e2f4d696e7420616464726573732063616e7420707572636861736520746f6b656e734572726f723a2050726963657320617265206964656e746963616c2c206e6f206368616e676573206e65656465644572726f723a205061796d65642065786365656473206d6178696d756d2073696e676c652070757263686173654572726f723a205061796d656e7420736d616c6c6572207468616e206d696e696d756d207061796d656e744572726f723a20416d6f756e7420746f2062652073656e74206973206e6f7420657175616c207468652066756e64734572726f723a20546869732070757263686173652065786365656473207468652077686974656c6973746564206c696d697465644572726f723a205769746864726177616c20647572696e672061637469766520726f756e6473206973206e6f7420616c6c6f7765644572726f723a207061796d656e7420746f6f206c6f772e206e6f20746f6b656e7320666f7220746869732077656920616d6f756e74a26469706673582212205c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead464736f6c63430006020033

Deployed Bytecode

0x6080604052600436106102975760003560e01c80637c99b6c81161015a578063d7bdf637116100c1578063ecb70fb71161007a578063ecb70fb714610808578063ece7328a1461081d578063f013e0e114610832578063f216718214610901578063f3d377461461092b578063f62516ca14610940576102f9565b8063d7bdf6371461078a578063d8c307001461079f578063db937190146107b4578063dfef26c1146107c9578063e6bb9b94146107de578063e75f1292146107f3576102f9565b8063a32bf59711610113578063a32bf597146106ac578063a812108414610736578063b97e93f61461074b578063be68beda14610760578063c4645cc914610775578063d7bd1185146104ab576102f9565b80637c99b6c8146105ce5780637ca0294d146106015780638456cb591461063a57806386d0b48c1461064f5780639b19251a146106645780639d53343914610697576102f9565b8063270bf499116101fe57806344691f7e116101b757806344691f7e1461053257806344e4f334146105475780635c975abb1461055c57806360c9a5f81461057157806366d27d1a146105a457806374e129c8146105b9576102f9565b8063270bf499146104965780632a511c3b146104ab5780633804ad79146104c05780633af32abf146104d55780633d960ec3146105085780633f4ba83a1461051d576102f9565b80631a3d948a116102505780631a3d948a146103dc5780631f6d49421461040f5780631fbe327514610442578063203921601461045757806324600fc31461046c57806324b9f4c414610481576102f9565b8063010e4284146102fe5780630672a86914610331578063082f9bd4146103625780630a5461591461038b57806310fe9ae8146103b257806312182bd8146103c7576102f9565b366102f957600034116102db5760405162461bcd60e51b815260040180806020018281038252602c815260200180612085602c913960400191505060405180910390fd5b6000546001600160a01b031633146102f7576102f73334610955565b005b600080fd5b34801561030a57600080fd5b506102f76004803603602081101561032157600080fd5b50356001600160a01b0316610ec2565b34801561033d57600080fd5b50610346610f47565b604080516001600160a01b039092168252519081900360200190f35b34801561036e57600080fd5b50610377610f56565b604080519115158252519081900360200190f35b34801561039757600080fd5b506103a0610f75565b60408051918252519081900360200190f35b3480156103be57600080fd5b50610346610f7d565b3480156103d357600080fd5b506103a0610f8c565b3480156103e857600080fd5b506102f7600480360360208110156103ff57600080fd5b50356001600160a01b0316610f9b565b34801561041b57600080fd5b506103a06004803603602081101561043257600080fd5b50356001600160a01b0316610fef565b34801561044e57600080fd5b50610377611001565b34801561046357600080fd5b506103a061101d565b34801561047857600080fd5b506102f7611023565b34801561048d57600080fd5b506103a06112f2565b3480156104a257600080fd5b506103a0611301565b3480156104b757600080fd5b506103a061130d565b3480156104cc57600080fd5b506103a061131b565b3480156104e157600080fd5b50610377600480360360208110156104f857600080fd5b50356001600160a01b0316611328565b34801561051457600080fd5b506103a06113b4565b34801561052957600080fd5b506102f76113ba565b34801561053e57600080fd5b506103776113fb565b34801561055357600080fd5b506103a0611405565b34801561056857600080fd5b5061037761140d565b34801561057d57600080fd5b506102f76004803603602081101561059457600080fd5b50356001600160a01b031661141d565b3480156105b057600080fd5b506103466114b1565b3480156105c557600080fd5b506103a06114c0565b3480156105da57600080fd5b506102f7600480360360208110156105f157600080fd5b50356001600160a01b03166114cf565b34801561060d57600080fd5b506102f76004803603604081101561062457600080fd5b506001600160a01b038135169060200135611563565b34801561064657600080fd5b506102f7611625565b34801561065b57600080fd5b506103a0611668565b34801561067057600080fd5b506103a06004803603602081101561068757600080fd5b50356001600160a01b031661166e565b3480156106a357600080fd5b506103a0611680565b3480156106b857600080fd5b506106c1611688565b6040805160208082528351818301528351919283929083019185019080838360005b838110156106fb5781810151838201526020016106e3565b50505050905090810190601f1680156107285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561074257600080fd5b506103a0611791565b34801561075757600080fd5b50610377611797565b34801561076c57600080fd5b506103a06117b3565b34801561078157600080fd5b506103776117b9565b34801561079657600080fd5b506103a06117d5565b3480156107ab57600080fd5b506103a06117dd565b3480156107c057600080fd5b506103a061185f565b3480156107d557600080fd5b506103a0611867565b3480156107ea57600080fd5b506103a061186f565b3480156107ff57600080fd5b506103a0611877565b34801561081457600080fd5b5061037761187f565b34801561082957600080fd5b50610346611889565b34801561083e57600080fd5b506102f76004803603604081101561085557600080fd5b81019060208101813564010000000081111561087057600080fd5b82018360208201111561088257600080fd5b803590602001918460208302840111640100000000831117156108a457600080fd5b9193909290916020810190356401000000008111156108c257600080fd5b8201836020820111156108d457600080fd5b803590602001918460208302840111640100000000831117156108f657600080fd5b509092509050611898565b34801561090d57600080fd5b506102f76004803603602081101561092457600080fd5b50356119f1565b34801561093757600080fd5b506103a0611b28565b34801561094c57600080fd5b506103a0611b34565b61095d6113fb565b15156001146109b3576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2053616c6520686173206e6f7420737461727465640000000000604482015290519081900360640190fd5b6109bb61187f565b15610a0d576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2053616c652068617320616c726561647920656e646564000000604482015290519081900360640190fd5b610a15610f56565b80610a235750610a23611001565b80610a315750610a31611797565b80610a3f5750610a3f6117b9565b610a7a5760405162461bcd60e51b815260040180806020018281038252602481526020018061217d6024913960400191505060405180910390fd5b6001600160a01b038216610abf5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121a1602d913960400191505060405180910390fd5b610ac882611b3a565b610b035760405162461bcd60e51b81526004018080602001828103825260298152602001806121336029913960400191505060405180910390fd5b6802b5e3af16b1880000811115610b4b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806121fc602d913960400191505060405180910390fd5b6000610b5682611b6a565b90506000610b62611bd4565b905060008211610ba35760405162461bcd60e51b81526004018080602001828103825260358152602001806122ec6035913960400191505060405180910390fd5b60008111610be25760405162461bcd60e51b81526004018080602001828103825260248152602001806120b16024913960400191505060405180910390fd5b81811015610c215760405162461bcd60e51b8152600401808060200182810382526037815260200180611f246037913960400191505060405180910390fd5b610c29610f56565b15610cf6576001600160a01b03841660009081526006602090815260408083205460059092529091205481610c9f57671bc16d674ec80000851015610c9f5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b6000610cb1838763ffffffff611cae16565b905081811115610cf25760405162461bcd60e51b81526004018080602001828103825260348152602001806122836034913960400191505060405180910390fd5b5050505b67016345785d8a0000831015610d3d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612229602b913960400191505060405180910390fd5b600854604080516340c10f1960e01b81526001600160a01b03878116600483015260248201869052915191909216916340c10f1991604480830192600092919082900301818387803b158015610d9257600080fd5b505af1158015610da6573d6000803e3d6000fd5b50505050610db2611001565b15610dd257600254610dca908363ffffffff611cae16565b600255610e39565b610dda611797565b15610dfa57600354610df2908363ffffffff611cae16565b600355610e39565b610e026117b9565b15610e2257600454610e1a908363ffffffff611cae16565b600455610e39565b600154610e35908363ffffffff611cae16565b6001555b6001600160a01b038416600090815260066020526040902054610e62908463ffffffff611cae16565b6001600160a01b038516600081815260066020908152604091829020939093558051858152928301869052805191927f62ea3479470df7563c5a39f2835a33a651f2d09d29d392aa142ada944f9fdc2b929081900390910190a250505050565b6000546001600160a01b03163314610ed957600080fd5b6001600160a01b038116600090815260056020526040902054610f2d5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f5b6021913960400191505060405180910390fd5b6001600160a01b0316600090815260056020526040812055565b6009546001600160a01b031681565b6000635f5a15404210158015610f6f5750635f5cb84042105b90505b90565b635f5cb84081565b6008546001600160a01b031690565b6a01a784379d99db4200000081565b6000546001600160a01b03163314610fb257600080fd5b600054600160a01b900460ff161515600114610fcd57600080fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60066020526000908152604090205481565b6000635f5f5b404210158015610f6f575050635f61fe40421090565b60025481565b6000546001600160a01b0316331461103a57600080fd5b6110426113fb565b15156001146110825760405162461bcd60e51b815260040180806020018281038252603a815260200180611f7c603a913960400191505060405180910390fd5b61108a610f56565b15801561109c575061109a611001565b155b80156110ad57506110ab611797565b155b80156110be57506110bc6117b9565b155b6110f95760405162461bcd60e51b81526004018080602001828103825260358152602001806122b76035913960400191505060405180910390fd5b6009546001600160a01b0316611156576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e312077616c6c657420736574604482015290519081900360640190fd5b600a546001600160a01b03166111b3576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a204e6f20666f756e646174696f6e322077616c6c657420736574604482015290519081900360640190fd5b47806111f05760405162461bcd60e51b8152600401808060200182810382526025815260200180611fb66025913960400191505060405180910390fd5b6000611214604661120884606463ffffffff611d1116565b9063ffffffff611d5316565b90506000611228838363ffffffff611dac16565b90508261123b838363ffffffff611cae16565b146112775760405162461bcd60e51b815260040180806020018281038252602f815260200180612254602f913960400191505060405180910390fd5b6009546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156112b1573d6000803e3d6000fd5b50600a546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156112ec573d6000803e3d6000fd5b50505050565b6a0422ca8b0a00a42500000081565b671bc16d674ec8000081565b69d3c21bcecceda100000081565b6802b5e3af16b188000081565b60006001600160a01b038216611385576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b6001600160a01b0382166000908152600560205260409020546113a95760006113ac565b60015b90505b919050565b60035481565b6000546001600160a01b031633146113d157600080fd5b600054600160a01b900460ff1615156001146113ec57600080fd5b6000805460ff60a01b19169055565b635f5a1540421190565b635f69e74081565b600054600160a01b900460ff1681565b6000546001600160a01b0316331461143457600080fd5b6001600160a01b03811661148f576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031681565b6a0771d2fa45345aa900000081565b6000546001600160a01b031633146114e657600080fd5b6001600160a01b038116611541576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a20416464726573732063616e6e6f7420626520656d7074790000604482015290519081900360640190fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461157a57600080fd5b671bc16d674ec800008110156115c15760405162461bcd60e51b815260040180806020018281038252602f81526020018061200e602f913960400191505060405180910390fd5b6802b5e3af16b18800008111156116095760405162461bcd60e51b815260040180806020018281038252602e8152602001806120d5602e913960400191505060405180910390fd5b6001600160a01b03909116600090815260056020526040902055565b6000546001600160a01b0316331461163c57600080fd5b600054600160a01b900460ff161561165357600080fd5b6000805460ff60a01b1916600160a01b179055565b60045481565b60056020526000908152604090205481565b635f61fe4081565b606061169261187f565b156116bc5750604080518082019091526008815267119a5b9a5cda195960c21b6020820152610f72565b6116c4611001565b156116f6575060408051808201909152601081526f5072652d53616c6520526f756e64203160801b6020820152610f72565b6116fe611797565b15611730575060408051808201909152601081526f28393296a9b0b632902937bab732101960811b6020820152610f72565b6117386117b9565b1561176a575060408051808201909152601081526f5072652d53616c6520526f756e64203360801b6020820152610f72565b5060408051808201909152600c81526b507269766174652053616c6560a01b602082015290565b60015481565b6000635f64a1404210158015610f6f575050635f674440421090565b60075490565b6000635f69e7404210158015610f6f575050635f71d040421090565b635f5a154081565b60006117e761187f565b156117f457506000610f72565b6117fc611001565b15611812575069d3c21bcecceda1000000610f72565b61181a611797565b1561183157506a01a784379d99db42000000610f72565b6118396117b9565b1561185057506a0422ca8b0a00a425000000610f72565b5069d3c21bcecceda100000090565b635f67444081565b635f5f5b4081565b635f64a14081565b635f71d04081565b635f71d040421190565b6008546001600160a01b031681565b6000546001600160a01b031633146118af57600080fd5b82611901576040805162461bcd60e51b815260206004820152601e60248201527f4572726f723a2042656e656669636961726965732061726520656d7074790000604482015290519081900360640190fd5b80611953576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20496e766573746d656e74732061726520656d70747900000000604482015290519081900360640190fd5b8281146119915760405162461bcd60e51b81526004018080602001828103825260308152602001806121036030913960400191505060405180910390fd5b60005b838110156119ea578282828181106119a857fe5b90506020020135600560008787858181106119bf57fe5b602090810292909201356001600160a01b031683525081019190915260400160002055600101611994565b5050505050565b6000546001600160a01b03163314611a0857600080fd5b611a1061187f565b15611a4c5760405162461bcd60e51b8152600401808060200182810382526033815260200180611fdb6033913960400191505060405180910390fd5b60008111611aa1576040805162461bcd60e51b815260206004820152601d60248201527f4572726f723a2049504d20706572204554482063616e27742062652030000000604482015290519081900360640190fd5b600754811415611ae25760405162461bcd60e51b815260040180806020018281038252602e8152602001806121ce602e913960400191505060405180910390fd5b620186a08110611b235760405162461bcd60e51b815260040180806020018281038252604881526020018061203d6048913960600191505060405180910390fd5b600755565b67016345785d8a000081565b60075481565b6000611b44610f56565b156113a957506001600160a01b03811660009081526005602052604090205415156113af565b6000808211611bc0576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642077656920616d6f756e7400000000000000604482015290519081900360640190fd5b6007546113ac90839063ffffffff611d5316565b6000611bde611001565b15611c0857600254611c019069d3c21bcecceda10000009063ffffffff611dac16565b9050610f72565b611c10611797565b15611c3457600354611c01906a01a784379d99db420000009063ffffffff611dac16565b611c3c6117b9565b15611c7657611c01611c5e611c4f611dee565b6004549063ffffffff611cae16565b6a0422ca8b0a00a4250000009063ffffffff611dac16565b600154610f6f90611ca269d3c21bcecceda10000006a0422ca8b0a00a42500000063ffffffff611cae16565b9063ffffffff611dac16565b600082820183811015611d08576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611d0883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e27565b600082611d6257506000611d0b565b82820282848281611d6f57fe5b0414611d085760405162461bcd60e51b815260040180806020018281038252602181526020018061215c6021913960400191505060405180910390fd5b6000611d0883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ec9565b600069d3c21bcecceda10000006001541115611e2157600154611c019069d3c21bcecceda100000063ffffffff611dac16565b50600090565b60008183611eb35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e78578181015183820152602001611e60565b50505050905090810190601f168015611ea55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611ebf57fe5b0495945050505050565b60008184841115611f1b5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e78578181015183820152602001611e60565b50505090039056fe4572726f723a20507572636861736520657863656564732072656d61696e696e6720746f6b656e7320666f72207468697320726f756e644572726f723a2041646472657373206973206e6f742077686974656c69737465644572726f723a204e6f20726561736f6e20746f2077697468647261772066756e6473206265666f72652073616c652068617320737461727465644572726f723a204e6f2066756e647320617661696c61626c6520746f2077697468647261774572726f723a2043726f776453616c652068617320656e6465642c206e6f206e65656420746f2075706461746520726174696f4572726f723a20496e766573746d656e742069732062656c6f7720707269766174652073656c6c206d696e696d756d4572726f723a20416d6f756e74206f6620746f6b656e732070657220455448207365656d7320756e7265616c6973746963616c6c7920686967682e20496e707574206572726f723f4572726f723a204e6f2065746865722072656365697665642e204d73672e76616c756520697320656d7074794572726f723a204e6f20746f6b656e73206c65667420666f72207468697320726f756e644572726f723a20496e766573746d656e742069732061626f7665206d6178696d756d2073656c6c20616d6f756e744572726f723a20416464726573736573206c656e677468206973206e6f7420657175616c20696e766573746d656e74734572726f723a2041646472657373206973206e6f7420616c6c6f77656420746f207075726368617365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774572726f723a204e6f20726f756e642061637469766520617420746865206d6f6d656e744572726f723a204275726e2f4d696e7420616464726573732063616e7420707572636861736520746f6b656e734572726f723a2050726963657320617265206964656e746963616c2c206e6f206368616e676573206e65656465644572726f723a205061796d65642065786365656473206d6178696d756d2073696e676c652070757263686173654572726f723a205061796d656e7420736d616c6c6572207468616e206d696e696d756d207061796d656e744572726f723a20416d6f756e7420746f2062652073656e74206973206e6f7420657175616c207468652066756e64734572726f723a20546869732070757263686173652065786365656473207468652077686974656c6973746564206c696d697465644572726f723a205769746864726177616c20647572696e672061637469766520726f756e6473206973206e6f7420616c6c6f7765644572726f723a207061796d656e7420746f6f206c6f772e206e6f20746f6b656e7320666f7220746869732077656920616d6f756e74a26469706673582212205c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead464736f6c63430006020033

Deployed Bytecode Sourcemap

19864:13792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30072:1;30060:9;:13;30052:70;;;;-1:-1:-1;;;30052:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30187:5;;-1:-1:-1;;;;;30187:5:0;30173:10;:19;30170:122;;30247:33;30258:10;30270:9;30247:10;:33::i;:::-;19864:13792;;;;;27631:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27631:246:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27631:246:0;-1:-1:-1;;;;;27631:246:0;;:::i;22626:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22626:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;22626:33:0;;;;;;;;;;;;;;22840:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22840:139:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;20855:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20855:62:0;;;:::i;:::-;;;;;;;;;;;;;;;;26500:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26500:99:0;;;:::i;21645:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21645:70:0;;;:::i;26607:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26607:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26607:118:0;-1:-1:-1;;;;;26607:118:0;;:::i;22429:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22429:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22429:47:0;-1:-1:-1;;;;;22429:47:0;;:::i;22985:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22985:121:0;;;:::i;22169:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22169:25:0;;;:::i;28572:1237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28572:1237:0;;;:::i;21990:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21990:70:0;;;:::i;20268:55::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20268:55:0;;;:::i;21300:70::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21300:70:0;;;:::i;20471:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20471:48:0;;;:::i;27885:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27885:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27885:219:0;-1:-1:-1;;;;;27885:219:0;;:::i;22229:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22229:25:0;;;:::i;26321:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26321:80:0;;;:::i;23372:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23372:101:0;;;:::i;21774:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21774:62:0;;;:::i;20191:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20191:30:0;;;:::i;28342:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28342:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28342:222:0;-1:-1:-1;;;;;28342:222:0;;:::i;22666:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22666:33:0;;;:::i;20590:77::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20590:77:0;;;:::i;28112:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28112:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28112:222:0;-1:-1:-1;;;;;28112:222:0;;:::i;27267:356::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27267:356:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27267:356:0;;;;;;;;:::i;26410:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26410:80:0;;;:::i;22289:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22289:25:0;;;:::i;22357:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22357:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22357:44:0;-1:-1:-1;;;;;22357:44:0;;:::i;21201:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21201:62:0;;;:::i;24777:414::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24777:414:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24777:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22103:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22103:31:0;;;:::i;23114:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23114:121:0;;;:::i;24673:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24673:96:0;;;:::i;23243:121::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23243:121:0;;;:::i;20732:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20732:62:0;;;:::i;25199:378::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25199:378:0;;;:::i;21546:62::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21546:62:0;;;:::i;21084:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21084:62:0;;;:::i;21429:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21429:62:0;;;:::i;21891:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21891:62:0;;;:::i;23481:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23481:91:0;;;:::i;22568:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22568:30:0;;;:::i;26733:526::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26733:526:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26733:526:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;26733:526:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26733:526:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26733:526:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;26733:526:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26733:526:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;26733:526:0;;-1:-1:-1;26733:526:0;-1:-1:-1;26733:526:0;:::i;25849:464::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25849:464:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25849:464:0;;:::i;20369:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20369:57:0;;;:::i;22506:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22506:24:0;;;:::i;30307:2244::-;23877:12;:10;:12::i;:::-;:20;;23893:4;23877:20;23869:60;;;;;-1:-1:-1;;;23869:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23948:10;:8;:10::i;:::-;:19;23940:61;;;;;-1:-1:-1;;;23940:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24020:22;:20;:22::i;:::-;:42;;;;24046:16;:14;:16::i;:::-;24020:62;;;;24066:16;:14;:16::i;:::-;24020:82;;;;24086:16;:14;:16::i;:::-;24012:131;;;;-1:-1:-1;;;24012:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30415:26:0;::::1;30407:84;;;;-1:-1:-1::0;;;30407:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30510:27;30524:12;30510:13;:27::i;:::-;30502:81;;;;-1:-1:-1::0;;;30502:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20511:8;30612:17;:32;;30604:90;;;;-1:-1:-1::0;;;30604:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30715:24;30747:45;30774:17;30747:26;:45::i;:::-;30715:77;;30803:18;30835:25;:23;:25::i;:::-;30803:57;;30900:1;30881:16;:20;30873:86;;;;-1:-1:-1::0;;;30873:86:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30991:1;30978:10;:14;30970:63;;;;-1:-1:-1::0;;;30970:63:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31066:16;31052:10;:30;;31044:98;;;;-1:-1:-1::0;;;31044:98:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:22;:20;:22::i;:::-;31155:562;;;-1:-1:-1::0;;;;;31229:26:0;::::1;31197:24;31229:26:::0;;;:12:::1;:26;::::0;;;;;;;;31302:9:::1;:23:::0;;;;;;;31345:21;31342:157:::1;;20316:7;31395:17;:40;;31387:96;;;;-1:-1:-1::0;;;31387:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31515:24;31547:39;:16:::0;31568:17;31547:39:::1;:20;:39;:::i;:::-;31515:71;;31631:17;31611:16;:37;;31603:102;;;;-1:-1:-1::0;;;31603:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31155:562;;;;20417:9;31746:17;:39;;31738:95;;;;-1:-1:-1::0;;;31738:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31866:15;::::0;31854:65:::1;::::0;;-1:-1:-1;;;31854:65:0;;-1:-1:-1;;;;;31854:65:0;;::::1;;::::0;::::1;::::0;;;;;;;;;31866:15;;;::::1;::::0;31854:33:::1;::::0;:65;;;;;31866:15:::1;::::0;31854:65;;;;;;;31866:15;;31854:65;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;31854:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31854:65:0;;;;31943:16;:14;:16::i;:::-;31940:381;;;31989:10;::::0;:32:::1;::::0;32004:16;31989:32:::1;:14;:32;:::i;:::-;31976:10;:45:::0;31940:381:::1;;;32042:16;:14;:16::i;:::-;32039:282;;;32088:10;::::0;:32:::1;::::0;32103:16;32088:32:::1;:14;:32;:::i;:::-;32075:10;:45:::0;32039:282:::1;;;32141:16;:14;:16::i;:::-;32138:183;;;32187:10;::::0;:32:::1;::::0;32202:16;32187:32:::1;:14;:32;:::i;:::-;32174:10;:45:::0;32138:183:::1;;;32271:16;::::0;:38:::1;::::0;32292:16;32271:38:::1;:20;:38;:::i;:::-;32252:16;:57:::0;32138:183:::1;-1:-1:-1::0;;;;;32363:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;:49:::1;::::0;32394:17;32363:49:::1;:30;:49;:::i;:::-;-1:-1:-1::0;;;;;32331:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:81;;;;32430:112;;;;;;;::::1;::::0;;;;;32331:26;;32430:112:::1;::::0;;;;;;;;;::::1;24154:1;;30307:2244:::0;;:::o;27631:246::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;27721:23:0;::::1;27747:1;27721:23:::0;;;:9:::1;:23;::::0;;;;;27713:73:::1;;;;-1:-1:-1::0;;;27713:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27797:23:0::1;27825:1;27797:23:::0;;;:9:::1;:23;::::0;;;;:29;27631:246::o;22626:33::-;;;-1:-1:-1;;;;;22626:33:0;;:::o;22840:139::-;22892:4;20784:10;22917:3;:26;;:53;;;;;20907:10;22947:3;:23;22917:53;22909:62;;22840:139;;:::o;20855:62::-;20907:10;20855:62;:::o;26500:99::-;26576:15;;-1:-1:-1;;;;;26576:15:0;26500:99;:::o;21645:70::-;21697:18;21645:70;:::o;26607:118::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23707:6:::1;::::0;-1:-1:-1;;;23707:6:0;::::1;;;:14;;23717:4;23707:14;23699:23;;;::::0;::::1;;26691:15:::2;:26:::0;;-1:-1:-1;;;;;;26691:26:0::2;-1:-1:-1::0;;;;;26691:26:0;;;::::2;::::0;;;::::2;::::0;;26607:118::o;22429:47::-;;;;;;;;;;;;;:::o;22985:121::-;23031:4;21136:10;23056:3;:20;;:41;;;;-1:-1:-1;;21253:10:0;23080:3;:17;;22985:121::o;22169:25::-;;;;:::o;28572:1237::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;28635:12:::1;:10;:12::i;:::-;:20;;28651:4;28635:20;28627:91;;;;-1:-1:-1::0;;;28627:91:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28751:22;:20;:22::i;:::-;:31;::::0;::::1;:73;;;28799:16;:14;:16::i;:::-;:25;28751:73;:115;;;;;28841:16;:14;:16::i;:::-;:25;28751:115;:157;;;;;28883:16;:14;:16::i;:::-;:25;28751:157;28729:260;;;;-1:-1:-1::0;;;28729:260:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29008:18;::::0;-1:-1:-1;;;;;29008:18:0::1;29000:77;;;::::0;;-1:-1:-1;;;29000:77:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29096:18;::::0;-1:-1:-1;;;;;29096:18:0::1;29088:77;;;::::0;;-1:-1:-1;;;29088:77:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29218:21;29258:18:::0;29250:68:::1;;;;-1:-1:-1::0;;;29250:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29331:34;29371:31;29399:2;29371:23;:14:::0;29390:3:::1;29371:23;:18;:23;:::i;:::-;:27:::0;:31:::1;:27;:31;:::i;:::-;29331:71:::0;-1:-1:-1;29414:34:0::1;29454:46;:14:::0;29331:71;29454:46:::1;:18;:46;:::i;:::-;29414:86:::0;-1:-1:-1;29581:14:0;29519:58:::1;:26:::0;29414:86;29519:58:::1;:30;:58;:::i;:::-;:76;29511:136;;;;-1:-1:-1::0;;;29511:136:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29668:18;::::0;29660:64:::1;::::0;-1:-1:-1;;;;;29668:18:0;;::::1;::::0;29660:64;::::1;;;::::0;29697:26;;29668:18:::1;29660:64:::0;29668:18;29660:64;29697:26;29668:18;29660:64;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;-1:-1:::0;29743:18:0::1;::::0;29735:64:::1;::::0;-1:-1:-1;;;;;29743:18:0;;::::1;::::0;29735:64;::::1;;;::::0;29772:26;;29743:18:::1;29735:64:::0;29743:18;29735:64;29772:26;29743:18;29735:64;::::1;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29735:64:0;23651:1;;;28572:1237::o:0;21990:70::-;22042:18;21990:70;:::o;20268:55::-;20316:7;20268:55;:::o;21300:70::-;21352:18;21300:70;:::o;20471:48::-;20511:8;20471:48;:::o;27885:219::-;27950:4;-1:-1:-1;;;;;27975:26:0;;27967:69;;;;;-1:-1:-1;;;27967:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28055:23:0;;28081:1;28055:23;;;:9;:23;;;;;;28054:42;;28091:5;28054:42;;;28086:4;28054:42;28047:49;;27885:219;;;;:::o;22229:25::-;;;;:::o;26321:80::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23707:6:::1;::::0;-1:-1:-1;;;23707:6:0;::::1;;;:14;;23717:4;23707:14;23699:23;;;::::0;::::1;;26388:5:::2;26379:14:::0;;-1:-1:-1;;;;26379:14:0::2;::::0;;26321:80::o;23372:101::-;20784:10;23439:3;:25;23372:101;:::o;21774:62::-;21826:10;21774:62;:::o;20191:30::-;;;-1:-1:-1;;;20191:30:0;;;;;:::o;28342:222::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;28439:32:0;::::1;28431:75;;;::::0;;-1:-1:-1;;;28431:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28517:18;:39:::0;;-1:-1:-1;;;;;;28517:39:0::1;-1:-1:-1::0;;;;;28517:39:0;;;::::1;::::0;;;::::1;::::0;;28342:222::o;22666:33::-;;;-1:-1:-1;;;;;22666:33:0;;:::o;20590:77::-;20642:25;20590:77;:::o;28112:222::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;-1:-1:-1;;;;;28209:32:0;::::1;28201:75;;;::::0;;-1:-1:-1;;;28201:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28287:18;:39:::0;;-1:-1:-1;;;;;;28287:39:0::1;-1:-1:-1::0;;;;;28287:39:0;;;::::1;::::0;;;::::1;::::0;;28112:222::o;27267:356::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;20316:7:::1;27382:10;:33;;27374:93;;;;-1:-1:-1::0;;;27374:93:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20511:8;27486:10;:25;;27478:84;;;;-1:-1:-1::0;;;27478:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;27575:23:0;;::::1;;::::0;;;:9:::1;:23;::::0;;;;:40;27267:356::o;26410:80::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;23792:6:::1;::::0;-1:-1:-1;;;23792:6:0;::::1;;;:15;23784:24;;;::::0;::::1;;26469:6:::2;:13:::0;;-1:-1:-1;;;;26469:13:0::2;-1:-1:-1::0;;;26469:13:0::2;::::0;;26410:80::o;22289:25::-;;;;:::o;22357:44::-;;;;;;;;;;;;;:::o;21201:62::-;21253:10;21201:62;:::o;24777:414::-;24826:13;24855:10;:8;:10::i;:::-;24852:59;;;-1:-1:-1;24882:17:0;;;;;;;;;;;;-1:-1:-1;;;24882:17:0;;;;;;24852:59;24924:16;:14;:16::i;:::-;24921:231;;;-1:-1:-1;24957:25:0;;;;;;;;;;;;-1:-1:-1;;;24957:25:0;;;;;;24921:231;25003:16;:14;:16::i;:::-;25000:152;;;-1:-1:-1;25036:25:0;;;;;;;;;;;;-1:-1:-1;;;25036:25:0;;;;;;25000:152;25082:16;:14;:16::i;:::-;25079:73;;;-1:-1:-1;25115:25:0;;;;;;;;;;;;-1:-1:-1;;;25115:25:0;;;;;;25079:73;-1:-1:-1;25162:21:0;;;;;;;;;;;;-1:-1:-1;;;25162:21:0;;;;24777:414;:::o;22103:31::-;;;;:::o;23114:121::-;23160:4;21481:10;23185:3;:20;;:41;;;;-1:-1:-1;;21598:10:0;23209:3;:17;;23114:121::o;24673:96::-;24752:9;;24673:96;:::o;23243:121::-;23289:4;21826:10;23314:3;:20;;:41;;;;-1:-1:-1;;21943:10:0;23338:3;:17;;23243:121::o;20732:62::-;20784:10;20732:62;:::o;25199:378::-;25245:7;25268:10;:8;:10::i;:::-;25265:50;;;-1:-1:-1;25302:1:0;25295:8;;25265:50;25328:16;:14;:16::i;:::-;25325:210;;;-1:-1:-1;21352:18:0;25361;;25325:210;25400:16;:14;:16::i;:::-;25397:138;;;-1:-1:-1;21697:18:0;25433;;25397:138;25472:16;:14;:16::i;:::-;25469:66;;;-1:-1:-1;22042:18:0;25505;;25469:66;-1:-1:-1;21007:18:0;25199:378;:::o;21546:62::-;21598:10;21546:62;:::o;21084:::-;21136:10;21084:62;:::o;21429:::-;21481:10;21429:62;:::o;21891:::-;21943:10;21891:62;:::o;23481:91::-;21943:10;23546:3;:17;23481:91;:::o;22568:30::-;;;-1:-1:-1;;;;;22568:30:0;;:::o;26733:526::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;26860:25;26852:68:::1;;;::::0;;-1:-1:-1;;;26852:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26939:22:::0;26931:63:::1;;;::::0;;-1:-1:-1;;;26931:63:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27013:43:::0;;::::1;27005:104;;;;-1:-1:-1::0;;;27005:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27134:9;27130:122;27146:23:::0;;::::1;27130:122;;;27226:11;;27238:1;27226:14;;;;;;;;;;;;;27190:9;:28;27200:14;;27215:1;27200:17;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;27200:17:0::1;27190:28:::0;;-1:-1:-1;27190:28:0;::::1;::::0;;;;;;-1:-1:-1;27190:28:0;:50;27170:3:::1;;27130:122;;;;26733:526:::0;;;;:::o;25849:464::-;23634:5;;-1:-1:-1;;;;;23634:5:0;23620:10;:19;23612:28;;;;;;25929:10:::1;:8;:10::i;:::-;:19;25921:83;;;;-1:-1:-1::0;;;25921:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26033:1;26023:7;:11;26015:53;;;::::0;;-1:-1:-1;;;26015:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26098:9;;26087:7;:20;;26079:79;;;;-1:-1:-1::0;;;26079:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26187:6;26177:7;:16;26169:101;;;;-1:-1:-1::0;;;26169:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26283:9;:22:::0;25849:464::o;20369:57::-;20417:9;20369:57;:::o;22506:24::-;;;;:::o;32764:203::-;32831:4;32851:22;:20;:22::i;:::-;32848:90;;;-1:-1:-1;;;;;;32898:23:0;;32924:1;32898:23;;;:9;:23;;;;;;:27;;32890:36;;32559:197;32635:7;32674:1;32663:8;:12;32655:50;;;;;-1:-1:-1;;;32655:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32738:9;;32725:23;;:8;;:23;:12;:23;:::i;32975:448::-;33032:7;33055:16;:14;:16::i;:::-;33052:290;;;33111:10;;33095:27;;21352:18;;33095:27;:15;:27;:::i;:::-;33088:34;;;;33052:290;33143:16;:14;:16::i;:::-;33140:202;;;33199:10;;33183:27;;21697:18;;33183:27;:15;:27;:::i;33140:202::-;33231:16;:14;:16::i;:::-;33228:114;;;33271:59;33287:42;33302:26;:24;:26::i;:::-;33287:10;;;:42;:14;:42;:::i;:::-;22042:18;;33271:59;:15;:59;:::i;33228:114::-;33398:16;;33359:56;;:34;21007:18;22042;33359:34;:21;:34;:::i;:::-;:38;:56;:38;:56;:::i;3790:181::-;3848:7;3880:5;;;3904:6;;;;3896:46;;;;;-1:-1:-1;;;3896:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3962:1;-1:-1:-1;3790:181:0;;;;;:::o;6091:132::-;6149:7;6176:39;6180:1;6183;6176:39;;;;;;;;;;;;;;;;;:3;:39::i;5144:471::-;5202:7;5447:6;5443:47;;-1:-1:-1;5477:1:0;5470:8;;5443:47;5514:5;;;5518:1;5514;:5;:1;5538:5;;;;;:10;5530:56;;;;-1:-1:-1;;;5530:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4254:136;4312:7;4339:43;4343:1;4346;4339:43;;;;;;;;;;;;;;;;;:3;:43::i;33431:220::-;33489:7;21007:18;33512:16;;:36;33509:114;;;33572:16;;:39;;21007:18;33572:39;:20;:39;:::i;33509:114::-;-1:-1:-1;33642:1:0;33431:220;:::o;6719:278::-;6805:7;6840:12;6833:5;6825:28;;;;-1:-1:-1;;;6825:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6825:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6864:9;6880:1;6876;:5;;;;;;;6719:278;-1:-1:-1;;;;;6719:278:0:o;4693:192::-;4779:7;4815:12;4807:6;;;;4799:29;;;;-1:-1:-1;;;4799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4799:29:0;-1:-1:-1;;;4851:5:0;;;4693:192::o

Swarm Source

ipfs://5c197172575d10cbc8531fbd92829a9092aca5dd16026f5e7618170c43e4ead4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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