ETH Price: $3,317.15 (+1.32%)
 

Overview

Max Total Supply

671,400 8DAO

Holders

13

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
onenightintokyo.eth
Balance
25,200 8DAO

Value
$0.00
0x011aaf6b967623cfc55b8ff7fa178faa0b9c0703
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:
EightDAOToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-11
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev 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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @dev 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 Contracts guidelines: functions revert
 * instead 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 ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev 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 this function is
     * overridden;
     *
     * 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 virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev 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) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev 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) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This 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");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/access/Ownable.sol

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev 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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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 a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/TestToken.sol

pragma solidity ^0.8.0;


pragma solidity ^0.8.0;

contract EightDAOToken is ERC20, Ownable {
    using SafeMath for uint256;

    uint256 public startReleaseTime = 1678204800;
    struct Workflow {
        uint256[] releaseTimes;
        uint256 index;
        uint256 unlockPoint;
    }
    uint256 workflowNonce = 0;
    bool public lockEnable = true;
    mapping(uint256 => Workflow) private workflows;
    struct Task {
        uint256 releaseTime;
    }
    uint256 public maxSupply = 10000000 * 1e18;
    mapping(address => uint256[]) private walletWorkflows;
    mapping(address => uint256) public lockedAmount;

    event CreateTasks(
        uint256 workeflowId,
        uint256 releaseTime,
        uint256 unlockPoint
    );
    event JoinWorkflow(address wallet, uint256 workeflowId, uint256 index);
    event LeaveWorkflow(address wallet, uint256 workeflowId, uint256 index);

    constructor() ERC20("8DAO TOKEN", "8DAO") {}

    function transfer(address to, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        address owner = _msgSender();
        if (lockedAmount[owner] > 0) {
            checkTaskAndAdvanceTask(owner);
            require(
                canTransferAmount(owner) >= amount,
                "Transfer amount exceed the locked amount"
            );
        }
        _transfer(owner, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        if (lockedAmount[from] > 0) {
            checkTaskAndAdvanceTask(from);

            require(
                canTransferAmount(from) >= amount,
                "Transfer amount exceed the locked amount"
            );
        }
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function walletInfo(address wallet)
        public
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256[] memory
        )
    {
        return (
            balanceOf(wallet),
            canTransferAmount(wallet),
            releasedAmount(wallet),
            lockedAmount[wallet],
            _joinedWorkflows(wallet)
        );
    }

    function canTransferAmount(address wallet) public view returns (uint256) {
        uint256 balance = balanceOf(wallet);
        if (lockEnable && lockedAmount[wallet] > 0) {
            uint256 unlockedAmount = releasedAmount(wallet);
            if (lockedAmount[wallet] >= unlockedAmount) {
                uint256 remainLockedAmount = lockedAmount[wallet].sub(
                    unlockedAmount
                );
                return
                    remainLockedAmount >= balance
                        ? 0
                        : balance.sub(remainLockedAmount);
            }
        }
        return balanceOf(wallet);
    }

    function _now() public view returns (uint256) {
        return block.timestamp;
    }

    function getWorkflow(uint256 workflowId)
        external
        view
        returns (
            uint256[] memory,
            uint256,
            uint256
        )
    {
        return (
            workflows[workflowId].releaseTimes,
            workflows[workflowId].index,
            workflows[workflowId].unlockPoint
        );
    }

    function releasedAmount(address wallet) public view returns (uint256) {
        if (!lockEnable) {
            return lockedAmount[wallet];
        }
        if (startReleaseTime > block.timestamp) {
            return 0;
        }
        if (walletWorkflows[wallet].length < 1) {
            return 0;
        }
        uint256 unlocked = 0;
        for (uint256 i = 0; i < walletWorkflows[wallet].length; i++) {
            uint256 workeflowId = walletWorkflows[wallet][i];
            uint256 currentIndex = workflows[workeflowId].index;

            for (
                uint256 index = workflows[workeflowId].index;
                index < workflows[workeflowId].releaseTimes.length;
                index++
            ) {
                if (
                    index == workflows[workeflowId].releaseTimes.length - 1 ||
                    workflows[workeflowId].releaseTimes[index] > block.timestamp
                ) {
                    currentIndex = (index > 0) ? index - 1 : 0;
                    break;
                }
            }
            unlocked = unlocked.add(
                lockedAmount[wallet]
                    .mul(
                        (currentIndex + 1).mul(
                            workflows[workeflowId].unlockPoint
                        )
                    )
                    .div(100000)
            );
        }
        return unlocked;
    }

    function _joinedWorkflows(address wallet)
        public
        view
        returns (uint256[] memory)
    {
        return walletWorkflows[wallet];
    }

    function _setStartRelaseTime(uint256 _startTime) public onlyOwner {
        startReleaseTime = _startTime;
    }

    function _setWorkflowRole1(
        address[] memory wallets,
        uint256[] memory lockAmounts,
        uint256[] memory workeflowIds
    ) public onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            address wallet = wallets[i];
            if (lockedAmount[wallet] != lockAmounts[i]) {
                lockedAmount[wallet] = lockAmounts[i];
            }
            if (walletWorkflows[wallet].length > 0) {
                delete walletWorkflows[wallet];
            }
            for (uint256 j = 0; j < workeflowIds.length; j++) {
                require(
                    workflows[workeflowIds[j]].releaseTimes.length > 0,
                    "workflow not exist"
                );

                walletWorkflows[wallet].push(workeflowIds[j]);
            }
        }
    }

    function _mintWithSetRole(
        address[] memory wallets,
        uint256[] memory lockAmounts,
        uint256[] memory workeflowIds
    ) public onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            address wallet = wallets[i];
            if (lockedAmount[wallet] != lockAmounts[i]) {
                lockedAmount[wallet] = lockAmounts[i];
            }
            if (walletWorkflows[wallet].length > 0) {
                delete walletWorkflows[wallet];
            }
            for (uint256 j = 0; j < workeflowIds.length; j++) {
                require(
                    workflows[workeflowIds[j]].releaseTimes.length > 0,
                    "workflow not exist"
                );

                walletWorkflows[wallet].push(workeflowIds[j]);
            }
            mint(wallet, lockAmounts[i]);
        }
    }

    function _setWorkflowRole2(
        address[] memory wallets,
        uint256 lockAmount,
        uint256[] memory workeflowIds
    ) public onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++) {
            address wallet = wallets[i];
            if (lockedAmount[wallet] != lockAmount) {
                lockedAmount[wallet] = lockAmount;
            }
            if (walletWorkflows[wallet].length > 0) {
                delete walletWorkflows[wallet];
            }
            for (uint256 j = 0; j < workeflowIds.length; j++) {
                require(
                    workflows[workeflowIds[j]].releaseTimes.length > 0,
                    "workflow not exist"
                );

                walletWorkflows[wallet].push(workeflowIds[j]);
            }
        }
    }

    function _setLock(bool _lock) public onlyOwner {
        lockEnable = _lock;
    }

    function _unlock(address wallet) public onlyOwner {
        lockedAmount[wallet] = 0;
    }

    function _createWorkflow(
        uint256[] memory _releaseTimes,
        uint256 _unlockPoint
    ) public onlyOwner {
        workflows[workflowNonce].unlockPoint = _unlockPoint;
        for (uint256 i = 0; i < _releaseTimes.length; i++) {
            if (i > 0) {
                require(_releaseTimes[i] > _releaseTimes[i - 1]);
            }
            workflows[workflowNonce].releaseTimes.push(_releaseTimes[i]);
            emit CreateTasks(workflowNonce, _releaseTimes[i], _unlockPoint);
        }
        workflowNonce++;
    }

    function _deleteWorkflow(uint256 workflowId) public onlyOwner {
        delete workflows[workflowId];
    }

    function mint(address _to, uint256 _amount)
        public
        onlyOwner
        returns (bool)
    {
        require(totalSupply() + _amount <= maxSupply);
        _mint(_to, _amount);
        return true;
    }

    function checkTaskAndAdvanceTask(address wallet) public {
        if (!lockEnable) {
            return;
        }
        if (startReleaseTime > block.timestamp) {
            return;
        }
        if (walletWorkflows[wallet].length <= 0) {
            return;
        }

        for (uint256 i = 0; i < walletWorkflows[wallet].length; i++) {
            uint256 workeflowId = walletWorkflows[wallet][i];
            uint256 currentWorkflowIndex = workflows[workeflowId].index;

            for (
                uint256 index = workflows[workeflowId].index;
                index < workflows[workeflowId].releaseTimes.length;
                index++
            ) {
                if (
                    index == workflows[workeflowId].releaseTimes.length - 1 ||
                    workflows[workeflowId].releaseTimes[index] > block.timestamp
                ) {
                    currentWorkflowIndex = (index > 0) ? index - 1 : 0;
                    break;
                }
            }
            if (currentWorkflowIndex > workflows[workeflowId].index) {
                workflows[workeflowId].index = currentWorkflowIndex;
            }
        }
        return;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockPoint","type":"uint256"}],"name":"CreateTasks","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"JoinWorkflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"workeflowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"LeaveWorkflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"_releaseTimes","type":"uint256[]"},{"internalType":"uint256","name":"_unlockPoint","type":"uint256"}],"name":"_createWorkflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"workflowId","type":"uint256"}],"name":"_deleteWorkflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"_joinedWorkflows","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"lockAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_mintWithSetRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_now","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_lock","type":"bool"}],"name":"_setLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"}],"name":"_setStartRelaseTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"lockAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_setWorkflowRole1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"lockAmount","type":"uint256"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_setWorkflowRole2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"_unlock","outputs":[],"stateMutability":"nonpayable","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":"address","name":"wallet","type":"address"}],"name":"canTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkTaskAndAdvanceTask","outputs":[],"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":[{"internalType":"uint256","name":"workflowId","type":"uint256"}],"name":"getWorkflow","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"lockEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"releasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]

