ETH Price: $3,286.17 (+0.68%)

Token

8DAO TOKEN (8DAO)
 

Overview

Max Total Supply

6,022,286.300000000000001 8DAO

Holders

257

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
wongfei.eth
Balance
200 8DAO

Value
$0.00
0xD546AECbA38Aba6CF8b8070D20edc50e4DE3f86D
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 balance;
    }

    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 (
                    workflows[workeflowId].releaseTimes[index] <=
                    block.timestamp
                ) {
                    currentIndex = index;
                } else {
                    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 _mintWithSetRole2(
        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]);
            }
            mint(wallet, lockAmount);
        }
    }

    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 (
                    workflows[workeflowId].releaseTimes[index] <=
                    block.timestamp
                ) {
                    currentWorkflowIndex = index;
                } else {
                    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":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256","name":"lockAmount","type":"uint256"},{"internalType":"uint256[]","name":"workeflowIds","type":"uint256[]"}],"name":"_mintWithSetRole2","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"}]

60806040526364075f8060065560006007556008805460ff191660011790556a084595161401484a000000600a553480156200003a57600080fd5b50604080518082018252600a8152691c2220a7902a27a5a2a760b11b6020808301918252835180850190945260048452633844414f60e01b908401528151919291620000899160039162000118565b5080516200009f90600490602084019062000118565b505050620000bc620000b6620000c260201b60201c565b620000c6565b620001fb565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012690620001be565b90600052602060002090601f0160209004810192826200014a576000855562000195565b82601f106200016557805160ff191683800117855562000195565b8280016001018555821562000195579182015b828111156200019557825182559160200191906001019062000178565b50620001a3929150620001a7565b5090565b5b80821115620001a35760008155600101620001a8565b600181811c90821680620001d357607f821691505b60208210811415620001f557634e487b7160e01b600052602260045260246000fd5b50919050565b6122d4806200020b6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806390342c7a11610125578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610467578063e38b0dfe146104a0578063eec7b03c146104c0578063f2fde38b146104e2578063f84c91ab146104f557600080fd5b8063afca5a1214610432578063b3bb8cd414610445578063d2ef4d481461044b578063d5abeb011461045e57600080fd5b8063a153e708116100f4578063a153e708146103cc578063a3b77fbc146103ec578063a457c2d7146103ff578063a9059cbb14610412578063a92176be1461042557600080fd5b806390342c7a1461038b57806395d89b411461039e57806396d35a16146103a657806398a2ba0a146103b957600080fd5b806339509351116101a85780635dae0b0a116101775780635dae0b0a146103235780636fcf06f11461033657806370a082311461033f578063715018a6146103685780638da5cb5b1461037057600080fd5b806339509351146102c657806340c10f19146102d9578063500e68e9146102ec57806352e53ce71461031057600080fd5b80631ade6619116101e45780631ade66191461027c5780631cf1bb721461029157806323b872dd146102a4578063313ce567146102b757600080fd5b8063025f3d951461021657806306fdde031461023c578063095ea7b31461025157806318160ddd14610274575b600080fd5b610229610224366004611d88565b610508565b6040519081526020015b60405180910390f35b6102446105cc565b604051610233919061200d565b61026461025f366004611e12565b61065e565b6040519015158152602001610233565b600254610229565b61028f61028a366004611d88565b610676565b005b61022961029f366004611d88565b6107d1565b6102646102b2366004611dd6565b61098b565b60405160128152602001610233565b6102646102d4366004611e12565b610a06565b6102646102e7366004611e12565b610a45565b6102ff6102fa366004611d88565b610aa7565b60405161023395949392919061210b565b61028f61031e366004611e3c565b610b14565b61028f610331366004611e3c565b610d1f565b61022960065481565b61022961034d366004611d88565b6001600160a01b031660009081526020819052604090205490565b61028f610f00565b6005546040516001600160a01b039091168152602001610233565b61028f610399366004611ec4565b610f36565b6102446110ec565b61028f6103b4366004611f81565b6110fb565b61028f6103c7366004611f5f565b61112a565b6102296103da366004611d88565b600c6020526000908152604090205481565b61028f6103fa366004611f81565b611167565b61026461040d366004611e12565b6111bd565b610264610420366004611e12565b61124f565b6008546102649060ff1681565b61028f610440366004611f1a565b6112a3565b42610229565b61028f610459366004611d88565b61140d565b610229600a5481565b610229610475366004611da3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104b36104ae366004611d88565b611451565b6040516102339190611fd5565b6104d36104ce366004611f81565b6114bd565b60405161023393929190611fe8565b61028f6104f0366004611d88565b611535565b61028f610503366004611ec4565b6115d0565b6001600160a01b03811660009081526020819052604081205460085460ff16801561054a57506001600160a01b0383166000908152600c602052604090205415155b156105c657600061055a846107d1565b6001600160a01b0385166000908152600c602052604090205490915081116105c4576001600160a01b0384166000908152600c602052604081205461059f908361177b565b9050828110156105b8576105b3838261177b565b6105bb565b60005b95945050505050565b505b92915050565b6060600380546105db90612206565b80601f016020809104026020016040519081016040528092919081815260200182805461060790612206565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905090565b60003361066c81858561178e565b5060019392505050565b60085460ff166106835750565b4260065411156106905750565b6001600160a01b0381166000908152600b60205260409020546106b05750565b60005b6001600160a01b0382166000908152600b60205260409020548110156107cd576001600160a01b0382166000908152600b602052604081208054839081106106fd576106fd612272565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561078957600083815260096020526040902080544291908390811061075a5761075a612272565b90600052602060002001541161077257809150610777565b610789565b8061078181612241565b915050610721565b506000828152600960205260409020600101548111156107b85760008281526009602052604090206001018190555b505080806107c590612241565b9150506106b3565b5050565b60085460009060ff166107fa57506001600160a01b03166000908152600c602052604090205490565b42600654111561080c57506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561083557506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156105c4576001600160a01b0384166000908152600b6020526040812080548390811061088357610883612272565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561090f5760008381526009602052604090208054429190839081106108e0576108e0612272565b9060005260206000200154116108f8578091506108fd565b61090f565b8061090781612241565b9150506108a7565b506000828152600960205260409020600201546109749061096d90620186a0906109679061094890610942876001612196565b906118b2565b6001600160a01b038b166000908152600c6020526040902054906118b2565b906118be565b85906118ca565b93505050808061098390612241565b915050610839565b6001600160a01b0383166000908152600c60205260408120543390156109e5576109b485610676565b826109be86610508565b10156109e55760405162461bcd60e51b81526004016109dc906120c3565b60405180910390fd5b6109f08582856118d6565b6109fb858585611962565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061066c9082908690610a40908790612196565b61178e565b6005546000906001600160a01b03163314610a725760405162461bcd60e51b81526004016109dc9061208e565b600a5482610a7f60025490565b610a899190612196565b1115610a9457600080fd5b610a9e8383611b30565b50600192915050565b6000806000806060610ace866001600160a01b031660009081526020819052604090205490565b610ad787610508565b610ae0886107d1565b6001600160a01b0389166000908152600c6020526040902054610b028a611451565b939a9299509097509550909350915050565b6005546001600160a01b03163314610b3e5760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610b5e57610b5e612272565b60200260200101519050838281518110610b7a57610b7a612272565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610be657838281518110610bbf57610bbf612272565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c25576001600160a01b0381166000908152600b60205260408120610c2591611c61565b60005b8351811015610ce057600060096000868481518110610c4957610c49612272565b602002602001015181526020019081526020016000206000018054905011610c835760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b602052604090208451859083908110610caf57610caf612272565b6020908102919091018101518254600181018455600093845291909220015580610cd881612241565b915050610c28565b50610d0481858481518110610cf757610cf7612272565b6020026020010151610a45565b50508080610d1190612241565b915050610b41565b50505050565b6005546001600160a01b03163314610d495760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610d6957610d69612272565b60200260200101519050838281518110610d8557610d85612272565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610df157838281518110610dca57610dca612272565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610e30576001600160a01b0381166000908152600b60205260408120610e3091611c61565b60005b8351811015610eeb57600060096000868481518110610e5457610e54612272565b602002602001015181526020019081526020016000206000018054905011610e8e5760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b602052604090208451859083908110610eba57610eba612272565b6020908102919091018101518254600181018455600093845291909220015580610ee381612241565b915050610e33565b50508080610ef890612241565b915050610d4c565b6005546001600160a01b03163314610f2a5760405162461bcd60e51b81526004016109dc9061208e565b610f346000611c0f565b565b6005546001600160a01b03163314610f605760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610f8057610f80612272565b6020026020010151905083600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610fd2576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b602052604090205415611011576001600160a01b0381166000908152600b6020526040812061101191611c61565b60005b83518110156110cc5760006009600086848151811061103557611035612272565b60200260200101518152602001908152602001600020600001805490501161106f5760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b60205260409020845185908390811061109b5761109b612272565b60209081029190910181015182546001810184556000938452919092200155806110c481612241565b915050611014565b506110d78185610a45565b505080806110e490612241565b915050610f63565b6060600480546105db90612206565b6005546001600160a01b031633146111255760405162461bcd60e51b81526004016109dc9061208e565b600655565b6005546001600160a01b031633146111545760405162461bcd60e51b81526004016109dc9061208e565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146111915760405162461bcd60e51b81526004016109dc9061208e565b6000818152600960205260408120906111aa8282611c61565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112425760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109dc565b6109fb828686840361178e565b336000818152600c6020526040812054909190156112985761127081610676565b8261127a82610508565b10156112985760405162461bcd60e51b81526004016109dc906120c3565b61066c818585611962565b6005546001600160a01b031633146112cd5760405162461bcd60e51b81526004016109dc9061208e565b60075460009081526009602052604081206002018290555b82518110156113f357801561133c57826113006001836121ef565b8151811061131057611310612272565b602002602001015183828151811061132a5761132a612272565b60200260200101511161133c57600080fd5b6007546000908152600960205260409020835184908390811061136157611361612272565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b91908590849081106113ba576113ba612272565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806113eb81612241565b9150506112e5565b506007805490600061140483612241565b91905055505050565b6005546001600160a01b031633146114375760405162461bcd60e51b81526004016109dc9061208e565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156114b157602002820191906000526020600020905b81548152602001906001019080831161149d575b50505050509050919050565b600081815260096020908152604080832060018101546002820154825484518187028101870190955280855260609695869591859183018282801561152157602002820191906000526020600020905b81548152602001906001019080831161150d575b505050505092509250925092509193909250565b6005546001600160a01b0316331461155f5760405162461bcd60e51b81526004016109dc9061208e565b6001600160a01b0381166115c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b6115cd81611c0f565b50565b6005546001600160a01b031633146115fa5760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d1957600084828151811061161a5761161a612272565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461166c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b6020526040902054156116ab576001600160a01b0381166000908152600b602052604081206116ab91611c61565b60005b8351811015611766576000600960008684815181106116cf576116cf612272565b6020026020010151815260200190815260200160002060000180549050116117095760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b60205260409020845185908390811061173557611735612272565b602090810291909101810151825460018101845560009384529190922001558061175e81612241565b9150506116ae565b5050808061177390612241565b9150506115fd565b600061178782846121ef565b9392505050565b6001600160a01b0383166117f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109dc565b6001600160a01b0382166118515760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109dc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061178782846121d0565b600061178782846121ae565b60006117878284612196565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d1957818110156119555760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109dc565b610d19848484840361178e565b6001600160a01b0383166119c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b6001600160a01b038216611a285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dc565b6001600160a01b03831660009081526020819052604090205481811015611aa05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109dc565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ad7908490612196565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2391815260200190565b60405180910390a3610d19565b6001600160a01b038216611b865760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109dc565b8060026000828254611b989190612196565b90915550506001600160a01b03821660009081526020819052604081208054839290611bc5908490612196565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b50805460008255906000526020600020908101906115cd91905b80821115611c8f5760008155600101611c7b565b5090565b80356001600160a01b0381168114611caa57600080fd5b919050565b600082601f830112611cc057600080fd5b81356020611cd5611cd083612172565b612141565b80838252828201915082860187848660051b8901011115611cf557600080fd5b60005b85811015611d1b57611d0982611c93565b84529284019290840190600101611cf8565b5090979650505050505050565b600082601f830112611d3957600080fd5b81356020611d49611cd083612172565b80838252828201915082860187848660051b8901011115611d6957600080fd5b60005b85811015611d1b57813584529284019290840190600101611d6c565b600060208284031215611d9a57600080fd5b61178782611c93565b60008060408385031215611db657600080fd5b611dbf83611c93565b9150611dcd60208401611c93565b90509250929050565b600080600060608486031215611deb57600080fd5b611df484611c93565b9250611e0260208501611c93565b9150604084013590509250925092565b60008060408385031215611e2557600080fd5b611e2e83611c93565b946020939093013593505050565b600080600060608486031215611e5157600080fd5b833567ffffffffffffffff80821115611e6957600080fd5b611e7587838801611caf565b94506020860135915080821115611e8b57600080fd5b611e9787838801611d28565b93506040860135915080821115611ead57600080fd5b50611eba86828701611d28565b9150509250925092565b600080600060608486031215611ed957600080fd5b833567ffffffffffffffff80821115611ef157600080fd5b611efd87838801611caf565b9450602086013593506040860135915080821115611ead57600080fd5b60008060408385031215611f2d57600080fd5b823567ffffffffffffffff811115611f4457600080fd5b611f5085828601611d28565b95602094909401359450505050565b600060208284031215611f7157600080fd5b8135801515811461178757600080fd5b600060208284031215611f9357600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611fca57815187529582019590820190600101611fae565b509495945050505050565b6020815260006117876020830184611f9a565b606081526000611ffb6060830186611f9a565b60208301949094525060400152919050565b600060208083528351808285015260005b8181101561203a5785810183015185820160400152820161201e565b8181111561204c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a06080820152600061213660a0830184611f9a565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561216a5761216a612288565b604052919050565b600067ffffffffffffffff82111561218c5761218c612288565b5060051b60200190565b600082198211156121a9576121a961225c565b500190565b6000826121cb57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156121ea576121ea61225c565b500290565b6000828210156122015761220161225c565b500390565b600181811c9082168061221a57607f821691505b6020821081141561223b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122555761225561225c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212200761806454a63e28f306603ee5c3a05940deb024e858e995b1fa99a010750feb64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806390342c7a11610125578063afca5a12116100ad578063dd62ed3e1161007c578063dd62ed3e14610467578063e38b0dfe146104a0578063eec7b03c146104c0578063f2fde38b146104e2578063f84c91ab146104f557600080fd5b8063afca5a1214610432578063b3bb8cd414610445578063d2ef4d481461044b578063d5abeb011461045e57600080fd5b8063a153e708116100f4578063a153e708146103cc578063a3b77fbc146103ec578063a457c2d7146103ff578063a9059cbb14610412578063a92176be1461042557600080fd5b806390342c7a1461038b57806395d89b411461039e57806396d35a16146103a657806398a2ba0a146103b957600080fd5b806339509351116101a85780635dae0b0a116101775780635dae0b0a146103235780636fcf06f11461033657806370a082311461033f578063715018a6146103685780638da5cb5b1461037057600080fd5b806339509351146102c657806340c10f19146102d9578063500e68e9146102ec57806352e53ce71461031057600080fd5b80631ade6619116101e45780631ade66191461027c5780631cf1bb721461029157806323b872dd146102a4578063313ce567146102b757600080fd5b8063025f3d951461021657806306fdde031461023c578063095ea7b31461025157806318160ddd14610274575b600080fd5b610229610224366004611d88565b610508565b6040519081526020015b60405180910390f35b6102446105cc565b604051610233919061200d565b61026461025f366004611e12565b61065e565b6040519015158152602001610233565b600254610229565b61028f61028a366004611d88565b610676565b005b61022961029f366004611d88565b6107d1565b6102646102b2366004611dd6565b61098b565b60405160128152602001610233565b6102646102d4366004611e12565b610a06565b6102646102e7366004611e12565b610a45565b6102ff6102fa366004611d88565b610aa7565b60405161023395949392919061210b565b61028f61031e366004611e3c565b610b14565b61028f610331366004611e3c565b610d1f565b61022960065481565b61022961034d366004611d88565b6001600160a01b031660009081526020819052604090205490565b61028f610f00565b6005546040516001600160a01b039091168152602001610233565b61028f610399366004611ec4565b610f36565b6102446110ec565b61028f6103b4366004611f81565b6110fb565b61028f6103c7366004611f5f565b61112a565b6102296103da366004611d88565b600c6020526000908152604090205481565b61028f6103fa366004611f81565b611167565b61026461040d366004611e12565b6111bd565b610264610420366004611e12565b61124f565b6008546102649060ff1681565b61028f610440366004611f1a565b6112a3565b42610229565b61028f610459366004611d88565b61140d565b610229600a5481565b610229610475366004611da3565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6104b36104ae366004611d88565b611451565b6040516102339190611fd5565b6104d36104ce366004611f81565b6114bd565b60405161023393929190611fe8565b61028f6104f0366004611d88565b611535565b61028f610503366004611ec4565b6115d0565b6001600160a01b03811660009081526020819052604081205460085460ff16801561054a57506001600160a01b0383166000908152600c602052604090205415155b156105c657600061055a846107d1565b6001600160a01b0385166000908152600c602052604090205490915081116105c4576001600160a01b0384166000908152600c602052604081205461059f908361177b565b9050828110156105b8576105b3838261177b565b6105bb565b60005b95945050505050565b505b92915050565b6060600380546105db90612206565b80601f016020809104026020016040519081016040528092919081815260200182805461060790612206565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905090565b60003361066c81858561178e565b5060019392505050565b60085460ff166106835750565b4260065411156106905750565b6001600160a01b0381166000908152600b60205260409020546106b05750565b60005b6001600160a01b0382166000908152600b60205260409020548110156107cd576001600160a01b0382166000908152600b602052604081208054839081106106fd576106fd612272565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561078957600083815260096020526040902080544291908390811061075a5761075a612272565b90600052602060002001541161077257809150610777565b610789565b8061078181612241565b915050610721565b506000828152600960205260409020600101548111156107b85760008281526009602052604090206001018190555b505080806107c590612241565b9150506106b3565b5050565b60085460009060ff166107fa57506001600160a01b03166000908152600c602052604090205490565b42600654111561080c57506000919050565b6001600160a01b0382166000908152600b60205260409020546001111561083557506000919050565b6000805b6001600160a01b0384166000908152600b60205260409020548110156105c4576001600160a01b0384166000908152600b6020526040812080548390811061088357610883612272565b60009182526020808320909101548083526009909152604090912060010154909150805b60008381526009602052604090205481101561090f5760008381526009602052604090208054429190839081106108e0576108e0612272565b9060005260206000200154116108f8578091506108fd565b61090f565b8061090781612241565b9150506108a7565b506000828152600960205260409020600201546109749061096d90620186a0906109679061094890610942876001612196565b906118b2565b6001600160a01b038b166000908152600c6020526040902054906118b2565b906118be565b85906118ca565b93505050808061098390612241565b915050610839565b6001600160a01b0383166000908152600c60205260408120543390156109e5576109b485610676565b826109be86610508565b10156109e55760405162461bcd60e51b81526004016109dc906120c3565b60405180910390fd5b6109f08582856118d6565b6109fb858585611962565b506001949350505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061066c9082908690610a40908790612196565b61178e565b6005546000906001600160a01b03163314610a725760405162461bcd60e51b81526004016109dc9061208e565b600a5482610a7f60025490565b610a899190612196565b1115610a9457600080fd5b610a9e8383611b30565b50600192915050565b6000806000806060610ace866001600160a01b031660009081526020819052604090205490565b610ad787610508565b610ae0886107d1565b6001600160a01b0389166000908152600c6020526040902054610b028a611451565b939a9299509097509550909350915050565b6005546001600160a01b03163314610b3e5760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610b5e57610b5e612272565b60200260200101519050838281518110610b7a57610b7a612272565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610be657838281518110610bbf57610bbf612272565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610c25576001600160a01b0381166000908152600b60205260408120610c2591611c61565b60005b8351811015610ce057600060096000868481518110610c4957610c49612272565b602002602001015181526020019081526020016000206000018054905011610c835760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b602052604090208451859083908110610caf57610caf612272565b6020908102919091018101518254600181018455600093845291909220015580610cd881612241565b915050610c28565b50610d0481858481518110610cf757610cf7612272565b6020026020010151610a45565b50508080610d1190612241565b915050610b41565b50505050565b6005546001600160a01b03163314610d495760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610d6957610d69612272565b60200260200101519050838281518110610d8557610d85612272565b6020026020010151600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610df157838281518110610dca57610dca612272565b6020908102919091018101516001600160a01b0383166000908152600c9092526040909120555b6001600160a01b0381166000908152600b602052604090205415610e30576001600160a01b0381166000908152600b60205260408120610e3091611c61565b60005b8351811015610eeb57600060096000868481518110610e5457610e54612272565b602002602001015181526020019081526020016000206000018054905011610e8e5760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b602052604090208451859083908110610eba57610eba612272565b6020908102919091018101518254600181018455600093845291909220015580610ee381612241565b915050610e33565b50508080610ef890612241565b915050610d4c565b6005546001600160a01b03163314610f2a5760405162461bcd60e51b81526004016109dc9061208e565b610f346000611c0f565b565b6005546001600160a01b03163314610f605760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d19576000848281518110610f8057610f80612272565b6020026020010151905083600c6000836001600160a01b03166001600160a01b031681526020019081526020016000205414610fd2576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b602052604090205415611011576001600160a01b0381166000908152600b6020526040812061101191611c61565b60005b83518110156110cc5760006009600086848151811061103557611035612272565b60200260200101518152602001908152602001600020600001805490501161106f5760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b60205260409020845185908390811061109b5761109b612272565b60209081029190910181015182546001810184556000938452919092200155806110c481612241565b915050611014565b506110d78185610a45565b505080806110e490612241565b915050610f63565b6060600480546105db90612206565b6005546001600160a01b031633146111255760405162461bcd60e51b81526004016109dc9061208e565b600655565b6005546001600160a01b031633146111545760405162461bcd60e51b81526004016109dc9061208e565b6008805460ff1916911515919091179055565b6005546001600160a01b031633146111915760405162461bcd60e51b81526004016109dc9061208e565b6000818152600960205260408120906111aa8282611c61565b5060006001820181905560029091015550565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156112425760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016109dc565b6109fb828686840361178e565b336000818152600c6020526040812054909190156112985761127081610676565b8261127a82610508565b10156112985760405162461bcd60e51b81526004016109dc906120c3565b61066c818585611962565b6005546001600160a01b031633146112cd5760405162461bcd60e51b81526004016109dc9061208e565b60075460009081526009602052604081206002018290555b82518110156113f357801561133c57826113006001836121ef565b8151811061131057611310612272565b602002602001015183828151811061132a5761132a612272565b60200260200101511161133c57600080fd5b6007546000908152600960205260409020835184908390811061136157611361612272565b6020908102919091018101518254600181018455600093845291909220015560075483517f09c299dbbbb2b82211c7b619f1feb7f8d8851ade84657e189042ce850500697b91908590849081106113ba576113ba612272565b6020908102919091018101516040805193845291830152810184905260600160405180910390a1806113eb81612241565b9150506112e5565b506007805490600061140483612241565b91905055505050565b6005546001600160a01b031633146114375760405162461bcd60e51b81526004016109dc9061208e565b6001600160a01b03166000908152600c6020526040812055565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156114b157602002820191906000526020600020905b81548152602001906001019080831161149d575b50505050509050919050565b600081815260096020908152604080832060018101546002820154825484518187028101870190955280855260609695869591859183018282801561152157602002820191906000526020600020905b81548152602001906001019080831161150d575b505050505092509250925092509193909250565b6005546001600160a01b0316331461155f5760405162461bcd60e51b81526004016109dc9061208e565b6001600160a01b0381166115c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109dc565b6115cd81611c0f565b50565b6005546001600160a01b031633146115fa5760405162461bcd60e51b81526004016109dc9061208e565b60005b8351811015610d1957600084828151811061161a5761161a612272565b6020026020010151905083600c6000836001600160a01b03166001600160a01b03168152602001908152602001600020541461166c576001600160a01b0381166000908152600c602052604090208490555b6001600160a01b0381166000908152600b6020526040902054156116ab576001600160a01b0381166000908152600b602052604081206116ab91611c61565b60005b8351811015611766576000600960008684815181106116cf576116cf612272565b6020026020010151815260200190815260200160002060000180549050116117095760405162461bcd60e51b81526004016109dc90612062565b6001600160a01b0382166000908152600b60205260409020845185908390811061173557611735612272565b602090810291909101810151825460018101845560009384529190922001558061175e81612241565b9150506116ae565b5050808061177390612241565b9150506115fd565b600061178782846121ef565b9392505050565b6001600160a01b0383166117f05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109dc565b6001600160a01b0382166118515760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109dc565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061178782846121d0565b600061178782846121ae565b60006117878284612196565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610d1957818110156119555760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109dc565b610d19848484840361178e565b6001600160a01b0383166119c65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109dc565b6001600160a01b038216611a285760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109dc565b6001600160a01b03831660009081526020819052604090205481811015611aa05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016109dc565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611ad7908490612196565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b2391815260200190565b60405180910390a3610d19565b6001600160a01b038216611b865760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109dc565b8060026000828254611b989190612196565b90915550506001600160a01b03821660009081526020819052604081208054839290611bc5908490612196565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b50805460008255906000526020600020908101906115cd91905b80821115611c8f5760008155600101611c7b565b5090565b80356001600160a01b0381168114611caa57600080fd5b919050565b600082601f830112611cc057600080fd5b81356020611cd5611cd083612172565b612141565b80838252828201915082860187848660051b8901011115611cf557600080fd5b60005b85811015611d1b57611d0982611c93565b84529284019290840190600101611cf8565b5090979650505050505050565b600082601f830112611d3957600080fd5b81356020611d49611cd083612172565b80838252828201915082860187848660051b8901011115611d6957600080fd5b60005b85811015611d1b57813584529284019290840190600101611d6c565b600060208284031215611d9a57600080fd5b61178782611c93565b60008060408385031215611db657600080fd5b611dbf83611c93565b9150611dcd60208401611c93565b90509250929050565b600080600060608486031215611deb57600080fd5b611df484611c93565b9250611e0260208501611c93565b9150604084013590509250925092565b60008060408385031215611e2557600080fd5b611e2e83611c93565b946020939093013593505050565b600080600060608486031215611e5157600080fd5b833567ffffffffffffffff80821115611e6957600080fd5b611e7587838801611caf565b94506020860135915080821115611e8b57600080fd5b611e9787838801611d28565b93506040860135915080821115611ead57600080fd5b50611eba86828701611d28565b9150509250925092565b600080600060608486031215611ed957600080fd5b833567ffffffffffffffff80821115611ef157600080fd5b611efd87838801611caf565b9450602086013593506040860135915080821115611ead57600080fd5b60008060408385031215611f2d57600080fd5b823567ffffffffffffffff811115611f4457600080fd5b611f5085828601611d28565b95602094909401359450505050565b600060208284031215611f7157600080fd5b8135801515811461178757600080fd5b600060208284031215611f9357600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611fca57815187529582019590820190600101611fae565b509495945050505050565b6020815260006117876020830184611f9a565b606081526000611ffb6060830186611f9a565b60208301949094525060400152919050565b600060208083528351808285015260005b8181101561203a5785810183015185820160400152820161201e565b8181111561204c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601290820152711ddbdc9ad99b1bddc81b9bdd08195e1a5cdd60721b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f5472616e7366657220616d6f756e742065786365656420746865206c6f636b656040820152671908185b5bdd5b9d60c21b606082015260800190565b85815284602082015283604082015282606082015260a06080820152600061213660a0830184611f9a565b979650505050505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561216a5761216a612288565b604052919050565b600067ffffffffffffffff82111561218c5761218c612288565b5060051b60200190565b600082198211156121a9576121a961225c565b500190565b6000826121cb57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156121ea576121ea61225c565b500290565b6000828210156122015761220161225c565b500390565b600181811c9082168061221a57607f821691505b6020821081141561223b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156122555761225561225c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212200761806454a63e28f306603ee5c3a05940deb024e858e995b1fa99a010750feb64736f6c63430008070033

