ETH Price: $2,602.19 (-2.34%)

Token

Reeth Token (REETH)
 

Overview

Max Total Supply

2.903826418206619113 REETH

Holders

31

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
uniswapvillain.eth
Balance
0 REETH

Value
$0.00
0xdec08cb92a506b88411da9ba290f3694be223c26
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ReethToken

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-03
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.0;

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

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

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

pragma solidity ^0.6.0;

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

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

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

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

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

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

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

    /**
     * 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

pragma solidity ^0.6.0;

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

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

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

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

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

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

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

    /**
     * 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/token/ERC20/ERC20.sol

pragma solidity ^0.6.0;

/**
 * Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract RebaseableERC20 is Context, IERC20 {
    using SafeMath for uint256;
    
    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;
    
    uint256 public constant internalDecimals = 1e24;

    /**
     * @notice Used for percentage maths
     */
    uint256 public constant BASE = 1e18;

    /**
     * @notice Scaling factor that adjusts everyone's balances
     */
    uint256 public reethScalingFactor;

    mapping (address => uint256) internal _reethBalances;

    mapping (address => mapping (address => uint256)) internal _allowedFragments;
    
    uint256 public initSupply;
    
    /**
     * Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }
    
    function _initialize(address recipient, uint256 initialSupply) internal {
        reethScalingFactor = BASE;
        initSupply = _fragmentToReeth(initialSupply);
        _totalSupply = initialSupply;
        _reethBalances[recipient] = initSupply;
        emit Transfer(address(0), recipient, initialSupply);
    }
    
    /**
     * @notice Event emitted when tokens are rebased
     */

    // Prevent sending to this address or 0 address
    modifier validRecipient(address to) {
        require(to != address(0) && to != address(this), "Not a valid recipient");
        _;
    }
    
    /**
    * @notice Computes the current max scaling factor
    */
    function maxScalingFactor()
        external
        view
        returns (uint256)
    {
        return _maxScalingFactor();
    }

    function _maxScalingFactor()
        internal
        view
        returns (uint256)
    {
        // scaling factor can only go up to 2**256-1 = initSupply * reethScalingFactor
        // this is used to check if reethScalingFactor will be too high to compute balances when rebasing.
        return uint256(-1) / initSupply;
    }

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

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

    /**
     * Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

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

    /**
     * See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _reethToFragment(_reethBalances[account]);
    }
    /**

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

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

    /**
     * See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowedFragments[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

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

        // underlying balance is stored in reeth subunit, so divide by current scaling factor

        // note, this means as scaling factor grows, dust will be untransferrable.
        // minimum transfer value == reethScalingFactor / 1e24;

        // get amount in underlying
        uint256 reethValue = _fragmentToReeth(amount);

        // sub from balance of sender
        _reethBalances[sender] = _reethBalances[sender].sub(reethValue, "ERC20: transfer amount exceeds balance");

        // add to balance of receiver
        _reethBalances[recipient] = _reethBalances[recipient].add(reethValue);
        emit Transfer(sender, recipient, amount);
    }

    /** Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address to, uint256 amount) internal virtual validRecipient(to) {
        // increase totalSupply
        _totalSupply = _totalSupply.add(amount);

        // get underlying value
        uint256 reethValue = _fragmentToReeth(amount);

        // increase initSupply
        initSupply = initSupply.add(reethValue);

        // make sure the mint didnt push maxScalingFactor too low
        require(reethScalingFactor <= _maxScalingFactor(), "max scaling factor too low");

        // add balance
        _reethBalances[to] = _reethBalances[to].add(reethValue);

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

        // decrease totalSupply
        _totalSupply = _totalSupply.sub(amount);

        // get underlying value
        uint256 reethValue = _fragmentToReeth(amount);

        // decrease initSupply
        initSupply = initSupply.sub(reethValue);

        // probably unnecessary check
        require(reethScalingFactor <= _maxScalingFactor(), "max scaling factor too low");

        // sub balance
        _reethBalances[account] = _reethBalances[account].sub(reethValue, "ERC20: burn amount exceeds balance");

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

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

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

    /**
     * Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }
    
    // Scaling functions
    function reethToFragment(uint256 val)
        external
        view
        returns (uint256)
    {
        return _reethToFragment(val);
    }

    function fragmentToReeth(uint256 val)
        external
        view
        returns (uint256)
    {
        return _fragmentToReeth(val);
    }

    function _reethToFragment(uint256 val)
        internal
        view
        returns (uint256)
    {
        return val.mul(reethScalingFactor).div(internalDecimals);
    }

    function _fragmentToReeth(uint256 val)
        internal
        view
        returns (uint256)
    {
        return val.mul(internalDecimals).div(reethScalingFactor);
    }
    
    /**
     * Hook that is called before any transfer of tokens.
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _transferHook() internal virtual returns (bool) {}
}

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

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

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: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.6.0;

/**
 * Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

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

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

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

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

// File: contracts/ReethToken.sol

pragma solidity =0.6.6;

interface MonetaryPolicyInterface{
    // This function is called whenever reeth is transferred
    function reethTransferActions() external;
}

// Reeth token whose supply can be altered by its price compared to ETH

contract ReethToken is RebaseableERC20("Reeth Token", "REETH"), Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    
    address public monetaryPolicy;
    uint256 private _latestEpoch;
    bool public rebaseable;
    
    struct Epoch {
        uint256 price;
        int256 supplyChangeAmount;
        uint256 rebaseTime;
    }
    
    // These are addresses that are allowed to mint new tokens
    mapping (address => bool) internal _allowedMinters;
    mapping (uint256 => Epoch) internal _epochDetails;
    
    modifier onlyMonetaryPolicy() {
        require(_msgSender() == monetaryPolicy, "Not monetary policy");
        _;
    }
    
    modifier onlyMinters() {
        require(isMinter(_msgSender()) == true, "Not a minter");
        _;
    }

    event Rebase(uint256 epoch, uint256 currentPrice, int256 supplyChangeAmount, uint256 currentSupply);

    constructor(uint256 _initialSupply) public {
        _initialize(_msgSender(), _initialSupply);
    }
    
    function isMinter(address _addr) public view returns (bool) {
        return _allowedMinters[_addr];
    }
    
    function latestEpoch() external view returns (uint256) {
        return _latestEpoch;
    }
    
    function getEpochDetails(uint256 _pos) external view returns (uint256, int256, uint256) {
        if(_pos == 0) { return (0, 0, 0); } // No epoch available yet as no rebases have happened yet
        _pos = _pos.sub(1);
        require(_pos < _latestEpoch, "Epoch doesn't yet exist");
        return (_epochDetails[_pos].price, _epochDetails[_pos].supplyChangeAmount, _epochDetails[_pos].rebaseTime);
    }
    
    function isRebaseable() external view returns (bool) {
        return rebaseable;
    }
    
    // This function is called when tokens are being transferred
    function _transferHook() internal virtual override returns (bool) {
        super._transferHook(); // Call parent hook
        if(monetaryPolicy != address(0)){
            MonetaryPolicyInterface(monetaryPolicy).reethTransferActions();
        }
    }
    
    function mint(address recipient, uint256 amount) external onlyMinters returns (bool) {
        _mint(recipient, amount);
        return true;
    }
    
    // Users can burn their own tokens if they want to
    function burn(uint256 amount) external returns (bool) {
        _burn(_msgSender(), amount);
        return true;
    }
    
    /**
    * @notice Initiates a new rebase operation based on the current monetary policy
    */
    function rebase(
        uint256 price,
        uint256 indexDelta,
        bool positive
    )
        external
        onlyMonetaryPolicy
        returns (uint256)
    {
        require(rebaseable == true, "Not yet able to rebase token");
        _latestEpoch = _latestEpoch.add(1);
        uint256 _EpochPos = _latestEpoch.sub(1);
        
        // no change
        if (indexDelta == 0) {
          emit Rebase(_latestEpoch, price, 0, _totalSupply);
          _epochDetails[_EpochPos].price = price;
          _epochDetails[_EpochPos].supplyChangeAmount = 0;
          _epochDetails[_EpochPos].rebaseTime = now;
          return _totalSupply;
        }

        if (!positive) {
            // negative rebase, decrease scaling factor
            reethScalingFactor = reethScalingFactor.mul(BASE.sub(indexDelta)).div(BASE);
        } else {
            // positive reabse, increase scaling factor
            uint256 newScalingFactor = reethScalingFactor.mul(BASE.add(indexDelta)).div(BASE);
            if (newScalingFactor < _maxScalingFactor()) {
                reethScalingFactor = newScalingFactor;
            } else {
                reethScalingFactor = _maxScalingFactor();
            }
        }

        // update total supply, correctly
        uint256 oldSupply = _totalSupply;
        int256 supplyChange = 0;
        _totalSupply = _reethToFragment(initSupply);
        
        // Calculate the change in tokens
        if(oldSupply < _totalSupply){
            // Expanded supply
            oldSupply = _totalSupply.sub(oldSupply);
            supplyChange = int256(oldSupply);
        }else if(oldSupply > _totalSupply){
            // Supply shrank
            oldSupply = oldSupply.sub(_totalSupply);
            supplyChange = 0 - int256(oldSupply);
        }

        emit Rebase(_latestEpoch, price, supplyChange, _totalSupply);
        _epochDetails[_EpochPos].price = price;
        _epochDetails[_EpochPos].supplyChangeAmount = supplyChange;
        _epochDetails[_EpochPos].rebaseTime = now;
        return _totalSupply;
    }

    // Governance functions
    function governanceActivateRebasing() external onlyGovernance {
        require(rebaseable == false, "Already rebaseable");
        rebaseable = true;
    }
    
    // Now add some governance functions behind 24 hour timelock
    
    // Timelock variables

    uint256 private _timelockStart; // The start of the timelock to change governance variables
    uint256 private _timelockType; // The function that needs to be changed
    uint256 constant TIMELOCK_DURATION = 86400; // Timelock is 24 hours
    
    // Reusable timelock variables
    address private _timelock_address;
    
    modifier timelockConditionsMet(uint256 _type) {
        require(_timelockType == _type, "Timelock not acquired for this function");
        _timelockType = 0; // Reset the type once the timelock is used
        if(rebaseable == true){
            require(now >= _timelockStart + TIMELOCK_DURATION, "Timelock time not met");
        }
        _;
    }
    
    // Change the governance
    // --------------------
    function startChangeGovernance(address _address) external onlyGovernance {
        _timelockStart = now;
        _timelockType = 1;
        _timelock_address = _address;       
    }
    
    function finishChangeGovernance() external onlyGovernance timelockConditionsMet(1) {
        _transferGovernance(_timelock_address);
    }
    // --------------------
    
    // Add a new minter
    // --------------------
    function startAddMinter(address _address) external onlyGovernance {
        _timelockStart = now;
        _timelockType = 2;
        _timelock_address = _address;       
    }
    
    function finishAddMinter() external onlyGovernance timelockConditionsMet(2) {
        _allowedMinters[_timelock_address] = true;
    }
    // --------------------
    
    // Remove a minter
    // --------------------
    function startRemoveMinter(address _address) external onlyGovernance {
        _timelockStart = now;
        _timelockType = 3;
        _timelock_address = _address;       
    }
    
    function finishRemoveMinter() external onlyGovernance timelockConditionsMet(3) {
        _allowedMinters[_timelock_address] = false;
    }
    // --------------------
    
    // Change the monetary policy
    // --------------------
    function startChangeMonetaryPolicy(address _address) external onlyGovernance {
        _timelockStart = now;
        _timelockType = 4;
        _timelock_address = _address;       
    }
    
    function finishChangeMonetaryPolicy() external onlyGovernance timelockConditionsMet(4) {
        monetaryPolicy = _timelock_address;
    }
    // --------------------
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_initialSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"GovernanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentPrice","type":"uint256"},{"indexed":false,"internalType":"int256","name":"supplyChangeAmount","type":"int256"},{"indexed":false,"internalType":"uint256","name":"currentSupply","type":"uint256"}],"name":"Rebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishChangeMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishRemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"fragmentToReeth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pos","type":"uint256"}],"name":"getEpochDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceActivateRebasing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"internalDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRebaseable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"monetaryPolicy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"indexDelta","type":"uint256"},{"internalType":"bool","name":"positive","type":"bool"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebaseable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reethScalingFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"reethToFragment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startChangeMonetaryPolicy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"startRemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620024ef380380620024ef833981810160405260208110156200003757600080fd5b5051604080518082018252600b81526a2932b2ba34102a37b5b2b760a91b6020828101918252835180850190945260058452640a48a8aa8960db1b908401528151919291620000899160019162000361565b5080516200009f90600290602084019062000361565b50506003805460ff19166012179055506000620000c46001600160e01b036200014016565b600880546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce80908290a35062000139620001296001600160e01b036200014016565b826001600160e01b036200014516565b5062000403565b335b90565b670de0b6b3a764000060045562000165816001600160e01b03620001c416565b600781905560008281556001600160a01b038416808252600560209081526040808420949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600062000205600454620001f169d3c21bcecceda1000000856200020b60201b62001c511790919060201c565b6200027060201b62001caa1790919060201c565b92915050565b6000826200021c5750600062000205565b828202828482816200022a57fe5b0414620002695760405162461bcd60e51b8152600401808060200182810382526021815260200180620024ce6021913960400191505060405180910390fd5b9392505050565b60006200026983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620002ba60201b60201c565b600081836200034a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200030e578181015183820152602001620002f4565b50505050905090810190601f1680156200033c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200035757fe5b0495945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003a457805160ff1916838001178555620003d4565b82800160010185558215620003d4579182015b82811115620003d4578251825591602001919060010190620003b7565b50620003e2929150620003e6565b5090565b6200014291905b80821115620003e25760008155600101620003ed565b6120bb80620004136000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806364dd48f511610130578063a457c2d7116100b8578063da9182f41161007c578063da9182f414610626578063dd62ed3e1461062e578063e9a3a0591461065c578063ec096c5414610664578063ec342ad01461066c57610227565b8063a457c2d714610583578063a9059cbb146105af578063aa271e1a146105db578063d560cf6014610601578063d5f56d7a1461060957610227565b8063904fe336116100ff578063904fe3361461053d57806395d89b411461054557806397d63f931461054d578063992acccd146105555780639cb118bf1461057b57610227565b806364dd48f5146104dc57806370a08231146104e45780637af548c11461050a5780638e27d7d71461053557610227565b806336125c8f116101b35780634f9b8802116101825780634f9b88021461042957806352cc3f63146104315780635a7f3cb6146104575780635aa6e6751461047d5780635c3d7516146104a157610227565b806336125c8f1461039757806339509351146103b457806340c10f19146103e057806342966c681461040c57610227565b806311d3e6c4116101fa57806311d3e6c41461030d57806318160ddd1461031557806323b872dd1461031d578063313ce56714610353578063339dae101461037157610227565b806304b066531461022c57806306fdde0314610236578063095ea7b3146102b35780630be2e4ee146102f3575b600080fd5b610234610674565b005b61023e610728565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610278578181015183820152602001610260565b50505050905090810190601f1680156102a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102df600480360360408110156102c957600080fd5b506001600160a01b0381351690602001356107be565b604080519115158252519081900360200190f35b6102fb6107dc565b60408051918252519081900360200190f35b6102fb6107e2565b6102fb6107f1565b6102df6004803603606081101561033357600080fd5b506001600160a01b038135811691602081013590911690604001356107f7565b61035b610885565b6040805160ff9092168252519081900360200190f35b6102346004803603602081101561038757600080fd5b50356001600160a01b031661088e565b6102fb600480360360208110156103ad57600080fd5b5035610911565b6102df600480360360408110156103ca57600080fd5b506001600160a01b03813516906020013561091c565b6102df600480360360408110156103f657600080fd5b506001600160a01b038135169060200135610970565b6102df6004803603602081101561042257600080fd5b50356109d1565b6102346109ec565b6102346004803603602081101561044757600080fd5b50356001600160a01b0316610b14565b6102346004803603602081101561046d57600080fd5b50356001600160a01b0316610b97565b610485610c1a565b604080516001600160a01b039092168252519081900360200190f35b6104be600480360360208110156104b757600080fd5b5035610c29565b60408051938452602084019290925282820152519081900360600190f35b6102fb610cd2565b6102fb600480360360208110156104fa57600080fd5b50356001600160a01b0316610ce0565b6102fb6004803603606081101561052057600080fd5b50803590602081013590604001351515610d02565b610485610fd8565b610234610fe7565b61023e611112565b6102fb611170565b6102346004803603602081101561056b57600080fd5b50356001600160a01b0316611176565b6102fb6111f9565b6102df6004803603604081101561059957600080fd5b506001600160a01b0381351690602001356111ff565b6102df600480360360408110156105c557600080fd5b506001600160a01b03813516906020013561126d565b6102df600480360360208110156105f157600080fd5b50356001600160a01b0316611281565b6102df61129f565b6102fb6004803603602081101561061f57600080fd5b50356112a8565b6102df6112b3565b6102fb6004803603604081101561064457600080fd5b506001600160a01b03813581169160200135166112bc565b6102346112e7565b61023461140f565b6102fb61152a565b61067c611536565b6008546001600160a01b039081169116146106cc576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600b5460ff1615610719576040805162461bcd60e51b8152602060048201526012602482015271416c72656164792072656261736561626c6560701b604482015290519081900360640190fd5b600b805460ff19166001179055565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b505050505090505b90565b60006107d26107cb611536565b848461153a565b5060015b92915050565b60045481565b60006107ec611626565b905090565b60005490565b600061080484848461163b565b61087a84610810611536565b61087585604051806060016040528060288152602001611faf602891396001600160a01b038a1660009081526006602052604081209061084e611536565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6117d716565b61153a565b5060015b9392505050565b60035460ff1690565b610896611536565b6008546001600160a01b039081169116146108e6576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556004600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006107d68261186e565b60006107d2610929611536565b84610875856006600061093a611536565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61189216565b600061098261097d611536565b611281565b15156001146109c7576040805162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6107d283836118ec565b60006109e46109de611536565b83611a72565b506001919050565b6109f4611536565b6008546001600160a01b03908116911614610a44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600380600f5414610a865760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff16151560011415610aef5762015180600e5401421015610aef576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19169055565b610b1c611536565b6008546001600160a01b03908116911614610b6c576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556003600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b610b9f611536565b6008546001600160a01b03908116911614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556001600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6000808083610c4057506000915081905080610ccb565b610c5184600163ffffffff611bea16565b9350600a548410610ca9576040805162461bcd60e51b815260206004820152601760248201527f45706f636820646f65736e277420796574206578697374000000000000000000604482015290519081900360640190fd5b5050506000818152600d60205260409020805460018201546002909201549091905b9193909250565b69d3c21bcecceda100000081565b6001600160a01b0381166000908152600560205260408120546107d690611c2c565b6009546000906001600160a01b0316610d19611536565b6001600160a01b031614610d6a576040805162461bcd60e51b81526020600482015260136024820152724e6f74206d6f6e657461727920706f6c69637960681b604482015290519081900360640190fd5b600b5460ff161515600114610dc6576040805162461bcd60e51b815260206004820152601c60248201527f4e6f74207965742061626c6520746f2072656261736520746f6b656e00000000604482015290519081900360640190fd5b600a54610dda90600163ffffffff61189216565b600a819055600090610df390600163ffffffff611bea16565b905083610e6d57600a54600080546040805193845260208401899052838101929092526060830152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000908152600d60205260408120858155600181018290554260029091015554905061087e565b82610eb457610eac670de0b6b3a7640000610ea0610e91828863ffffffff611bea16565b6004549063ffffffff611c5116565b9063ffffffff611caa16565b600455610efe565b6000610ed5670de0b6b3a7640000610ea0610e91828963ffffffff61189216565b9050610edf611626565b811015610ef0576004819055610efc565b610ef8611626565b6004555b505b60008054600754909190610f1190611c2c565b6000819055821015610f3a57600054610f30908363ffffffff611bea16565b9150819050610f61565b600054821115610f6157600054610f5890839063ffffffff611bea16565b91508160000390505b600a5460005460408051928352602083018a90528281018490526060830191909152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000928352600d602052604083209687556001870155504260029095019490945550509054919050565b6009546001600160a01b031681565b610fef611536565b6008546001600160a01b0390811691161461103f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600280600f54146110815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156110ea5762015180600e54014210156110ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19166001179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60075481565b61117e611536565b6008546001600160a01b039081169116146111ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556002600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b600a5490565b60006107d261120c611536565b84610875856040518060600160405280602581526020016120616025913960066000611236611536565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6117d716565b60006107d261127a611536565b848461163b565b6001600160a01b03166000908152600c602052604090205460ff1690565b600b5460ff1690565b60006107d682611c2c565b600b5460ff1681565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6112ef611536565b6008546001600160a01b0390811691161461133f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600480600f54146113815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156113ea5762015180600e54014210156113ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50601054600980546001600160a01b0319166001600160a01b03909216919091179055565b611417611536565b6008546001600160a01b03908116911614611467576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600180600f54146114a95760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156115125762015180600e5401421015611512576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b601054611527906001600160a01b0316611cec565b50565b670de0b6b3a764000081565b3390565b6001600160a01b03831661157f5760405162461bcd60e51b815260040180806020018281038252602481526020018061203d6024913960400191505060405180910390fd5b6001600160a01b0382166115c45760405162461bcd60e51b8152600401808060200182810382526022815260200180611f1f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006007546000198161163557fe5b04905090565b816001600160a01b0381161580159061165d57506001600160a01b0381163014155b6116a6576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b6001600160a01b0384166116eb5760405162461bcd60e51b81526004018080602001828103825260258152602001806120186025913960400191505060405180910390fd5b6116f3611de5565b5060006116ff8361186e565b905061174481604051806060016040528060268152602001611f41602691396001600160a01b038816600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b038087166000908152600560205260408082209390935590861681522054611779908263ffffffff61189216565b6001600160a01b0380861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050565b600081848411156118665760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182b578181015183820152602001611813565b50505050905090810190601f1680156118585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6004546000906107d690610ea08469d3c21bcecceda100000063ffffffff611c5116565b60008282018381101561087e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0381161580159061190e57506001600160a01b0381163014155b611957576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60005461196a908363ffffffff61189216565b60009081556119788361186e565b60075490915061198e908263ffffffff61189216565b600755611999611626565b60045411156119ef576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611a18908263ffffffff61189216565b6001600160a01b03851660008181526005602090815260408083209490945583518781529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505050565b6001600160a01b038216611ab75760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff76021913960400191505060405180910390fd5b600054611aca908263ffffffff611bea16565b6000908155611ad88261186e565b600754909150611aee908263ffffffff611bea16565b600755611af9611626565b6004541115611b4f576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b611b9281604051806060016040528060228152602001611ed7602291396001600160a01b038616600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b0384166000818152600560209081526040808320949094558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b600061087e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117d7565b60006107d669d3c21bcecceda1000000610ea060045485611c5190919063ffffffff16565b600082611c60575060006107d6565b82820282848281611c6d57fe5b041461087e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f8e6021913960400191505060405180910390fd5b600061087e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e6c565b611cf4611536565b6008546001600160a01b03908116911614611d44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b6001600160a01b038116611d895760405162461bcd60e51b8152600401808060200182810382526026815260200180611ef96026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000611def611ed1565b506009546001600160a01b0316156107bb57600960009054906101000a90046001600160a01b03166001600160a01b031663b9abdfef6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e5157600080fd5b505af1158015611e65573d6000803e3d6000fd5b5050505090565b60008183611ebb5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561182b578181015183820152602001611813565b506000838581611ec757fe5b0495945050505050565b60009056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c1145564736f6c63430006060033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7700000000000000000000000000000000000000000000000392c2d8d1b3669d23

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c806364dd48f511610130578063a457c2d7116100b8578063da9182f41161007c578063da9182f414610626578063dd62ed3e1461062e578063e9a3a0591461065c578063ec096c5414610664578063ec342ad01461066c57610227565b8063a457c2d714610583578063a9059cbb146105af578063aa271e1a146105db578063d560cf6014610601578063d5f56d7a1461060957610227565b8063904fe336116100ff578063904fe3361461053d57806395d89b411461054557806397d63f931461054d578063992acccd146105555780639cb118bf1461057b57610227565b806364dd48f5146104dc57806370a08231146104e45780637af548c11461050a5780638e27d7d71461053557610227565b806336125c8f116101b35780634f9b8802116101825780634f9b88021461042957806352cc3f63146104315780635a7f3cb6146104575780635aa6e6751461047d5780635c3d7516146104a157610227565b806336125c8f1461039757806339509351146103b457806340c10f19146103e057806342966c681461040c57610227565b806311d3e6c4116101fa57806311d3e6c41461030d57806318160ddd1461031557806323b872dd1461031d578063313ce56714610353578063339dae101461037157610227565b806304b066531461022c57806306fdde0314610236578063095ea7b3146102b35780630be2e4ee146102f3575b600080fd5b610234610674565b005b61023e610728565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610278578181015183820152602001610260565b50505050905090810190601f1680156102a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102df600480360360408110156102c957600080fd5b506001600160a01b0381351690602001356107be565b604080519115158252519081900360200190f35b6102fb6107dc565b60408051918252519081900360200190f35b6102fb6107e2565b6102fb6107f1565b6102df6004803603606081101561033357600080fd5b506001600160a01b038135811691602081013590911690604001356107f7565b61035b610885565b6040805160ff9092168252519081900360200190f35b6102346004803603602081101561038757600080fd5b50356001600160a01b031661088e565b6102fb600480360360208110156103ad57600080fd5b5035610911565b6102df600480360360408110156103ca57600080fd5b506001600160a01b03813516906020013561091c565b6102df600480360360408110156103f657600080fd5b506001600160a01b038135169060200135610970565b6102df6004803603602081101561042257600080fd5b50356109d1565b6102346109ec565b6102346004803603602081101561044757600080fd5b50356001600160a01b0316610b14565b6102346004803603602081101561046d57600080fd5b50356001600160a01b0316610b97565b610485610c1a565b604080516001600160a01b039092168252519081900360200190f35b6104be600480360360208110156104b757600080fd5b5035610c29565b60408051938452602084019290925282820152519081900360600190f35b6102fb610cd2565b6102fb600480360360208110156104fa57600080fd5b50356001600160a01b0316610ce0565b6102fb6004803603606081101561052057600080fd5b50803590602081013590604001351515610d02565b610485610fd8565b610234610fe7565b61023e611112565b6102fb611170565b6102346004803603602081101561056b57600080fd5b50356001600160a01b0316611176565b6102fb6111f9565b6102df6004803603604081101561059957600080fd5b506001600160a01b0381351690602001356111ff565b6102df600480360360408110156105c557600080fd5b506001600160a01b03813516906020013561126d565b6102df600480360360208110156105f157600080fd5b50356001600160a01b0316611281565b6102df61129f565b6102fb6004803603602081101561061f57600080fd5b50356112a8565b6102df6112b3565b6102fb6004803603604081101561064457600080fd5b506001600160a01b03813581169160200135166112bc565b6102346112e7565b61023461140f565b6102fb61152a565b61067c611536565b6008546001600160a01b039081169116146106cc576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600b5460ff1615610719576040805162461bcd60e51b8152602060048201526012602482015271416c72656164792072656261736561626c6560701b604482015290519081900360640190fd5b600b805460ff19166001179055565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b820191906000526020600020905b81548152906001019060200180831161079657829003601f168201915b505050505090505b90565b60006107d26107cb611536565b848461153a565b5060015b92915050565b60045481565b60006107ec611626565b905090565b60005490565b600061080484848461163b565b61087a84610810611536565b61087585604051806060016040528060288152602001611faf602891396001600160a01b038a1660009081526006602052604081209061084e611536565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6117d716565b61153a565b5060015b9392505050565b60035460ff1690565b610896611536565b6008546001600160a01b039081169116146108e6576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556004600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006107d68261186e565b60006107d2610929611536565b84610875856006600061093a611536565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61189216565b600061098261097d611536565b611281565b15156001146109c7576040805162461bcd60e51b815260206004820152600c60248201526b2737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6107d283836118ec565b60006109e46109de611536565b83611a72565b506001919050565b6109f4611536565b6008546001600160a01b03908116911614610a44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600380600f5414610a865760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff16151560011415610aef5762015180600e5401421015610aef576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19169055565b610b1c611536565b6008546001600160a01b03908116911614610b6c576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556003600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b610b9f611536565b6008546001600160a01b03908116911614610bef576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556001600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b031690565b6000808083610c4057506000915081905080610ccb565b610c5184600163ffffffff611bea16565b9350600a548410610ca9576040805162461bcd60e51b815260206004820152601760248201527f45706f636820646f65736e277420796574206578697374000000000000000000604482015290519081900360640190fd5b5050506000818152600d60205260409020805460018201546002909201549091905b9193909250565b69d3c21bcecceda100000081565b6001600160a01b0381166000908152600560205260408120546107d690611c2c565b6009546000906001600160a01b0316610d19611536565b6001600160a01b031614610d6a576040805162461bcd60e51b81526020600482015260136024820152724e6f74206d6f6e657461727920706f6c69637960681b604482015290519081900360640190fd5b600b5460ff161515600114610dc6576040805162461bcd60e51b815260206004820152601c60248201527f4e6f74207965742061626c6520746f2072656261736520746f6b656e00000000604482015290519081900360640190fd5b600a54610dda90600163ffffffff61189216565b600a819055600090610df390600163ffffffff611bea16565b905083610e6d57600a54600080546040805193845260208401899052838101929092526060830152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000908152600d60205260408120858155600181018290554260029091015554905061087e565b82610eb457610eac670de0b6b3a7640000610ea0610e91828863ffffffff611bea16565b6004549063ffffffff611c5116565b9063ffffffff611caa16565b600455610efe565b6000610ed5670de0b6b3a7640000610ea0610e91828963ffffffff61189216565b9050610edf611626565b811015610ef0576004819055610efc565b610ef8611626565b6004555b505b60008054600754909190610f1190611c2c565b6000819055821015610f3a57600054610f30908363ffffffff611bea16565b9150819050610f61565b600054821115610f6157600054610f5890839063ffffffff611bea16565b91508160000390505b600a5460005460408051928352602083018a90528281018490526060830191909152517f50740223231e0ae1928fa374dc4ce56223846191faeb0ea9fb0c66d2f035db119181900360800190a16000928352600d602052604083209687556001870155504260029095019490945550509054919050565b6009546001600160a01b031681565b610fef611536565b6008546001600160a01b0390811691161461103f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600280600f54146110815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156110ea5762015180600e54014210156110ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b506010546001600160a01b03166000908152600c60205260409020805460ff19166001179055565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156107b35780601f10610788576101008083540402835291602001916107b3565b60075481565b61117e611536565b6008546001600160a01b039081169116146111ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b42600e556002600f55601080546001600160a01b0319166001600160a01b0392909216919091179055565b600a5490565b60006107d261120c611536565b84610875856040518060600160405280602581526020016120616025913960066000611236611536565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6117d716565b60006107d261127a611536565b848461163b565b6001600160a01b03166000908152600c602052604090205460ff1690565b600b5460ff1690565b60006107d682611c2c565b600b5460ff1681565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6112ef611536565b6008546001600160a01b0390811691161461133f576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600480600f54146113815760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156113ea5762015180600e54014210156113ea576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b50601054600980546001600160a01b0319166001600160a01b03909216919091179055565b611417611536565b6008546001600160a01b03908116911614611467576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b600180600f54146114a95760405162461bcd60e51b8152600401808060200182810382526027815260200180611f676027913960400191505060405180910390fd5b6000600f55600b5460ff161515600114156115125762015180600e5401421015611512576040805162461bcd60e51b8152602060048201526015602482015274151a5b595b1bd8dac81d1a5b59481b9bdd081b595d605a1b604482015290519081900360640190fd5b601054611527906001600160a01b0316611cec565b50565b670de0b6b3a764000081565b3390565b6001600160a01b03831661157f5760405162461bcd60e51b815260040180806020018281038252602481526020018061203d6024913960400191505060405180910390fd5b6001600160a01b0382166115c45760405162461bcd60e51b8152600401808060200182810382526022815260200180611f1f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006007546000198161163557fe5b04905090565b816001600160a01b0381161580159061165d57506001600160a01b0381163014155b6116a6576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b6001600160a01b0384166116eb5760405162461bcd60e51b81526004018080602001828103825260258152602001806120186025913960400191505060405180910390fd5b6116f3611de5565b5060006116ff8361186e565b905061174481604051806060016040528060268152602001611f41602691396001600160a01b038816600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b038087166000908152600560205260408082209390935590861681522054611779908263ffffffff61189216565b6001600160a01b0380861660008181526005602090815260409182902094909455805187815290519193928916927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050565b600081848411156118665760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561182b578181015183820152602001611813565b50505050905090810190601f1680156118585780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6004546000906107d690610ea08469d3c21bcecceda100000063ffffffff611c5116565b60008282018381101561087e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b0381161580159061190e57506001600160a01b0381163014155b611957576040805162461bcd60e51b8152602060048201526015602482015274139bdd0818481d985b1a59081c9958da5c1a595b9d605a1b604482015290519081900360640190fd5b60005461196a908363ffffffff61189216565b60009081556119788361186e565b60075490915061198e908263ffffffff61189216565b600755611999611626565b60045411156119ef576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b6001600160a01b038416600090815260056020526040902054611a18908263ffffffff61189216565b6001600160a01b03851660008181526005602090815260408083209490945583518781529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350505050565b6001600160a01b038216611ab75760405162461bcd60e51b8152600401808060200182810382526021815260200180611ff76021913960400191505060405180910390fd5b600054611aca908263ffffffff611bea16565b6000908155611ad88261186e565b600754909150611aee908263ffffffff611bea16565b600755611af9611626565b6004541115611b4f576040805162461bcd60e51b815260206004820152601a60248201527f6d6178207363616c696e6720666163746f7220746f6f206c6f77000000000000604482015290519081900360640190fd5b611b9281604051806060016040528060228152602001611ed7602291396001600160a01b038616600090815260056020526040902054919063ffffffff6117d716565b6001600160a01b0384166000818152600560209081526040808320949094558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3505050565b600061087e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506117d7565b60006107d669d3c21bcecceda1000000610ea060045485611c5190919063ffffffff16565b600082611c60575060006107d6565b82820282848281611c6d57fe5b041461087e5760405162461bcd60e51b8152600401808060200182810382526021815260200180611f8e6021913960400191505060405180910390fd5b600061087e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e6c565b611cf4611536565b6008546001600160a01b03908116911614611d44576040805162461bcd60e51b81526020600482018190526024820152600080516020611fd7833981519152604482015290519081900360640190fd5b6001600160a01b038116611d895760405162461bcd60e51b8152600401808060200182810382526026815260200180611ef96026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907f5f56bee8cffbe9a78652a74a60705edede02af10b0bbb888ca44b79a0d42ce8090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000611def611ed1565b506009546001600160a01b0316156107bb57600960009054906101000a90046001600160a01b03166001600160a01b031663b9abdfef6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e5157600080fd5b505af1158015611e65573d6000803e3d6000fd5b5050505090565b60008183611ebb5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561182b578181015183820152602001611813565b506000838581611ec757fe5b0495945050505050565b60009056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554696d656c6f636b206e6f7420616371756972656420666f7220746869732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c1145564736f6c63430006060033

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

00000000000000000000000000000000000000000000000392c2d8d1b3669d23

-----Decoded View---------------
Arg [0] : _initialSupply (uint256): 65915485491317611811

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000392c2d8d1b3669d23


Deployed Bytecode Sourcemap

34838:7432:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34838:7432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;39568:159:0;;;:::i;:::-;;12763:83;;;:::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;12763:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14872:169;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14872:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;10823:33;;;:::i;:::-;;;;;;;;;;;;;;;;12214:137;;;:::i;13823:100::-;;;:::i;15510:327::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15510:327:0;;;;;;;;;;;;;;;;;:::i;13680:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41896:190;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41896:190:0;-1:-1:-1;;;;;41896:190:0;;:::i;22024:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22024:149:0;;:::i;16241:224::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;16241:224:0;;;;;;;;:::i;36959:150::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;36959:150:0;;;;;;;;:::i;37177:122::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37177:122:0;;:::i;41651:140::-;;;:::i;41457:182::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41457:182:0;-1:-1:-1;;;;;41457:182:0;;:::i;40603:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40603:186:0;-1:-1:-1;;;;;40603:186:0;;:::i;33842:84::-;;;:::i;:::-;;;;-1:-1:-1;;;;;33842:84:0;;;;;;;;;;;;;;36100:411;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36100:411:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;10581:47;;;:::i;13981:142::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13981:142:0;-1:-1:-1;;;;;13981:142:0;;:::i;37413:2118::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37413:2118:0;;;;;;;;;;;;;;:::i;34989:29::-;;;:::i;41227:136::-;;;:::i;12960:87::-;;;:::i;11015:25::-;;;:::i;41036:179::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41036:179:0;-1:-1:-1;;;;;41036:179:0;;:::i;35995:93::-;;;:::i;16963:275::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;16963:275:0;;;;;;;;:::i;14340:175::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14340:175:0;;;;;;;;:::i;35875:108::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;35875:108:0;-1:-1:-1;;;;;35875:108:0;;:::i;36523:89::-;;;:::i;21867:149::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21867:149:0;;:::i;35060:22::-;;;:::i;14573:157::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14573:157:0;;;;;;;;;;:::i;42098:140::-;;;:::i;40801:::-;;;:::i;10697:35::-;;;:::i;39568:159::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;39649:10:::1;::::0;::::1;;:19;39641:50;;;::::0;;-1:-1:-1;;;39641:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39641:50:0;;;;;;;;;;;;;::::1;;39702:10;:17:::0;;-1:-1:-1;;39702:17:0::1;39715:4;39702:17;::::0;;39568:159::o;12763:83::-;12833:5;12826:12;;;;;;;;-1:-1:-1;;12826:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12800:13;;12826:12;;12833:5;;12826:12;;12833:5;12826:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12763:83;;:::o;14872:169::-;14955:4;14972:39;14981:12;:10;:12::i;:::-;14995:7;15004:6;14972:8;:39::i;:::-;-1:-1:-1;15029:4:0;14872:169;;;;;:::o;10823:33::-;;;;:::o;12214:137::-;12292:7;12324:19;:17;:19::i;:::-;12317:26;;12214:137;:::o;13823:100::-;13876:7;13903:12;13823:100;:::o;15510:327::-;15616:4;15633:36;15643:6;15651:9;15662:6;15633:9;:36::i;:::-;15680:127;15689:6;15697:12;:10;:12::i;:::-;15711:95;15755:6;15711:95;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15711:25:0;;;;;;:17;:25;;;;;;15737:12;:10;:12::i;:::-;-1:-1:-1;;;;;15711:39:0;;;;;;;;;;;;-1:-1:-1;15711:39:0;;;:95;;:43;:95;:::i;:::-;15680:8;:127::i;:::-;-1:-1:-1;15825:4:0;15510:327;;;;;;:::o;13680:83::-;13746:9;;;;13680:83;:::o;41896:190::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;42001:3:::1;41984:14;:20:::0;42031:1:::1;42015:13;:17:::0;42043::::1;:28:::0;;-1:-1:-1;;;;;;42043:28:0::1;-1:-1:-1::0;;;;;42043:28:0;;;::::1;::::0;;;::::1;::::0;;41896:190::o;22024:149::-;22112:7;22144:21;22161:3;22144:16;:21::i;16241:224::-;16329:4;16346:89;16355:12;:10;:12::i;:::-;16369:7;16378:56;16423:10;16378:17;:31;16396:12;:10;:12::i;:::-;-1:-1:-1;;;;;16378:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;16378:31:0;;;:40;;;;;;;;;;;:56;:44;:56;:::i;36959:150::-;37038:4;35577:22;35586:12;:10;:12::i;:::-;35577:8;:22::i;:::-;:30;;35603:4;35577:30;35569:55;;;;;-1:-1:-1;;;35569:55:0;;;;;;;;;;;;-1:-1:-1;;;35569:55:0;;;;;;;;;;;;;;;37055:24:::1;37061:9;37072:6;37055:5;:24::i;37177:122::-:0;37225:4;37242:27;37248:12;:10;:12::i;:::-;37262:6;37242:5;:27::i;:::-;-1:-1:-1;37287:4:0;37177:122;;;:::o;41651:140::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41727:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;41757:17:0::2;::::0;-1:-1:-1;;;;;41757:17:0::2;41778:5;41741:34:::0;;;:15:::2;:34;::::0;;;;:42;;-1:-1:-1;;41741:42:0::2;::::0;;41651:140::o;41457:182::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41554:3:::1;41537:14;:20:::0;41584:1:::1;41568:13;:17:::0;41596::::1;:28:::0;;-1:-1:-1;;;;;;41596:28:0::1;-1:-1:-1::0;;;;;41596:28:0;;;::::1;::::0;;;::::1;::::0;;41457:182::o;40603:186::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;40704:3:::1;40687:14;:20:::0;40734:1:::1;40718:13;:17:::0;40746::::1;:28:::0;;-1:-1:-1;;;;;;40746:28:0::1;-1:-1:-1::0;;;;;40746:28:0;;;::::1;::::0;;;::::1;::::0;;40603:186::o;33842:84::-;33912:6;;-1:-1:-1;;;;;33912:6:0;33842:84;:::o;36100:411::-;36162:7;;;36202:9;36199:35;;-1:-1:-1;36223:1:0;;-1:-1:-1;36223:1:0;;-1:-1:-1;36223:1:0;36215:16;;36199:35;36309:11;:4;36318:1;36309:11;:8;:11;:::i;:::-;36302:18;;36346:12;;36339:4;:19;36331:55;;;;;-1:-1:-1;;;36331:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36405:19:0;;;;:13;:19;;;;;:25;;36432:38;;;;36472:30;;;;;36405:25;;36432:38;36100:411;;;;;;:::o;10581:47::-;10624:4;10581:47;:::o;13981:142::-;-1:-1:-1;;;;;14091:23:0;;14047:7;14091:23;;;:14;:23;;;;;;14074:41;;:16;:41::i;37413:2118::-;35465:14;;37577:7;;-1:-1:-1;;;;;35465:14:0;35449:12;:10;:12::i;:::-;-1:-1:-1;;;;;35449:30:0;;35441:62;;;;;-1:-1:-1;;;35441:62:0;;;;;;;;;;;;-1:-1:-1;;;35441:62:0;;;;;;;;;;;;;;;37610:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;37602:59;;;::::0;;-1:-1:-1;;;37602:59:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37687:12;::::0;:19:::1;::::0;37704:1:::1;37687:19;:16;:19;:::i;:::-;37672:12;:34:::0;;;37717:17:::1;::::0;37737:19:::1;::::0;37754:1:::1;37737:19;:16;:19;:::i;:::-;37717:39:::0;-1:-1:-1;37803:15:0;37799:292:::1;;37845:12;::::0;37866:1:::1;37869:12:::0;;37838:44:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;37895:24;::::0;;;:13:::1;:24;::::0;;;;:38;;;37946:43:::1;::::0;::::1;:47:::0;;;38044:3:::1;38006:35;::::0;;::::1;:41:::0;38067:12;;-1:-1:-1;38060:19:0::1;;37799:292;38108:8;38103:556;;38211:54;10728:4;38211:44;38234:20;10728:4:::0;38243:10;38234:20:::1;:8;:20;:::i;:::-;38211:18;::::0;;:44:::1;:22;:44;:::i;:::-;:48:::0;:54:::1;:48;:54;:::i;:::-;38190:18;:75:::0;38103:556:::1;;;38355:24;38382:54;10728:4;38382:44;38405:20;10728:4:::0;38414:10;38405:20:::1;:8;:20;:::i;38382:54::-;38355:81;;38474:19;:17;:19::i;:::-;38455:16;:38;38451:197;;;38514:18;:37:::0;;;38451:197:::1;;;38613:19;:17;:19::i;:::-;38592:18;:40:::0;38451:197:::1;38103:556;;38714:17;38734:12:::0;;38823:10:::1;::::0;38734:12;;38714:17;38806:28:::1;::::0;:16:::1;:28::i;:::-;38791:12;:43:::0;;;38901:24;::::1;38898:353;;;38985:12;::::0;:27:::1;::::0;39002:9;38985:27:::1;:16;:27;:::i;:::-;38973:39;;39049:9;39027:32;;38898:353;;;39091:12;;39079:9;:24;39076:175;;;39175:12;::::0;39161:27:::1;::::0;:9;;:27:::1;:13;:27;:::i;:::-;39149:39;;39229:9;39218:1;:21;39203:36;;39076:175;39275:12;::::0;39310::::1;::::0;39268:55:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;39334:24;::::0;;;:13:::1;:24;::::0;;;;:38;;;39383:43:::1;::::0;::::1;:58:::0;-1:-1:-1;39490:3:0::1;39452:35;::::0;;::::1;:41:::0;;;;-1:-1:-1;;39511:12:0;;;37413:2118;-1:-1:-1;37413:2118:0:o;34989:29::-;;;-1:-1:-1;;;;;34989:29:0;;:::o;41227:136::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41300:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;41330:17:0::2;::::0;-1:-1:-1;;;;;41330:17:0::2;41314:34;::::0;;;:15:::2;:34;::::0;;;;:41;;-1:-1:-1;;41314:41:0::2;41351:4;41314:41;::::0;;41227:136::o;12960:87::-;13032:7;13025:14;;;;;;;-1:-1:-1;;13025:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12999:13;;13025:14;;13032:7;;13025:14;;13032:7;13025:14;;;;;;;;;;;;;;;;;;;;;;;;11015:25;;;;:::o;41036:179::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;41130:3:::1;41113:14;:20:::0;41160:1:::1;41144:13;:17:::0;41172::::1;:28:::0;;-1:-1:-1;;;;;;41172:28:0::1;-1:-1:-1::0;;;;;41172:28:0;;;::::1;::::0;;;::::1;::::0;;41036:179::o;35995:93::-;36068:12;;35995:93;:::o;16963:275::-;17056:4;17073:135;17082:12;:10;:12::i;:::-;17096:7;17105:102;17150:15;17105:102;;;;;;;;;;;;;;;;;:17;:31;17123:12;:10;:12::i;:::-;-1:-1:-1;;;;;17105:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;17105:31:0;;;:40;;;;;;;;;;;:102;;:44;:102;:::i;14340:175::-;14426:4;14443:42;14453:12;:10;:12::i;:::-;14467:9;14478:6;14443:9;:42::i;35875:108::-;-1:-1:-1;;;;;35953:22:0;35929:4;35953:22;;;:15;:22;;;;;;;;;35875:108::o;36523:89::-;36594:10;;;;36523:89;:::o;21867:149::-;21955:7;21987:21;22004:3;21987:16;:21::i;35060:22::-;;;;;;:::o;14573:157::-;-1:-1:-1;;;;;14689:24:0;;;14662:7;14689:24;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;14573:157::o;42098:140::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;42182:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;42213:17:0::2;::::0;42196:14:::2;:34:::0;;-1:-1:-1;;;;;;42196:34:0::2;-1:-1:-1::0;;;;;42213:17:0;;::::2;42196:34:::0;;;::::2;::::0;;42098:140::o;40801:::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;40881:1:::1;40257:5;40240:13;;:22;40232:74;;;;-1:-1:-1::0;;;40232:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40333:1;40317:13;:17:::0;40392:10:::1;::::0;::::1;;:18;;:10:::0;:18:::1;40389:124;;;40051:5;40441:14;;:34;40434:3;:41;;40426:75;;;::::0;;-1:-1:-1;;;40426:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40426:75:0;;;;;;;;;;;;;::::1;;40915:17:::2;::::0;40895:38:::2;::::0;-1:-1:-1;;;;;40915:17:0::2;40895:19;:38::i;:::-;34129:1:::1;40801:140::o:0;10697:35::-;10728:4;10697:35;:::o;650:106::-;738:10;650:106;:::o;21060:352::-;-1:-1:-1;;;;;21162:19:0;;21154:68;;;;-1:-1:-1;;;21154:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21241:21:0;;21233:68;;;;-1:-1:-1;;;21233:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21314:24:0;;;;;;;:17;:24;;;;;;;;:33;;;;;;;;;;;;;:42;;;21372:32;;;;;;;;;;;;;;;;;21060:352;;;:::o;12359:339::-;12438:7;12680:10;;-1:-1:-1;;12666:24:0;;;;;;12659:31;;12359:339;:::o;17723:910::-;17825:9;-1:-1:-1;;;;;12045:16:0;;;;;;:39;;-1:-1:-1;;;;;;12065:19:0;;12079:4;12065:19;;12045:39;12037:73;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17855:20:0;::::1;17847:70;;;;-1:-1:-1::0;;;17847:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17938:15;:13;:15::i;:::-;;18251:18;18272:24;18289:6;18272:16;:24::i;:::-;18251:45;;18373:80;18400:10;18373:80;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;18373:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;;;:80;::::1;:26;:80;:::i;:::-;-1:-1:-1::0;;;;;18348:22:0;;::::1;;::::0;;;:14:::1;:22;::::0;;;;;:105;;;;18533:25;;::::1;::::0;;;;:41:::1;::::0;18563:10;18533:41:::1;:29;:41;:::i;:::-;-1:-1:-1::0;;;;;18505:25:0;;::::1;;::::0;;;:14:::1;:25;::::0;;;;;;;;:69;;;;18590:35;;;;;;;18505:25;;18590:35;;::::1;::::0;::::1;::::0;;;;;;;::::1;12121:1;17723:910:::0;;;;:::o;5562:192::-;5648:7;5684:12;5676:6;;;;5668:29;;;;-1:-1:-1;;;5668:29: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;5668:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5720:5:0;;;5562:192::o;22367:178::-;22518:18;;22456:7;;22488:49;;:25;:3;10624:4;22488:25;:7;:25;:::i;4669:181::-;4727:7;4759:5;;;4783:6;;;;4775:46;;;;;-1:-1:-1;;;4775:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;18909:647;18984:2;-1:-1:-1;;;;;12045:16:0;;;;;;:39;;-1:-1:-1;;;;;;12065:19:0;;12079:4;12065:19;;12045:39;12037:73;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;-1:-1:-1;;;12037:73:0;;;;;;;;;;;;;;;19047:12:::1;::::0;:24:::1;::::0;19064:6;19047:24:::1;:16;:24;:::i;:::-;19032:12;:39:::0;;;19138:24:::1;19155:6:::0;19138:16:::1;:24::i;:::-;19220:10;::::0;19117:45;;-1:-1:-1;19220:26:0::1;::::0;19117:45;19220:26:::1;:14;:26;:::i;:::-;19207:10;:39:::0;19356:19:::1;:17;:19::i;:::-;19334:18;;:41;;19326:80;;;::::0;;-1:-1:-1;;;19326:80:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;19464:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;:34:::1;::::0;19487:10;19464:34:::1;:22;:34;:::i;:::-;-1:-1:-1::0;;;;;19443:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;;;;:55;;;;19516:32;;;;;;;19443:18;;;;19516:32:::1;::::0;;;;;;;;::::1;12121:1;18909:647:::0;;;:::o;19887:738::-;-1:-1:-1;;;;;19971:21:0;;19963:67;;;;-1:-1:-1;;;19963:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20091:12;;:24;;20108:6;20091:24;:16;:24;:::i;:::-;20076:12;:39;;;20182:24;20199:6;20182:16;:24::i;:::-;20264:10;;20161:45;;-1:-1:-1;20264:26:0;;20161:45;20264:26;:14;:26;:::i;:::-;20251:10;:39;20372:19;:17;:19::i;:::-;20350:18;;:41;;20342:80;;;;;-1:-1:-1;;;20342:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20485:77;20513:10;20485:77;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20485:23:0;;;;;;:14;:23;;;;;;;:77;;:27;:77;:::i;:::-;-1:-1:-1;;;;;20459:23:0;;;;;;:14;:23;;;;;;;;:103;;;;20580:37;;;;;;;20459:23;;20580:37;;;;;;;;;;;19887:738;;;:::o;5128:136::-;5186:7;5213:43;5217:1;5220;5213:43;;;;;;;;;;;;;;;;;:3;:43::i;22181:178::-;22270:7;22302:49;10624:4;22302:27;22310:18;;22302:3;:7;;:27;;;;:::i;6008:471::-;6066:7;6311:6;6307:47;;-1:-1:-1;6341:1:0;6334:8;;6307:47;6378:5;;;6382:1;6378;:5;:1;6402:5;;;;;:10;6394:56;;;;-1:-1:-1;;;6394:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6950:132;7008:7;7035:39;7039:1;7042;7035:39;;;;;;;;;;;;;;;;;:3;:39::i;34288:254::-;34069:12;:10;:12::i;:::-;34059:6;;-1:-1:-1;;;;;34059:6:0;;;:22;;;34051:67;;;;;-1:-1:-1;;;34051:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34051:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34386:22:0;::::1;34378:73;;;;-1:-1:-1::0;;;34378:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34489:6;::::0;34467:39:::1;::::0;-1:-1:-1;;;;;34467:39:0;;::::1;::::0;34489:6:::1;::::0;34467:39:::1;::::0;34489:6:::1;::::0;34467:39:::1;34517:6;:17:::0;;-1:-1:-1;;;;;;34517:17:0::1;-1:-1:-1::0;;;;;34517:17:0;;;::::1;::::0;;;::::1;::::0;;34288:254::o;36690:257::-;36750:4;36767:21;:19;:21::i;:::-;-1:-1:-1;36822:14:0;;-1:-1:-1;;;;;36822:14:0;:28;36819:121;;36890:14;;;;;;;;;-1:-1:-1;;;;;36890:14:0;-1:-1:-1;;;;;36866:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36866:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36866:62:0;;;;36690:257;:::o;7573:278::-;7659:7;7694:12;7687:5;7679:28;;;;-1:-1:-1;;;7679:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;7679:28:0;;7718:9;7734:1;7730;:5;;;;;;;7573:278;-1:-1:-1;;;;;7573:278:0:o;22738:59::-;22789:4;22738:59;:::o

Swarm Source

ipfs://e8c746626cae2f6be5923dcb2e8f38254b677ae5fafcbd300954b42fb6c11455
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.