60806040526364075f8060065560006007556008805460ff191660011790556a084595161401484a000000600a553480156200003a57600080fd5b50604080518082018252600a8152691c2220a7902a27a5a2a760b11b6020808301918252835180850190945260048452633844414f60e01b908401528151919291620000899160039162000118565b5080516200009f90600490602084019062000118565b505050620000bc620000b6620000c260201b60201c565b620000c6565b620001fb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012690620001be565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b600181811c90821680620001d357607f821691505b60208210811415620001f557634e487b7160e01b600052602260045260246000fd5b50919050565b61218d806200020b6000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610449578063e38b0dfe14610482578063eec7b03c146104a2578063f2fde38b146104c4578063f84c91ab146104d757600080fd5b8063afca5a1214610414578063b3bb8cd414610427578063d2ef4d481461042d578063d5abeb011461044057600080fd5b8063a3b77fbc116100e9578063a3b77fbc146103ce578063a457c2d7146103e1578063a9059cbb146103f4578063a92176be1461040757600080fd5b806395d89b411461038057806396d35a161461038857806398a2ba0a1461039b578063a153e708146103ae57600080fd5b8063395093511161019d5780635dae0b0a1161016c5780635dae0b0a146103185780636fcf06f11461032b57806370a0823114610334578063715018a61461035d5780638da5cb5b1461036557600080fd5b806339509351146102bb57806340c10f19146102ce578063500e68e9146102e157806352e53ce71461030557600080fd5b80631ade6619116101d95780631ade6619146102715780631cf1bb721461028657806323b872dd14610299578063313ce567146102ac57600080fd5b8063025f3d951461020b57806306fdde0314610231578063095ea7b31461024657806318160ddd14610269575b600080fd5b61021e610219366004611c41565b6104ea565b6040519081526020015b60405180910390f35b6102396105c9565b6040516102289190611ec6565b610259610254366004611ccb565b61065b565b6040519015158152602001610228565b60025461021e565b61028461027f366004611c41565b610673565b005b61021e610294366004611c41565b610807565b6102596102a7366004611c8f565b610a01565b60405160128152602001610228565b6102596102c9366004611ccb565b610a7c565b6102596102dc366004611ccb565b610abb565b6102f46102ef366004611c41565b610b1d565b604051610228959493929190611fc4565b610284610313366004611cf5565b610b8a565b610284610326366004611cf5565b610d95565b61021e60065481565b61021e610342366004611c41565b6001600160a01b031660009081526020819052604090205490565b610284610f76565b6005546040516001600160a01b039091168152602001610228565b610239610fac565b610284610396366004611e3a565b610fbb565b6102846103a9366004611e18565b610fea565b61021e6103bc366004611c41565b600c6020526000908152604090205481565b6102846103dc366004611e3a565b611027565b6102596103ef366004611ccb565b61107d565b610259610402366004611ccb565b61110f565b6008546102599060ff1681565b610284610422366004611dd3565b611163565b4261021e565b61028461043b366004611c41565b6112cd565b61021e600a5481565b61021e610457366004611c5c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610495610490366004611c41565b611311565b6040516102289190611e8e565b6104b56104b0366004611e3a565b61137d565b60405161022893929190611ea1565b6102846104d2366004611c41565b6113f5565b6102846104e5366004611d7d565b611490565b6001600160a01b03811660009081526020819052604081205460085460ff16801561052c57506001600160a01b0383166000908152600c602052604090205415155b156105a857600061053c84610807565b6001600160a01b0385166000908152600c602052604090205490915081116105a6576001600160a01b0384166000908152600c6020526040812054610581908361163b565b90508281101561059a57610595838261163b565b61059d565b60005b95945050505050565b505b6001600160a01b0383166000908152602081905260409020545b9392505050565b6060600380546105d8906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906120bf565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600033610669818585611647565b5060019392505050565b60085460ff166106805750565b42600654111561068d5750565b6001600160a01b0381166000908152600b60205260409020546106ad5750565b60005b6001600160a01b0382166000908152600b6020526040902054811015610803576001600160a01b0382166000908152600b602052604081208054839081106106fa576106fa61212b565b60009182526020808320909101548083526009909152604090912060010154909150805b6000838152600960205260409020548110156107bf5760008381526009602052604090205461074f906001906120a8565b8114806107875750600083815260096020526040902080544291908390811061077a5761077a61212b565b9060005260206000200154115b156107ad576000811161079b5760006107a6565b6107a66001826120a8565b91506107bf565b806107b7816120fa565b91505061071e565b506000828152600960205260409020600101548111156107ee5760008281526009602052604090206001018190555b505080806107fb906120fa565b9150506106b0565b5050565b60085460009060ff1661083057506001600160a01b03166000908152600c602052604090205490565b42600654111561084257506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561086b57506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156109fa576001600160a01b0384166000908152600b602052604081208054839081106108b9576108b961212b565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561097e5760008381526009602052604090205461090e906001906120a8565b811480610946575060008381526009602052604090208054429190839081106109395761093961212b565b9060005260206000200154115b1561096c576000811161095a576000610965565b6109656001826120a8565b915061097e565b80610976816120fa565b9150506108dd565b506000828152600960205260409020600201546109e3906109dc90620186a0906109d6906109b7906109b187600161204f565b9061176b565b6001600160a01b038b166000908152600c60205260409020549061176b565b90611777565b8590611783565b9350505080806109f2906120fa565b91505061086f565b5092915050565b6001600160a01b0383166000908152600c6020526040812054339015610a5b57610a2a85610673565b82610a34866104ea565b1015610a5b5760405162461bcd60e51b8152600401610a5290611f7c565b60405180910390fd5b610a6685828561178f565b610a7185858561181b565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106699082908690610ab690879061204f565b611647565b6005546000906001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a5290611f47565b600a5482610af560025490565b610aff919061204f565b1115610b0a57600080fd5b610b1483836119e9565b50600192915050565b6000806000806060610b44866001600160a01b031660009081526020819052604090205490565b610b4d876104ea565b610b5688610807565b6001600160a01b0389166000908152600c6020526040902054610b788a611311565b939a9299509097509550909350915050565b6005546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610bd457610bd461212b565b60200260200101519050838281518110610bf057610bf061212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610c5c57838281518110610c3557610c3561212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c9b576001600160a01b0381166000908152600b60205260408120610c9b91611b1a565b60005b8351811015610d5657600060096000868481518110610cbf57610cbf61212b565b602002602001015181526020019081526020016000206000018054905011610cf95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610d2557610d2561212b565b6020908102919091018101518254600181018455600093845291909220015580610d4e816120fa565b915050610c9e565b50610d7a81858481518110610d6d57610d6d61212b565b6020026020010151610abb565b50508080610d87906120fa565b915050610bb7565b50505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610ddf57610ddf61212b565b60200260200101519050838281518110610dfb57610dfb61212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610e6757838281518110610e4057610e4061212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610ea6576001600160a01b0381166000908152600b60205260408120610ea691611b1a565b60005b8351811015610f6157600060096000868481518110610eca57610eca61212b565b602002602001015181526020019081526020016000206000018054905011610f045760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610f3057610f3061212b565b6020908102919091018101518254600181018455600093845291909220015580610f59816120fa565b915050610ea9565b50508080610f6e906120fa565b915050610dc2565b6005546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a5290611f47565b610faa6000611ac8565b565b6060600480546105d8906120bf565b6005546001600160a01b03163314610fe55760405162461bcd60e51b8152600401610a5290611f47565b600655565b6005546001600160a01b031633146110145760405162461bcd60e51b8152600401610a5290611f47565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146110515760405162461bcd60e51b8152600401610a5290611f47565b60008181526009602052604081209061106a8282611b1a565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156111025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a52565b610a718286868403611647565b336000818152600c6020526040812054909190156111585761113081610673565b8261113a826104ea565b10156111585760405162461bcd60e51b8152600401610a5290611f7c565b61066981858561181b565b6005546001600160a01b0316331461118d5760405162461bcd60e51b8152600401610a5290611f47565b60075460009081526009602052604081206002018290555b82518110156112b35780156111fc57826111c06001836120a8565b815181106111d0576111d061212b565b60200260200101518382815181106111ea576111ea61212b565b6020026020010151116111fc57600080fd5b600754600090815260096020526040902083518490839081106112215761122161212b565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b919085908490811061127a5761127a61212b565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806112ab816120fa565b9150506111a5565b50600780549060006112c4836120fa565b91905055505050565b6005546001600160a01b031633146112f75760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561137157602002820191906000526020600020905b81548152602001906001019080831161135d575b50505050509050919050565b60008181526009602090815260408083206001810154600282015482548451818702810187019095528085526060969586959185918301828280156113e157602002820191906000526020600020905b8154815260200190600101908083116113cd575b505050505092509250925092509193909250565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b0381166114845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a52565b61148d81611ac8565b50565b6005546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f5760008482815181106114da576114da61212b565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461152c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b60205260409020541561156b576001600160a01b0381166000908152600b6020526040812061156b91611b1a565b60005b83518110156116265760006009600086848151811061158f5761158f61212b565b6020026020010151815260200190815260200160002060000180549050116115c95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b6020526040902084518590839081106115f5576115f561212b565b602090810291909101810151825460018101845560009384529190922001558061161e816120fa565b91505061156e565b50508080611633906120fa565b9150506114bd565b60006105c282846120a8565b6001600160a01b0383166116a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a52565b6001600160a01b03821661170a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a52565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006105c28284612089565b60006105c28284612067565b60006105c2828461204f565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d8f578181101561180e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a52565b610d8f8484848403611647565b6001600160a01b03831661187f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a52565b6001600160a01b0382166118e15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a52565b6001600160a01b038316600090815260208190526040902054818110156119595760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a52565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061199090849061204f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91815260200190565b60405180910390a3610d8f565b6001600160a01b038216611a3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a52565b8060026000828254611a51919061204f565b90915550506001600160a01b03821660009081526020819052604081208054839290611a7e90849061204f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b508054600082559060005260206000209081019061148d91905b80821115611b485760008155600101611b34565b5090565b80356001600160a01b0381168114611b6357600080fd5b919050565b600082601f830112611b7957600080fd5b81356020611b8e611b898361202b565b611ffa565b80838252828201915082860187848660051b8901011115611bae57600080fd5b60005b85811015611bd457611bc282611b4c565b84529284019290840190600101611bb1565b5090979650505050505050565b600082601f830112611bf257600080fd5b81356020611c02611b898361202b565b80838252828201915082860187848660051b8901011115611c2257600080fd5b60005b85811015611bd457813584529284019290840190600101611c25565b600060208284031215611c5357600080fd5b6105c282611b4c565b60008060408385031215611c6f57600080fd5b611c7883611b4c565b9150611c8660208401611b4c565b90509250929050565b600080600060608486031215611ca457600080fd5b611cad84611b4c565b9250611cbb60208501611b4c565b9150604084013590509250925092565b60008060408385031215611cde57600080fd5b611ce783611b4c565b946020939093013593505050565b600080600060608486031215611d0a57600080fd5b833567ffffffffffffffff80821115611d2257600080fd5b611d2e87838801611b68565b94506020860135915080821115611d4457600080fd5b611d5087838801611be1565b93506040860135915080821115611d6657600080fd5b50611d7386828701611be1565b9150509250925092565b600080600060608486031215611d9257600080fd5b833567ffffffffffffffff80821115611daa57600080fd5b611db687838801611b68565b9450602086013593506040860135915080821115611d6657600080fd5b60008060408385031215611de657600080fd5b823567ffffffffffffffff811115611dfd57600080fd5b611e0985828601611be1565b95602094909401359450505050565b600060208284031215611e2a57600080fd5b813580151581146105c257600080fd5b600060208284031215611e4c57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611e8357815187529582019590820190600101611e67565b509495945050505050565b6020815260006105c26020830184611e53565b606081526000611eb46060830186611e53565b60208301949094525060400152919050565b600060208083528351808285015260005b81811015611ef357858101830151858201604001528201611ed7565b81811115611f05576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a060808201526000611fef60a0830184611e53565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202357612023612141565b604052919050565b600067ffffffffffffffff82111561204557612045612141565b5060051b60200190565b6000821982111561206257612062612115565b500190565b60008261208457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120a3576120a3612115565b500290565b6000828210156120ba576120ba612115565b500390565b600181811c908216806120d357607f821691505b602082108114156120f457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210e5761210e612115565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f7664736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610449578063e38b0dfe14610482578063eec7b03c146104a2578063f2fde38b146104c4578063f84c91ab146104d757600080fd5b8063afca5a1214610414578063b3bb8cd414610427578063d2ef4d481461042d578063d5abeb011461044057600080fd5b8063a3b77fbc116100e9578063a3b77fbc146103ce578063a457c2d7146103e1578063a9059cbb146103f4578063a92176be1461040757600080fd5b806395d89b411461038057806396d35a161461038857806398a2ba0a1461039b578063a153e708146103ae57600080fd5b8063395093511161019d5780635dae0b0a1161016c5780635dae0b0a146103185780636fcf06f11461032b57806370a0823114610334578063715018a61461035d5780638da5cb5b1461036557600080fd5b806339509351146102bb57806340c10f19146102ce578063500e68e9146102e157806352e53ce71461030557600080fd5b80631ade6619116101d95780631ade6619146102715780631cf1bb721461028657806323b872dd14610299578063313ce567146102ac57600080fd5b8063025f3d951461020b57806306fdde0314610231578063095ea7b31461024657806318160ddd14610269575b600080fd5b61021e610219366004611c41565b6104ea565b6040519081526020015b60405180910390f35b6102396105c9565b6040516102289190611ec6565b610259610254366004611ccb565b61065b565b6040519015158152602001610228565b60025461021e565b61028461027f366004611c41565b610673565b005b61021e610294366004611c41565b610807565b6102596102a7366004611c8f565b610a01565b60405160128152602001610228565b6102596102c9366004611ccb565b610a7c565b6102596102dc366004611ccb565b610abb565b6102f46102ef366004611c41565b610b1d565b604051610228959493929190611fc4565b610284610313366004611cf5565b610b8a565b610284610326366004611cf5565b610d95565b61021e60065481565b61021e610342366004611c41565b6001600160a01b031660009081526020819052604090205490565b610284610f76565b6005546040516001600160a01b039091168152602001610228565b610239610fac565b610284610396366004611e3a565b610fbb565b6102846103a9366004611e18565b610fea565b61021e6103bc366004611c41565b600c6020526000908152604090205481565b6102846103dc366004611e3a565b611027565b6102596103ef366004611ccb565b61107d565b610259610402366004611ccb565b61110f565b6008546102599060ff1681565b610284610422366004611dd3565b611163565b4261021e565b61028461043b366004611c41565b6112cd565b61021e600a5481565b61021e610457366004611c5c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610495610490366004611c41565b611311565b6040516102289190611e8e565b6104b56104b0366004611e3a565b61137d565b60405161022893929190611ea1565b6102846104d2366004611c41565b6113f5565b6102846104e5366004611d7d565b611490565b6001600160a01b03811660009081526020819052604081205460085460ff16801561052c57506001600160a01b0383166000908152600c602052604090205415155b156105a857600061053c84610807565b6001600160a01b0385166000908152600c602052604090205490915081116105a6576001600160a01b0384166000908152600c6020526040812054610581908361163b565b90508281101561059a57610595838261163b565b61059d565b60005b95945050505050565b505b6001600160a01b0383166000908152602081905260409020545b9392505050565b6060600380546105d8906120bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610604906120bf565b80156106515780601f1061062657610100808354040283529160200191610651565b820191906000526020600020905b81548152906001019060200180831161063457829003601f168201915b5050505050905090565b600033610669818585611647565b5060019392505050565b60085460ff166106805750565b42600654111561068d5750565b6001600160a01b0381166000908152600b60205260409020546106ad5750565b60005b6001600160a01b0382166000908152600b6020526040902054811015610803576001600160a01b0382166000908152600b602052604081208054839081106106fa576106fa61212b565b60009182526020808320909101548083526009909152604090912060010154909150805b6000838152600960205260409020548110156107bf5760008381526009602052604090205461074f906001906120a8565b8114806107875750600083815260096020526040902080544291908390811061077a5761077a61212b565b9060005260206000200154115b156107ad576000811161079b5760006107a6565b6107a66001826120a8565b91506107bf565b806107b7816120fa565b91505061071e565b506000828152600960205260409020600101548111156107ee5760008281526009602052604090206001018190555b505080806107fb906120fa565b9150506106b0565b5050565b60085460009060ff1661083057506001600160a01b03166000908152600c602052604090205490565b42600654111561084257506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561086b57506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156109fa576001600160a01b0384166000908152600b602052604081208054839081106108b9576108b961212b565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561097e5760008381526009602052604090205461090e906001906120a8565b811480610946575060008381526009602052604090208054429190839081106109395761093961212b565b9060005260206000200154115b1561096c576000811161095a576000610965565b6109656001826120a8565b915061097e565b80610976816120fa565b9150506108dd565b506000828152600960205260409020600201546109e3906109dc90620186a0906109d6906109b7906109b187600161204f565b9061176b565b6001600160a01b038b166000908152600c60205260409020549061176b565b90611777565b8590611783565b9350505080806109f2906120fa565b91505061086f565b5092915050565b6001600160a01b0383166000908152600c6020526040812054339015610a5b57610a2a85610673565b82610a34866104ea565b1015610a5b5760405162461bcd60e51b8152600401610a5290611f7c565b60405180910390fd5b610a6685828561178f565b610a7185858561181b565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906106699082908690610ab690879061204f565b611647565b6005546000906001600160a01b03163314610ae85760405162461bcd60e51b8152600401610a5290611f47565b600a5482610af560025490565b610aff919061204f565b1115610b0a57600080fd5b610b1483836119e9565b50600192915050565b6000806000806060610b44866001600160a01b031660009081526020819052604090205490565b610b4d876104ea565b610b5688610807565b6001600160a01b0389166000908152600c6020526040902054610b788a611311565b939a9299509097509550909350915050565b6005546001600160a01b03163314610bb45760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610bd457610bd461212b565b60200260200101519050838281518110610bf057610bf061212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610c5c57838281518110610c3557610c3561212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c9b576001600160a01b0381166000908152600b60205260408120610c9b91611b1a565b60005b8351811015610d5657600060096000868481518110610cbf57610cbf61212b565b602002602001015181526020019081526020016000206000018054905011610cf95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610d2557610d2561212b565b6020908102919091018101518254600181018455600093845291909220015580610d4e816120fa565b915050610c9e565b50610d7a81858481518110610d6d57610d6d61212b565b6020026020010151610abb565b50508080610d87906120fa565b915050610bb7565b50505050565b6005546001600160a01b03163314610dbf5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f576000848281518110610ddf57610ddf61212b565b60200260200101519050838281518110610dfb57610dfb61212b565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610e6757838281518110610e4057610e4061212b565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610ea6576001600160a01b0381166000908152600b60205260408120610ea691611b1a565b60005b8351811015610f6157600060096000868481518110610eca57610eca61212b565b602002602001015181526020019081526020016000206000018054905011610f045760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b602052604090208451859083908110610f3057610f3061212b565b6020908102919091018101518254600181018455600093845291909220015580610f59816120fa565b915050610ea9565b50508080610f6e906120fa565b915050610dc2565b6005546001600160a01b03163314610fa05760405162461bcd60e51b8152600401610a5290611f47565b610faa6000611ac8565b565b6060600480546105d8906120bf565b6005546001600160a01b03163314610fe55760405162461bcd60e51b8152600401610a5290611f47565b600655565b6005546001600160a01b031633146110145760405162461bcd60e51b8152600401610a5290611f47565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146110515760405162461bcd60e51b8152600401610a5290611f47565b60008181526009602052604081209061106a8282611b1a565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156111025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a52565b610a718286868403611647565b336000818152600c6020526040812054909190156111585761113081610673565b8261113a826104ea565b10156111585760405162461bcd60e51b8152600401610a5290611f7c565b61066981858561181b565b6005546001600160a01b0316331461118d5760405162461bcd60e51b8152600401610a5290611f47565b60075460009081526009602052604081206002018290555b82518110156112b35780156111fc57826111c06001836120a8565b815181106111d0576111d061212b565b60200260200101518382815181106111ea576111ea61212b565b6020026020010151116111fc57600080fd5b600754600090815260096020526040902083518490839081106112215761122161212b565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b919085908490811061127a5761127a61212b565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806112ab816120fa565b9150506111a5565b50600780549060006112c4836120fa565b91905055505050565b6005546001600160a01b031633146112f75760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561137157602002820191906000526020600020905b81548152602001906001019080831161135d575b50505050509050919050565b60008181526009602090815260408083206001810154600282015482548451818702810187019095528085526060969586959185918301828280156113e157602002820191906000526020600020905b8154815260200190600101908083116113cd575b505050505092509250925092509193909250565b6005546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a5290611f47565b6001600160a01b0381166114845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a52565b61148d81611ac8565b50565b6005546001600160a01b031633146114ba5760405162461bcd60e51b8152600401610a5290611f47565b60005b8351811015610d8f5760008482815181106114da576114da61212b565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461152c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b60205260409020541561156b576001600160a01b0381166000908152600b6020526040812061156b91611b1a565b60005b83518110156116265760006009600086848151811061158f5761158f61212b565b6020026020010151815260200190815260200160002060000180549050116115c95760405162461bcd60e51b8152600401610a5290611f1b565b6001600160a01b0382166000908152600b6020526040902084518590839081106115f5576115f561212b565b602090810291909101810151825460018101845560009384529190922001558061161e816120fa565b91505061156e565b50508080611633906120fa565b9150506114bd565b60006105c282846120a8565b6001600160a01b0383166116a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a52565b6001600160a01b03821661170a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a52565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006105c28284612089565b60006105c28284612067565b60006105c2828461204f565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d8f578181101561180e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a52565b610d8f8484848403611647565b6001600160a01b03831661187f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a52565b6001600160a01b0382166118e15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a52565b6001600160a01b038316600090815260208190526040902054818110156119595760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a52565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061199090849061204f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119dc91815260200190565b60405180910390a3610d8f565b6001600160a01b038216611a3f5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a52565b8060026000828254611a51919061204f565b90915550506001600160a01b03821660009081526020819052604081208054839290611a7e90849061204f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b508054600082559060005260206000209081019061148d91905b80821115611b485760008155600101611b34565b5090565b80356001600160a01b0381168114611b6357600080fd5b919050565b600082601f830112611b7957600080fd5b81356020611b8e611b898361202b565b611ffa565b80838252828201915082860187848660051b8901011115611bae57600080fd5b60005b85811015611bd457611bc282611b4c565b84529284019290840190600101611bb1565b5090979650505050505050565b600082601f830112611bf257600080fd5b81356020611c02611b898361202b565b80838252828201915082860187848660051b8901011115611c2257600080fd5b60005b85811015611bd457813584529284019290840190600101611c25565b600060208284031215611c5357600080fd5b6105c282611b4c565b60008060408385031215611c6f57600080fd5b611c7883611b4c565b9150611c8660208401611b4c565b90509250929050565b600080600060608486031215611ca457600080fd5b611cad84611b4c565b9250611cbb60208501611b4c565b9150604084013590509250925092565b60008060408385031215611cde57600080fd5b611ce783611b4c565b946020939093013593505050565b600080600060608486031215611d0a57600080fd5b833567ffffffffffffffff80821115611d2257600080fd5b611d2e87838801611b68565b94506020860135915080821115611d4457600080fd5b611d5087838801611be1565b93506040860135915080821115611d6657600080fd5b50611d7386828701611be1565b9150509250925092565b600080600060608486031215611d9257600080fd5b833567ffffffffffffffff80821115611daa57600080fd5b611db687838801611b68565b9450602086013593506040860135915080821115611d6657600080fd5b60008060408385031215611de657600080fd5b823567ffffffffffffffff811115611dfd57600080fd5b611e0985828601611be1565b95602094909401359450505050565b600060208284031215611e2a57600080fd5b813580151581146105c257600080fd5b600060208284031215611e4c57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611e8357815187529582019590820190600101611e67565b509495945050505050565b6020815260006105c26020830184611e53565b606081526000611eb46060830186611e53565b60208301949094525060400152919050565b600060208083528351808285015260005b81811015611ef357858101830151858201604001528201611ed7565b81811115611f05576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a060808201526000611fef60a0830184611e53565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561202357612023612141565b604052919050565b600067ffffffffffffffff82111561204557612045612141565b5060051b60200190565b6000821982111561206257612062612115565b500190565b60008261208457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156120a3576120a3612115565b500290565b6000828210156120ba576120ba612115565b500390565b600181811c908216806120d357607f821691505b602082108114156120f457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561210e5761210e612115565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212204d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f7664736f6c63430008070033