Deployed Bytecode Sourcemap

27112:10913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29522:646;;;;;;:::i;:::-;;:::i;:::-;;;11915:25:1;;;11903:2;11888:18;29522:646: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;;36854:1168;;;;;;:::i;:::-;;:::i;:::-;;30637:1387;;;;;;:::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;36622:224::-;;;;;;:::i;:::-;;:::i;29075:439::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;33170:880::-;;;;;;:::i;:::-;;:::i;32324: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;34058:859:0;;;;;;:::i;:::-;;:::i;6893:104::-;;;:::i;32202:114::-;;;;;;:::i;:::-;;:::i;35753:84::-;;;;;;:::i;:::-;;:::i;27649:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;36505:109;;;;;;:::i;:::-;;:::i;11253:438::-;;;;;;:::i;:::-;;:::i;28035:483::-;;;;;;:::i;:::-;;:::i;27395:29::-;;;;;;;;;35946:551;;;;;;:::i;:::-;;:::i;30176:87::-;30240:15;30176:87;;35845:93;;;;;;:::i;:::-;;:::i;27540:42::-;;;;;;8554:151;;;;;;:::i;:::-;-1:-1:-1;;;;;8670:18:0;;;8643:7;8670:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8554:151;32032:162;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30271:358::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;19436:201::-;;;;;;:::i;:::-;;:::i;34925:820::-;;;;;;:::i;:::-;;:::i;29522:646::-;-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:646;-1:-1:-1;;;;;29522:646:0:o;29773:352::-;29696:440;29652:484;30153:7;29522:646;-1:-1:-1;;29522:646: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;36854:1168::-;36926:10;;;;36921:50;;36854:1168;:::o;36921:50::-;37004:15;36985:16;;:34;36981:73;;;36854:1168;:::o;36981:73::-;-1:-1:-1;;;;;37068:23:0;;37102:1;37068:23;;;:15;:23;;;;;:30;37064:74;;36854:1168;:::o;37064:74::-;37155:9;37150:848;-1:-1:-1;;;;;37174:23:0;;;;;;:15;:23;;;;;:30;37170:34;;37150:848;;;-1:-1:-1;;;;;37248:23:0;;37226:19;37248:23;;;:15;:23;;;;;:26;;37272:1;;37248:26;;;;;;:::i;:::-;;;;;;;;;;;;;37320:22;;;:9;:22;;;;;;;:28;;;37248:26;;-1:-1:-1;37320:28:0;37365:465;37459:22;;;;:9;:22;;;;;:42;37451:50;;37365:465;;;37588:22;;;;:9;:22;;;;;:42;;37655:15;;37588:22;37624:5;;37588:42;;;;;;:::i;:::-;;;;;;;;;:82;37562:253;;37736:5;37713:28;;37562:253;;;37790:5;;37562:253;37520:7;;;;:::i;:::-;;;;37365:465;;;-1:-1:-1;37871:22:0;;;;:9;:22;;;;;:28;;;37848:51;;37844:143;;;37920:22;;;;:9;:22;;;;;:28;;:51;;;37844:143;37211:787;;37206:3;;;;;:::i;:::-;;;;37150:848;;;;36854:1168;:::o;30637:1387::-;30723:10;;30698:7;;30723:10;;30718:71;;-1:-1:-1;;;;;;30757:20:0;;;;;:12;:20;;;;;;;30637:1387::o;30718:71::-;30822:15;30803:16;;:34;30799:75;;;-1:-1:-1;30861:1:0;;30637:1387;-1:-1:-1;30637:1387:0:o;30799:75::-;-1:-1:-1;;;;;30888:23:0;;;;;;:15;:23;;;;;:30;30921:1;-1:-1:-1;30884:75:0;;;-1:-1:-1;30946:1:0;;30637:1387;-1:-1:-1;30637:1387:0:o;30884:75::-;30969:16;31005:9;31000:991;-1:-1:-1;;;;;31024:23:0;;;;;;:15;:23;;;;;:30;31020:34;;31000:991;;;-1:-1:-1;;;;;31098:23:0;;31076:19;31098:23;;;:15;:23;;;;;:26;;31122:1;;31098:26;;;;;;:::i;:::-;;;;;;;;;;;;;31162:22;;;:9;:22;;;;;;;:28;;;31098:26;;-1:-1:-1;31162:28:0;31207:457;31301:22;;;;:9;:22;;;;;:42;31293:50;;31207:457;;;31430:22;;;;:9;:22;;;;;:42;;31497:15;;31430:22;31466:5;;31430:42;;;;;;:::i;:::-;;;;;;;;;:82;31404:245;;31570:5;31555:20;;31404:245;;;31624:5;;31404:245;31362:7;;;;:::i;:::-;;;;31207:457;;;-1:-1:-1;31846:22:0;;;;:9;:22;;;;;:34;;;31689:290;;31720:244;;31957:6;;31720:210;;31793:114;;31794:16;:12;31809:1;31794:16;:::i;:::-;31793:22;;:114::i;:::-;-1:-1:-1;;;;;31720:20:0;;;;;;:12;:20;;;;;;;:46;:210::i;:::-;:236;;:244::i;:::-;31689:8;;:12;:290::i;:::-;31678:301;;31061:930;;31056:3;;;;;:::i;:::-;;;;31000:991;;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;36622:224::-;18600:6;;36719:4;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;36776:9:::1;;36765:7;36749:13;7882:12:::0;;;7794:108;36749:13:::1;:23;;;;:::i;:::-;:36;;36741:45;;;::::0;::::1;;36797:19;36803:3;36808:7;36797:5;:19::i;:::-;-1:-1:-1::0;36834:4:0::1;36622: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;33170:880::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;33350:9:::1;33345:698;33369:7;:14;33365:1;:18;33345:698;;;33405:14;33422:7;33430:1;33422:10;;;;;;;;:::i;:::-;;;;;;;33405:27;;33475:11;33487:1;33475:14;;;;;;;;:::i;:::-;;;;;;;33451:12;:20;33464:6;-1:-1:-1::0;;;;;33451:20:0::1;-1:-1:-1::0;;;;;33451:20:0::1;;;;;;;;;;;;;:38;33447:116;;33533:11;33545:1;33533:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33510:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;33447:116:::1;-1:-1:-1::0;;;;;33581:23:0;::::1;33614:1;33581:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;33577:105:::1;;-1:-1:-1::0;;;;;33643:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33636:30:::1;::::0;::::1;:::i;:::-;33701:9;33696:293;33720:12;:19;33716:1;:23;33696:293;;;33844:1;33795:9;:26;33805:12;33818:1;33805:15;;;;;;;;:::i;:::-;;;;;;;33795:26;;;;;;;;;;;:39;;:46;;;;:50;33765:142;;;;-1:-1:-1::0;;;33765:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33928:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33957:15;;:12;;33970:1;;33957:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33928:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33928:45:0;;;;;;;::::1;::::0;33741:3;::::1;::::0;::::1;:::i;:::-;;;;33696:293;;;;34003:28;34008:6;34016:11;34028:1;34016:14;;;;;;;;:::i;:::-;;;;;;;34003:4;:28::i;:::-;;33390:653;33385:3;;;;;:::i;:::-;;;;33345:698;;;;33170:880:::0;;;:::o;32324:838::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32505:9:::1;32500:655;32524:7;:14;32520:1;:18;32500:655;;;32560:14;32577:7;32585:1;32577:10;;;;;;;;:::i;:::-;;;;;;;32560:27;;32630:11;32642:1;32630:14;;;;;;;;:::i;:::-;;;;;;;32606:12;:20;32619:6;-1:-1:-1::0;;;;;32606:20:0::1;-1:-1:-1::0;;;;;32606:20:0::1;;;;;;;;;;;;;:38;32602:116;;32688:11;32700:1;32688:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;32665:20:0;::::1;;::::0;;;:12:::1;:20:::0;;;;;;;:37;32602:116:::1;-1:-1:-1::0;;;;;32736:23:0;::::1;32769:1;32736:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;32732:105:::1;;-1:-1:-1::0;;;;;32798:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;32791:30:::1;::::0;::::1;:::i;:::-;32856:9;32851:293;32875:12;:19;32871:1;:23;32851:293;;;32999:1;32950:9;:26;32960:12;32973:1;32960:15;;;;;;;;:::i;:::-;;;;;;;32950:26;;;;;;;;;;;:39;;:46;;;;:50;32920:142;;;;-1:-1:-1::0;;;32920:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33083:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;33112:15;;:12;;33125:1;;33112:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;33083:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;33083:45:0;;;;;;;::::1;::::0;32896:3;::::1;::::0;::::1;:::i;:::-;;;;32851:293;;;;32545:610;32540:3;;;;;:::i;:::-;;;;32500: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;34058:859::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;34229:9:::1;34224:686;34248:7;:14;34244:1;:18;34224:686;;;34284:14;34301:7;34309:1;34301:10;;;;;;;;:::i;:::-;;;;;;;34284:27;;34354:10;34330:12;:20;34343:6;-1:-1:-1::0;;;;;34330:20:0::1;-1:-1:-1::0;;;;;34330:20:0::1;;;;;;;;;;;;;:34;34326:108;;-1:-1:-1::0;;;;;34385:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:33;;;34326:108:::1;-1:-1:-1::0;;;;;34452:23:0;::::1;34485:1;34452:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;34448:105:::1;;-1:-1:-1::0;;;;;34514:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34507:30:::1;::::0;::::1;:::i;:::-;34572:9;34567:293;34591:12;:19;34587:1;:23;34567:293;;;34715:1;34666:9;:26;34676:12;34689:1;34676:15;;;;;;;;:::i;:::-;;;;;;;34666:26;;;;;;;;;;;:39;;:46;;;;:50;34636:142;;;;-1:-1:-1::0;;;34636:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34799:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;34828:15;;:12;;34841:1;;34828:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;34799:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;34799:45:0;;;;;;;::::1;::::0;34612:3;::::1;::::0;::::1;:::i;:::-;;;;34567:293;;;;34874:24;34879:6;34887:10;34874:4;:24::i;:::-;;34269:641;34264:3;;;;;:::i;:::-;;;;34224:686;;6893:104:::0;6949:13;6982:7;6975:14;;;;;:::i;32202:114::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;32279:16:::1;:29:::0;32202:114::o;35753:84::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35811:10:::1;:18:::0;;-1:-1:-1;;35811:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35753:84::o;36505:109::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;36585:21:::1;::::0;;;:9:::1;:21;::::0;;;;;36578:28:::1;36585:21:::0;;36578:28:::1;:::i;:::-;-1:-1:-1::0;36578:28:0::1;;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;36505: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;35946:551::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;36088:13:::1;::::0;36078:24:::1;::::0;;;:9:::1;:24;::::0;;;;:36:::1;;:51:::0;;;36140:324:::1;36164:13;:20;36160:1;:24;36140:324;;;36210:5:::0;;36206:94:::1;;36263:13:::0;36277:5:::1;36281:1;36277::::0;:5:::1;:::i;:::-;36263:20;;;;;;;;:::i;:::-;;;;;;;36244:13;36258:1;36244:16;;;;;;;;:::i;:::-;;;;;;;:39;36236:48;;;::::0;::::1;;36324:13;::::0;36314:24:::1;::::0;;;:9:::1;:24;::::0;;;;36357:16;;:13;;36371:1;;36357:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;36314:60;;::::1;::::0;::::1;::::0;;-1:-1:-1;36314:60:0;;;;;;;::::1;::::0;36406:13:::1;::::0;36421:16;;36394:58:::1;::::0;36406:13;36421;;36435:1;;36421:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;36394:58:::1;::::0;;12153:25:1;;;12194:18;;;12187:34;12237:18;;12230:34;;;12141:2;12126:18;36394:58:0::1;;;;;;;36186:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36140:324;;;-1:-1:-1::0;36474:13:0::1;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;;;;;;35946:551:::0;;:::o;35845: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;;;;;35906:20:0::1;35929:1;35906:20:::0;;;:12:::1;:20;::::0;;;;:24;35845:93::o;32032:162::-;-1:-1:-1;;;;;32163:23:0;;;;;;:15;:23;;;;;;;;;32156:30;;;;;;;;;;;;;;;;;32122:16;;32156:30;;;32163:23;32156:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32032:162;;;:::o;30271:358::-;30407:7;30486:21;;;:9;:21;;;;;;;;30535:27;;;;30577:33;;;;30464:157;;;;;;;;;;;;;;;;;30376:16;;30407:7;;;30464:157;30486:21;;30464:157;;30486:21;30464:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30271: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;34925:820::-;18600:6;;-1:-1:-1;;;;;18600:6:0;4398:10;18747:23;18739:68;;;;-1:-1:-1;;;18739:68:0;;;;;;;:::i;:::-;35096:9:::1;35091:647;35115:7;:14;35111:1;:18;35091:647;;;35151:14;35168:7;35176:1;35168:10;;;;;;;;:::i;:::-;;;;;;;35151:27;;35221:10;35197:12;:20;35210:6;-1:-1:-1::0;;;;;35197:20:0::1;-1:-1:-1::0;;;;;35197:20:0::1;;;;;;;;;;;;;:34;35193:108;;-1:-1:-1::0;;;;;35252:20:0;::::1;;::::0;;;:12:::1;:20;::::0;;;;:33;;;35193:108:::1;-1:-1:-1::0;;;;;35319:23:0;::::1;35352:1;35319:23:::0;;;:15:::1;:23;::::0;;;;:30;:34;35315:105:::1;;-1:-1:-1::0;;;;;35381:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;35374:30:::1;::::0;::::1;:::i;:::-;35439:9;35434:293;35458:12;:19;35454:1;:23;35434:293;;;35582:1;35533:9;:26;35543:12;35556:1;35543:15;;;;;;;;:::i;:::-;;;;;;;35533:26;;;;;;;;;;;:39;;:46;;;;:50;35503:142;;;;-1:-1:-1::0;;;35503:142:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35666:23:0;::::1;;::::0;;;:15:::1;:23;::::0;;;;35695:15;;:12;;35708:1;;35695:15;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;35666:45;;::::1;::::0;::::1;::::0;;-1:-1:-1;35666:45:0;;;;;;;::::1;::::0;35479:3;::::1;::::0;::::1;:::i;:::-;;;;35434:293;;;;35136:602;35131:3;;;;;:::i;:::-;;;;35091:647;;23236:98:::0;23294:7;23321:5;23325:1;23321;:5;:::i;:::-;23314:12;23236:98;-1:-1:-1;;;23236:98:0:o;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;;;;;;;37150:848;36854:1168;:::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://0761806454a63e28f306603ee5c3a05940deb024e858e995b1fa99a010750feb
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.