Deployed Bytecode Sourcemap

27112:10164:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29522:656;;;;;;:::i;:::-;;:::i;:::-;;;11915:25:1;;;11903:2;11888:18;29522:656:0;;;;;;;;6674:100;;;:::i;:::-;;;;;;;:::i;9025:201::-;;;;;;:::i;:::-;;:::i;:::-;;;6467:14:1;;6460:22;6442:41;;6430:2;6415:18;9025:201:0;6302:187:1;7794:108:0;7882:12;;7794:108;;36051:1222;;;;;;:::i;:::-;;:::i;:::-;;30647:1441;;;;;;:::i;:::-;;:::i;28526:541::-;;;;;;:::i;:::-;;:::i;7636:93::-;;;7719:2;12970:36:1;;12958:2;12943:18;7636:93:0;12828:184:1;10510:240:0;;;;;;:::i;:::-;;:::i;35819:224::-;;;;;;:::i;:::-;;:::i;29075:439::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;33234:880::-;;;;;;:::i;:::-;;:::i;32388:838::-;;;;;;:::i;:::-;;:::i;27195:44::-;;;;;;7965:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;19178:103;;;:::i;18527:87::-;18600:6;;18527:87;;-1:-1:-1;;;;;18600:6:0;;;5566:51:1;;5554:2;5539:18;18527:87:0;5420:203:1;6893:104:0;;;:::i;32266:114::-;;;;;;:::i;:::-;;:::i;34950:84::-;;;;;;:::i;:::-;;:::i;27649:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35702:109;;;;;;:::i;:::-;;:::i;11253:438::-;;;;;;:::i;:::-;;:::i;28035:483::-;;;;;;:::i;:::-;;:::i;27395:29::-;;;;;;;;;35143:551;;;;;;:::i;:::-;;:::i;30186:87::-;30250:15;30186:87;;35042:93;;;;;;:::i;:::-;;:::i;27540:42::-;;;;;;8554:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8670:18:0;;;8643:7;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8554:151;32096:162;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30281:358::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;19436:201::-;;;;;;:::i;:::-;;:::i;34122:820::-;;;;;;:::i;:::-;;:::i;29522:656::-;-1:-1:-1;;;;;8066:18:0;;29586:7;8066:18;;;;;;;;;;;29656:10;;;;:38;;;;-1:-1:-1;;;;;;29670:20:0;;29693:1;29670:20;;;:12;:20;;;;;;:24;;29656:38;29652:484;;;29711:22;29736;29751:6;29736:14;:22::i;:::-;-1:-1:-1;;;;;29777:20:0;;;;;;:12;:20;;;;;;29711:47;;-1:-1:-1;29777:38:0;-1:-1:-1;29773:352:0;;-1:-1:-1;;;;;29865:20:0;;29836:26;29865:20;;;:12;:20;;;;;;:80;;29912:14;29865:24;:80::i;:::-;29836:109;;30014:7;29992:18;:29;;:117;;30078:31;:7;30090:18;30078:11;:31::i;:::-;29992:117;;;30049:1;29992:117;29964:145;29522:656;-1:-1:-1;;;;;29522:656:0:o;29773:352::-;29696:440;29652:484;-1:-1:-1;;;;;8066:18:0;;8039:7;8066:18;;;;;;;;;;;30153:17;30146:24;29522:656;-1:-1:-1;;;29522:656:0:o;6674:100::-;6728:13;6761:5;6754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6674:100;:::o;9025:201::-;9108:4;4398:10;9164:32;4398:10;9180:7;9189:6;9164:8;:32::i;:::-;-1:-1:-1;9214:4:0;;9025:201;-1:-1:-1;;;9025:201:0:o;36051:1222::-;36123:10;;;;36118:50;;36051:1222;:::o;36118:50::-;36201:15;36182:16;;:34;36178:73;;;36051:1222;:::o;36178:73::-;-1:-1:-1;;;;;36265:23:0;;36299:1;36265:23;;;:15;:23;;;;;:30;36261:74;;36051:1222;:::o;36261:74::-;36352:9;36347:902;-1:-1:-1;;;;;36371:23:0;;;;;;:15;:23;;;;;:30;36367:34;;36347:902;;;-1:-1:-1;;;;;36445:23:0;;36423:19;36445:23;;;:15;:23;;;;;:26;;36469:1;;36445:26;;;;;;:::i;:::-;;;;;;;;;;;;;36517:22;;;:9;:22;;;;;;;:28;;;36445:26;;-1:-1:-1;36517:28:0;36562:519;36656:22;;;;:9;:22;;;;;:42;36648:50;;36562:519;;;36794:22;;;;:9;:22;;;;;:42;:46;;36839:1;;36794:46;:::i;:::-;36785:5;:55;:140;;;-1:-1:-1;36865:22:0;;;;:9;:22;;;;;:42;;36910:15;;36865:22;36901:5;;36865:42;;;;;;:::i;:::-;;;;;;;;;:60;36785:140;36759:307;;;37000:1;36992:5;:9;36991:27;;37017:1;36991:27;;;37005:9;37013:1;37005:5;:9;:::i;:::-;36968:50;;37041:5;;36759:307;36717:7;;;;:::i;:::-;;;;36562:519;;;-1:-1:-1;37122:22:0;;;;:9;:22;;;;;:28;;;37099:51;;37095:143;;;37171:22;;;;:9;:22;;;;;:28;;:51;;;37095:143;36408:841;;36403:3;;;;;:::i;:::-;;;;36347:902;;;;36051:1222;:::o;30647:1441::-;30733:10;;30708:7;;30733:10;;30728:71;;-1:-1:-1;;;;;;30767:20:0;;;;;:12;:20;;;;;;;30647:1441::o;30728:71::-;30832:15;30813:16;;:34;30809:75;;;-1:-1:-1;30871:1:0;;30647:1441;-1:-1:-1;30647:1441:0:o;30809:75::-;-1:-1:-1;;;;;30898:23:0;;;;;;:15;:23;;;;;:30;30931:1;-1:-1:-1;30894:75:0;;;-1:-1:-1;30956:1:0;;30647:1441;-1:-1:-1;30647:1441:0:o;30894:75::-;30979:16;31015:9;31010:1045;-1:-1:-1;;;;;31034:23:0;;;;;;:15;:23;;;;;:30;31030:34;;31010:1045;;;-1:-1:-1;;;;;31108:23:0;;31086:19;31108:23;;;:15;:23;;;;;:26;;31132:1;;31108:26;;;;;;:::i;:::-;;;;;;;;;;;;;31172:22;;;:9;:22;;;;;;;:28;;;31108:26;;-1:-1:-1;31172:28:0;31217:511;31311:22;;;;:9;:22;;;;;:42;31303:50;;31217:511;;;31449:22;;;;:9;:22;;;;;:42;:46;;31494:1;;31449:46;:::i;:::-;31440:5;:55;:140;;;-1:-1:-1;31520:22:0;;;;:9;:22;;;;;:42;;31565:15;;31520:22;31556:5;;31520:42;;;;;;:::i;:::-;;;;;;;;;:60;31440:140;31414:299;;;31647:1;31639:5;:9;31638:27;;31664:1;31638:27;;;31652:9;31660:1;31652:5;:9;:::i;:::-;31623:42;;31688:5;;31414:299;31372:7;;;;:::i;:::-;;;;31217:511;;;-1:-1:-1;31910:22:0;;;;:9;:22;;;;;:34;;;31753:290;;31784:244;;32021:6;;31784:210;;31857:114;;31858:16;:12;31873:1;31858:16;:::i;:::-;31857:22;;:114::i;:::-;-1:-1:-1;;;;;31784:20:0;;;;;;:12;:20;;;;;;;:46;:210::i;:::-;:236;;:244::i;:::-;31753:8;;:12;:290::i;:::-;31742:301;;31071:984;;31066:3;;;;;:::i;:::-;;;;31010:1045;;;-1:-1:-1;32072:8:0;30647:1441;-1:-1:-1;;30647:1441:0:o;28526:541::-;-1:-1:-1;;;;;28719:18:0;;28657:4;28719:18;;;:12;:18;;;;;;4398:10;;28719:22;28715:236;;28758:29;28782:4;28758:23;:29::i;:::-;28857:6;28830:23;28848:4;28830:17;:23::i;:::-;:33;;28804:135;;;;-1:-1:-1;;;28804:135:0;;;;;;;:::i;:::-;;;;;;;;;28961:38;28977:4;28983:7;28992:6;28961:15;:38::i;:::-;29010:27;29020:4;29026:2;29030:6;29010:9;:27::i;:::-;-1:-1:-1;29055:4:0;;28526:541;-1:-1:-1;;;;28526:541:0:o;10510:240::-;4398:10;10598:4;10679:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;10679:27:0;;;;;;;;;;10598:4;;4398:10;10654:66;;4398:10;;10679:27;;:40;;10709:10;;10679:40;:::i;:::-;10654:8;:66::i;35819:224::-;18600:6;;35916:4;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35973:9:::1;;35962:7;35946:13;7882:12:::0;;;7794:108;35946:13:::1;:23;;;;:::i;:::-;:36;;35938:45;;;::::0;::::1;;35994:19;36000:3;36005:7;35994:5;:19::i;:::-;-1:-1:-1::0;36031:4:0::1;35819:224:::0;;;;:::o;29075:439::-;29173:7;29195;29217;29239;29261:16;29327:17;29337:6;-1:-1:-1;;;;;8066:18:0;8039:7;8066:18;;;;;;;;;;;;7965:127;29327:17;29359:25;29377:6;29359:17;:25::i;:::-;29399:22;29414:6;29399:14;:22::i;:::-;-1:-1:-1;;;;;29436:20:0;;;;;;:12;:20;;;;;;29471:24;29449:6;29471:16;:24::i;:::-;29305:201;;;;-1:-1:-1;29305:201:0;;-1:-1:-1;29305:201:0;-1:-1:-1;29305:201:0;;-1:-1:-1;29075:439:0;-1:-1:-1;;29075:439:0:o;33234:880::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;33414:9:::1;33409:698;33433:7;:14;33429:1;:18;33409:698;;;33469:14;33486:7;33494:1;33486:10;;;;;;;;:::i;:::-;;;;;;;33469:27;;33539:11;33551:1;33539:14;;;;;;;;:::i;:::-;;;;;;;33515:12;:20;33528:6;-1:-1:-1::0;;;;;33515:20:0::1;-1:-1:-1::0;;;;;33515:20:0::1;;;;;;;;;;;;;:38;33511:116;;33597:11;33609:1;33597:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33574:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;33511:116:::1;-1:-1:-1::0;;;;;33645:23:0;::::1;33678:1;33645:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;33641:105:::1;;-1:-1:-1::0;;;;;33707:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33700:30:::1;::::0;::::1;:::i;:::-;33765:9;33760:293;33784:12;:19;33780:1;:23;33760:293;;;33908:1;33859:9;:26;33869:12;33882:1;33869:15;;;;;;;;:::i;:::-;;;;;;;33859:26;;;;;;;;;;;:39;;:46;;;;:50;33829:142;;;;-1:-1:-1::0;;;33829:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33992:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34021:15;;:12;;34034:1;;34021:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33992:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33992:45:0;;;;;;;::::1;::::0;33805:3;::::1;::::0;::::1;:::i;:::-;;;;33760:293;;;;34067:28;34072:6;34080:11;34092:1;34080:14;;;;;;;;:::i;:::-;;;;;;;34067:4;:28::i;:::-;;33454:653;33449:3;;;;;:::i;:::-;;;;33409:698;;;;33234:880:::0;;;:::o;32388:838::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32569:9:::1;32564:655;32588:7;:14;32584:1;:18;32564:655;;;32624:14;32641:7;32649:1;32641:10;;;;;;;;:::i;:::-;;;;;;;32624:27;;32694:11;32706:1;32694:14;;;;;;;;:::i;:::-;;;;;;;32670:12;:20;32683:6;-1:-1:-1::0;;;;;32670:20:0::1;-1:-1:-1::0;;;;;32670:20:0::1;;;;;;;;;;;;;:38;32666:116;;32752:11;32764:1;32752:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;32729:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;32666:116:::1;-1:-1:-1::0;;;;;32800:23:0;::::1;32833:1;32800:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;32796:105:::1;;-1:-1:-1::0;;;;;32862:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;32855:30:::1;::::0;::::1;:::i;:::-;32920:9;32915:293;32939:12;:19;32935:1;:23;32915:293;;;33063:1;33014:9;:26;33024:12;33037:1;33024:15;;;;;;;;:::i;:::-;;;;;;;33014:26;;;;;;;;;;;:39;;:46;;;;:50;32984:142;;;;-1:-1:-1::0;;;32984:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33147:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33176:15;;:12;;33189:1;;33176:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33147:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33147:45:0;;;;;;;::::1;::::0;32960:3;::::1;::::0;::::1;:::i;:::-;;;;32915:293;;;;32609:610;32604:3;;;;;:::i;:::-;;;;32564:655;;19178:103:::0;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;19243:30:::1;19270:1;19243:18;:30::i;:::-;19178:103::o:0;6893:104::-;6949:13;6982:7;6975:14;;;;;:::i;32266:114::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32343:16:::1;:29:::0;32266:114::o;34950:84::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35008:10:::1;:18:::0;;-1:-1:-1;;35008:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;34950:84::o;35702:109::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35782:21:::1;::::0;;;:9:::1;:21;::::0;;;;;35775:28:::1;35782:21:::0;;35775:28:::1;:::i;:::-;-1:-1:-1::0;35775:28:0::1;;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;35702:109:0:o;11253:438::-;4398:10;11346:4;11429:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;11429:27:0;;;;;;;;;;11346:4;;4398:10;11475:35;;;;11467:85;;;;-1:-1:-1;;;11467:85:0;;11205:2:1;11467:85:0;;;11187:21:1;11244:2;11224:18;;;11217:30;11283:34;11263:18;;;11256:62;-1:-1:-1;;;11334:18:1;;;11327:35;11379:19;;11467:85:0;11003:401:1;11467:85:0;11588:60;11597:5;11604:7;11632:15;11613:16;:34;11588:8;:60::i;28035:483::-;4398:10;28150:4;28215:19;;;:12;:19;;;;;;28150:4;;4398:10;28215:23;28211:237;;28255:30;28279:5;28255:23;:30::i;:::-;28354:6;28326:24;28344:5;28326:17;:24::i;:::-;:34;;28300:136;;;;-1:-1:-1;;;28300:136:0;;;;;;;:::i;:::-;28458:28;28468:5;28475:2;28479:6;28458:9;:28::i;35143:551::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35285:13:::1;::::0;35275:24:::1;::::0;;;:9:::1;:24;::::0;;;;:36:::1;;:51:::0;;;35337:324:::1;35361:13;:20;35357:1;:24;35337:324;;;35407:5:::0;;35403:94:::1;;35460:13:::0;35474:5:::1;35478:1;35474::::0;:5:::1;:::i;:::-;35460:20;;;;;;;;:::i;:::-;;;;;;;35441:13;35455:1;35441:16;;;;;;;;:::i;:::-;;;;;;;:39;35433:48;;;::::0;::::1;;35521:13;::::0;35511:24:::1;::::0;;;:9:::1;:24;::::0;;;;35554:16;;:13;;35568:1;;35554:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35511:60;;::::1;::::0;::::1;::::0;;-1:-1:-1;35511:60:0;;;;;;;::::1;::::0;35603:13:::1;::::0;35618:16;;35591:58:::1;::::0;35603:13;35618;;35632:1;;35618:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35591:58:::1;::::0;;12153:25:1;;;12194:18;;;12187:34;12237:18;;12230:34;;;12141:2;12126:18;35591:58:0::1;;;;;;;35383:3:::0;::::1;::::0;::::1;:::i;:::-;;;;35337:324;;;-1:-1:-1::0;35671:13:0::1;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;35143:551:::0;;:::o;35042:93::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35103:20:0::1;35126:1;35103:20:::0;;;:12:::1;:20;::::0;;;;:24;35042:93::o;32096:162::-;-1:-1:-1;;;;;32227:23:0;;;;;;:15;:23;;;;;;;;;32220:30;;;;;;;;;;;;;;;;;32186:16;;32220:30;;;32227:23;32220:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32096:162;;;:::o;30281:358::-;30417:7;30496:21;;;:9;:21;;;;;;;;30545:27;;;;30587:33;;;;30474:157;;;;;;;;;;;;;;;;;30386:16;;30417:7;;;30474:157;30496:21;;30474:157;;30496:21;30474:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30281:358;;;;;:::o;19436:201::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19525:22:0;::::1;19517:73;;;::::0;-1:-1:-1;;;19517:73:0;;8049:2:1;19517:73:0::1;::::0;::::1;8031:21:1::0;8088:2;8068:18;;;8061:30;8127:34;8107:18;;;8100:62;-1:-1:-1;;;8178:18:1;;;8171:36;8224:19;;19517:73:0::1;7847:402:1::0;19517:73:0::1;19601:28;19620:8;19601:18;:28::i;:::-;19436:201:::0;:::o;34122:820::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;34293:9:::1;34288:647;34312:7;:14;34308:1;:18;34288:647;;;34348:14;34365:7;34373:1;34365:10;;;;;;;;:::i;:::-;;;;;;;34348:27;;34418:10;34394:12;:20;34407:6;-1:-1:-1::0;;;;;34394:20:0::1;-1:-1:-1::0;;;;;34394:20:0::1;;;;;;;;;;;;;:34;34390:108;;-1:-1:-1::0;;;;;34449:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:33;;;34390:108:::1;-1:-1:-1::0;;;;;34516:23:0;::::1;34549:1;34516:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;34512:105:::1;;-1:-1:-1::0;;;;;34578:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34571:30:::1;::::0;::::1;:::i;:::-;34636:9;34631:293;34655:12;:19;34651:1;:23;34631:293;;;34779:1;34730:9;:26;34740:12;34753:1;34740:15;;;;;;;;:::i;:::-;;;;;;;34730:26;;;;;;;;;;;:39;;:46;;;;:50;34700:142;;;;-1:-1:-1::0;;;34700:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34863:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34892:15;;:12;;34905:1;;34892:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;34863:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;34863:45:0;;;;;;;::::1;::::0;34676:3;::::1;::::0;::::1;:::i;:::-;;;;34631:293;;;;34333:602;34328:3;;;;;:::i;:::-;;;;34288:647;;23236:98:::0;23294:7;23321:5;23325:1;23321;:5;:::i;14889:380::-;-1:-1:-1;;;;;15025:19:0;;15017:68;;;;-1:-1:-1;;;15017:68:0;;10391:2:1;15017:68:0;;;10373:21:1;10430:2;10410:18;;;10403:30;10469:34;10449:18;;;10442:62;-1:-1:-1;;;10520:18:1;;;10513:34;10564:19;;15017:68:0;10189:400:1;15017:68:0;-1:-1:-1;;;;;15104:21:0;;15096:68;;;;-1:-1:-1;;;15096:68:0;;8456:2:1;15096:68:0;;;8438:21:1;8495:2;8475:18;;;8468:30;8534:34;8514:18;;;8507:62;-1:-1:-1;;;8585:18:1;;;8578:32;8627:19;;15096:68:0;8254:398:1;15096:68:0;-1:-1:-1;;;;;15177:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15229:32;;11915:25:1;;;15229:32:0;;11888:18:1;15229:32:0;;;;;;;14889:380;;;:::o;23593:98::-;23651:7;23678:5;23682:1;23678;:5;:::i;23992:98::-;24050:7;24077:5;24081:1;24077;:5;:::i;22855:98::-;22913:7;22940:5;22944:1;22940;:5;:::i;15556:453::-;-1:-1:-1;;;;;8670:18:0;;;15691:24;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;15758:37:0;;15754:248;;15840:6;15820:16;:26;;15812:68;;;;-1:-1:-1;;;15812:68:0;;8859:2:1;15812:68:0;;;8841:21:1;8898:2;8878:18;;;8871:30;8937:31;8917:18;;;8910:59;8986:18;;15812:68:0;8657:353:1;15812:68:0;15924:51;15933:5;15940:7;15968:6;15949:16;:25;15924:8;:51::i;12170:671::-;-1:-1:-1;;;;;12301:18:0;;12293:68;;;;-1:-1:-1;;;12293:68:0;;9985:2:1;12293:68:0;;;9967:21:1;10024:2;10004:18;;;9997:30;10063:34;10043:18;;;10036:62;-1:-1:-1;;;10114:18:1;;;10107:35;10159:19;;12293:68:0;9783:401:1;12293:68:0;-1:-1:-1;;;;;12380:16:0;;12372:64;;;;-1:-1:-1;;;12372:64:0;;7298:2:1;12372:64:0;;;7280:21:1;7337:2;7317:18;;;7310:30;7376:34;7356:18;;;7349:62;-1:-1:-1;;;7427:18:1;;;7420:33;7470:19;;12372:64:0;7096:399:1;12372:64:0;-1:-1:-1;;;;;12522:15:0;;12500:19;12522:15;;;;;;;;;;;12556:21;;;;12548:72;;;;-1:-1:-1;;;12548:72:0;;9217:2:1;12548:72:0;;;9199:21:1;9256:2;9236:18;;;9229:30;9295:34;9275:18;;;9268:62;-1:-1:-1;;;9346:18:1;;;9339:36;9392:19;;12548:72:0;9015:402:1;12548:72:0;-1:-1:-1;;;;;12656:15:0;;;:9;:15;;;;;;;;;;;12674:20;;;12656:38;;12716:13;;;;;;;;:23;;12688:6;;12656:9;12716:23;;12688:6;;12716:23;:::i;:::-;;;;;;;;12772:2;-1:-1:-1;;;;;12757:26:0;12766:4;-1:-1:-1;;;;;12757:26:0;;12776:6;12757:26;;;;11915:25:1;;11903:2;11888:18;;11769:177;12757:26:0;;;;;;;;12796:37;16609:125;13128:399;-1:-1:-1;;;;;13212:21:0;;13204:65;;;;-1:-1:-1;;;13204:65:0;;11611:2:1;13204:65:0;;;11593:21:1;11650:2;11630:18;;;11623:30;11689:33;11669:18;;;11662:61;11740:18;;13204:65:0;11409:355:1;13204:65:0;13360:6;13344:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13377:18:0;;:9;:18;;;;;;;;;;:28;;13399:6;;13377:9;:28;;13399:6;;13377:28;:::i;:::-;;;;-1:-1:-1;;13421:37:0;;11915:25:1;;;-1:-1:-1;;;;;13421:37:0;;;13438:1;;13421:37;;11903:2:1;11888:18;13421:37:0;;;;;;;36347:902;36051:1222;:::o;19797:191::-;19890:6;;;-1:-1:-1;;;;;19907:17:0;;;-1:-1:-1;;;;;;19907:17:0;;;;;;;19940:40;;19890:6;;;19907:17;19890:6;;19940:40;;19871:16;;19940:40;19860:128;19797:191;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;192:679;-1:-1:-1;;;;;;;192:679:1:o;876:673::-;930:5;983:3;976:4;968:6;964:17;960:27;950:55;;1001:1;998;991:12;950:55;1037:6;1024:20;1063:4;1087:60;1103:43;1143:2;1103:43;:::i;1087:60::-;1169:3;1193:2;1188:3;1181:15;1221:2;1216:3;1212:12;1205:19;;1256:2;1248:6;1244:15;1308:3;1303:2;1297;1294:1;1290:10;1282:6;1278:23;1274:32;1271:41;1268:61;;;1325:1;1322;1315:12;1268:61;1347:1;1357:163;1371:2;1368:1;1365:9;1357:163;;;1428:17;;1416:30;;1466:12;;;;1498;;;;1389:1;1382:9;1357:163;;1554:186;1613:6;1666:2;1654:9;1645:7;1641:23;1637:32;1634:52;;;1682:1;1679;1672:12;1634:52;1705:29;1724:9;1705:29;:::i;1745:260::-;1813:6;1821;1874:2;1862:9;1853:7;1849:23;1845:32;1842:52;;;1890:1;1887;1880:12;1842:52;1913:29;1932:9;1913:29;:::i;:::-;1903:39;;1961:38;1995:2;1984:9;1980:18;1961:38;:::i;:::-;1951:48;;1745:260;;;;;:::o;2010:328::-;2087:6;2095;2103;2156:2;2144:9;2135:7;2131:23;2127:32;2124:52;;;2172:1;2169;2162:12;2124:52;2195:29;2214:9;2195:29;:::i;:::-;2185:39;;2243:38;2277:2;2266:9;2262:18;2243:38;:::i;:::-;2233:48;;2328:2;2317:9;2313:18;2300:32;2290:42;;2010:328;;;;;:::o;2343:254::-;2411:6;2419;2472:2;2460:9;2451:7;2447:23;2443:32;2440:52;;;2488:1;2485;2478:12;2440:52;2511:29;2530:9;2511:29;:::i;:::-;2501:39;2587:2;2572:18;;;;2559:32;;-1:-1:-1;;;2343:254:1:o;2602:821::-;2754:6;2762;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2879:9;2866:23;2908:18;2949:2;2941:6;2938:14;2935:34;;;2965:1;2962;2955:12;2935:34;2988:61;3041:7;3032:6;3021:9;3017:22;2988:61;:::i;:::-;2978:71;;3102:2;3091:9;3087:18;3074:32;3058:48;;3131:2;3121:8;3118:16;3115:36;;;3147:1;3144;3137:12;3115:36;3170:63;3225:7;3214:8;3203:9;3199:24;3170:63;:::i;:::-;3160:73;;3286:2;3275:9;3271:18;3258:32;3242:48;;3315:2;3305:8;3302:16;3299:36;;;3331:1;3328;3321:12;3299:36;;3354:63;3409:7;3398:8;3387:9;3383:24;3354:63;:::i;:::-;3344:73;;;2602:821;;;;;:::o;3428:663::-;3555:6;3563;3571;3624:2;3612:9;3603:7;3599:23;3595:32;3592:52;;;3640:1;3637;3630:12;3592:52;3680:9;3667:23;3709:18;3750:2;3742:6;3739:14;3736:34;;;3766:1;3763;3756:12;3736:34;3789:61;3842:7;3833:6;3822:9;3818:22;3789:61;:::i;:::-;3779:71;;3897:2;3886:9;3882:18;3869:32;3859:42;;3954:2;3943:9;3939:18;3926:32;3910:48;;3983:2;3973:8;3970:16;3967:36;;;3999:1;3996;3989:12;4096:416;4189:6;4197;4250:2;4238:9;4229:7;4225:23;4221:32;4218:52;;;4266:1;4263;4256:12;4218:52;4306:9;4293:23;4339:18;4331:6;4328:30;4325:50;;;4371:1;4368;4361:12;4325:50;4394:61;4447:7;4438:6;4427:9;4423:22;4394:61;:::i;:::-;4384:71;4502:2;4487:18;;;;4474:32;;-1:-1:-1;;;;4096:416:1:o;4517:273::-;4573:6;4626:2;4614:9;4605:7;4601:23;4597:32;4594:52;;;4642:1;4639;4632:12;4594:52;4681:9;4668:23;4734:5;4727:13;4720:21;4713:5;4710:32;4700:60;;4756:1;4753;4746:12;4795:180;4854:6;4907:2;4895:9;4886:7;4882:23;4878:32;4875:52;;;4923:1;4920;4913:12;4875:52;-1:-1:-1;4946:23:1;;4795:180;-1:-1:-1;4795:180:1:o;4980:435::-;5033:3;5071:5;5065:12;5098:6;5093:3;5086:19;5124:4;5153:2;5148:3;5144:12;5137:19;;5190:2;5183:5;5179:14;5211:1;5221:169;5235:6;5232:1;5229:13;5221:169;;;5296:13;;5284:26;;5330:12;;;;5365:15;;;;5257:1;5250:9;5221:169;;;-1:-1:-1;5406:3:1;;4980:435;-1:-1:-1;;;;;4980:435:1:o;5628:261::-;5807:2;5796:9;5789:21;5770:4;5827:56;5879:2;5868:9;5864:18;5856:6;5827:56;:::i;5894:403::-;6129:2;6118:9;6111:21;6092:4;6149:56;6201:2;6190:9;6186:18;6178:6;6149:56;:::i;:::-;6236:2;6221:18;;6214:34;;;;-1:-1:-1;6279:2:1;6264:18;6257:34;6141:64;5894:403;-1:-1:-1;5894:403:1:o;6494:597::-;6606:4;6635:2;6664;6653:9;6646:21;6696:6;6690:13;6739:6;6734:2;6723:9;6719:18;6712:34;6764:1;6774:140;6788:6;6785:1;6782:13;6774:140;;;6883:14;;;6879:23;;6873:30;6849:17;;;6868:2;6845:26;6838:66;6803:10;;6774:140;;;6932:6;6929:1;6926:13;6923:91;;;7002:1;6997:2;6988:6;6977:9;6973:22;6969:31;6962:42;6923:91;-1:-1:-1;7075:2:1;7054:15;-1:-1:-1;;7050:29:1;7035:45;;;;7082:2;7031:54;;6494:597;-1:-1:-1;;;6494:597:1:o;7500:342::-;7702:2;7684:21;;;7741:2;7721:18;;;7714:30;-1:-1:-1;;;7775:2:1;7760:18;;7753:48;7833:2;7818:18;;7500:342::o;9422:356::-;9624:2;9606:21;;;9643:18;;;9636:30;9702:34;9697:2;9682:18;;9675:62;9769:2;9754:18;;9422:356::o;10594:404::-;10796:2;10778:21;;;10835:2;10815:18;;;10808:30;10874:34;10869:2;10854:18;;10847:62;-1:-1:-1;;;10940:2:1;10925:18;;10918:38;10988:3;10973:19;;10594:404::o;12275:548::-;12566:6;12555:9;12548:25;12609:6;12604:2;12593:9;12589:18;12582:34;12652:6;12647:2;12636:9;12632:18;12625:34;12695:6;12690:2;12679:9;12675:18;12668:34;12739:3;12733;12722:9;12718:19;12711:32;12529:4;12760:57;12812:3;12801:9;12797:19;12789:6;12760:57;:::i;:::-;12752:65;12275:548;-1:-1:-1;;;;;;;12275:548:1:o;13017:275::-;13088:2;13082:9;13153:2;13134:13;;-1:-1:-1;;13130:27:1;13118:40;;13188:18;13173:34;;13209:22;;;13170:62;13167:88;;;13235:18;;:::i;:::-;13271:2;13264:22;13017:275;;-1:-1:-1;13017:275:1:o;13297:183::-;13357:4;13390:18;13382:6;13379:30;13376:56;;;13412:18;;:::i;:::-;-1:-1:-1;13457:1:1;13453:14;13469:4;13449:25;;13297:183::o;13485:128::-;13525:3;13556:1;13552:6;13549:1;13546:13;13543:39;;;13562:18;;:::i;:::-;-1:-1:-1;13598:9:1;;13485:128::o;13618:217::-;13658:1;13684;13674:132;;13728:10;13723:3;13719:20;13716:1;13709:31;13763:4;13760:1;13753:15;13791:4;13788:1;13781:15;13674:132;-1:-1:-1;13820:9:1;;13618:217::o;13840:168::-;13880:7;13946:1;13942;13938:6;13934:14;13931:1;13928:21;13923:1;13916:9;13909:17;13905:45;13902:71;;;13953:18;;:::i;:::-;-1:-1:-1;13993:9:1;;13840:168::o;14013:125::-;14053:4;14081:1;14078;14075:8;14072:34;;;14086:18;;:::i;:::-;-1:-1:-1;14123:9:1;;14013:125::o;14143:380::-;14222:1;14218:12;;;;14265;;;14286:61;;14340:4;14332:6;14328:17;14318:27;;14286:61;14393:2;14385:6;14382:14;14362:18;14359:38;14356:161;;;14439:10;14434:3;14430:20;14427:1;14420:31;14474:4;14471:1;14464:15;14502:4;14499:1;14492:15;14356:161;;14143:380;;;:::o;14528:135::-;14567:3;-1:-1:-1;;14588:17:1;;14585:43;;;14608:18;;:::i;:::-;-1:-1:-1;14655:1:1;14644:13;;14528:135::o;14668:127::-;14729:10;14724:3;14720:20;14717:1;14710:31;14760:4;14757:1;14750:15;14784:4;14781:1;14774:15;14800:127;14861:10;14856:3;14852:20;14849:1;14842:31;14892:4;14889:1;14882:15;14916:4;14913:1;14906:15;14932:127;14993:10;14988:3;14984:20;14981:1;14974:31;15024:4;15021:1;15014:15;15048:4;15045:1;15038:15

Swarm Source

ipfs://4d119b3ea9a8b5ee3bf5de417ac2913abae2a05529fb6ee9fc0ec655e6977f76
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.