Token THANKQ

 

Overview [ERC-20]

Max Total Supply:
3,000,000,000 TQP

Holders:
19 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

THANKQ protocol is a protocol for e-commerce payment and point systems. It is a point (coupon) exchange/integrated payment platform that applies blockchain technology to pursue a new ecosystem in the corporate point and coupon market.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
THANKQ

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-08
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library SafeMath {
    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);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

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

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

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

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

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

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

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

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

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract Lockable is Context {
    event Locked(address account);
    event Unlocked(address account);

    event Freezed();
    event UnFreezed();

    bool public _freezed;
    mapping(address => bool) private _locked;

    modifier validFreeze {
        require(_freezed == false, "ERC20: all token is freezed");
        _;
    }

    function _freeze() internal virtual {
        _freezed = true;
        emit Freezed();
    }

    function _unfreeze() internal virtual {
        _freezed = false;
        emit UnFreezed();
    }

    function locked(address _to) public view returns (bool) {
        return _locked[_to];
    }

    function _lock(address to) internal virtual {
        require(to != address(0), "ERC20: lock to the zero address");

        _locked[to] = true;
        emit Locked(to);
    }

    function _unlock(address to) internal virtual {
        require(to != address(0), "ERC20: lock to the zero address");

        _locked[to] = false;
        emit Unlocked(to);
    }
}

contract ERC20Base is Context, ERC20, Ownable, Lockable {
    uint constant SECONDS_PER_DAY = 24 * 60 * 60;
    uint constant SECONDS_PER_HOUR = 60 * 60;
    uint constant SECONDS_PER_MINUTE = 60;

     // Info of each pool.
    struct LockInfo {
        uint256 total;
        uint256 freezeTime;
        uint256 freezeRatio;
        uint256 releaseRatio;
        uint256 releaseAmount;
        uint256 duration;
        uint256 nextTime;
    }

    mapping (address => LockInfo) private _lockInfos;
    mapping (address => bool) public _manualEntity;

    string internal constant TOKEN_LOCKED = "ERC20: Tokens is locked";

    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_){}

    function mint(address account, uint256 amount) internal virtual onlyOwner {
        _mint(account, amount);
    }

    function allFreeze() public onlyOwner {
        _freeze();
    }

    function allUnFreeze() public onlyOwner {
        _unfreeze();
    }

    function lock(address to) public onlyOwner {
        _lock(to);
    }

    function unlock(address to) public onlyOwner {
        _unlock(to);
    }

    function _addDays(uint256 timestamp, uint256 _days) internal pure returns(uint256 newTimestamp) {
        newTimestamp = timestamp + _days * SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }

    function _addHours(uint256 timestamp, uint256 _hours) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
        require(newTimestamp >= timestamp);
    }

    function _addMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp >= timestamp);
    }
    function _addSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) {
        newTimestamp = timestamp + _seconds;
        require(newTimestamp >= timestamp);
    }

    function _updateTokenLockInfo() internal returns(LockInfo memory) {
        bool isEntity = _manualEntity[msg.sender];
        require(isEntity == true, "ERC20: There is not lockinfo");

        LockInfo storage li = _lockInfos[msg.sender];
        if(li.nextTime < block.timestamp && li.releaseRatio < 100) {
            li.nextTime = _addHours(li.nextTime, li.duration);
            li.releaseRatio += li.freezeRatio;
            li.releaseAmount += (li.total * li.freezeRatio) / 100;

            if(li.releaseRatio > 100){
                li.releaseRatio = 100;
                li.releaseAmount = li.total;
            }
        }

        return _lockInfos[msg.sender];
    }

    function tokensLockedAtTime(address to, uint256 amount, uint256 time, uint256 ratio, uint256 duration) public onlyOwner {
        require(to != address(0), "ERC20: lock to the zero address");
        require(amount > 0, "ERC20: amount is over zero");
        require(time > block.timestamp, "TimeLock: lock time is over current time");
        require(amount <= balanceOf(to), "TimeLock: lock time amount exceeds balance");

        bool isEntity = _manualEntity[to];
        if(!isEntity) {
            _manualEntity[to] = true;
            _lockInfos[to] = LockInfo(amount, time, ratio, 0, 0, duration, time);
        }
    }

    function getTokensLockedInfo(address to) public view returns(LockInfo memory) {
        require(to != address(0), "ERC20: lock to the zero address");
        bool isEntity = _manualEntity[to];
        require(isEntity == true, "TimeLock: There is not lockinfo");
        
        return _lockInfos[to];
    }

    function transferFrom(address from,
        address to,
        uint256 amount
    ) public 
    validFreeze 
    virtual override returns (bool) { 
        require(locked(from) == false, TOKEN_LOCKED);

        bool isEntity = _manualEntity[from];
        if(isEntity) {
            _updateTokenLockInfo();

            LockInfo storage li = _lockInfos[from];
            require(li.releaseRatio > 0, "TimeLock : Please wait to release");
            require(li.releaseAmount >= amount, "TimeLock : Please check release amount");
        }

        bool rst = super.transferFrom(from, to, amount);
        if(!rst) {
            revert();
        }

        if(isEntity) {
            LockInfo storage li = _lockInfos[msg.sender];
            li.releaseAmount -= amount;
        }

        return rst;
    }

    function transfer(address to, uint256 amount) 
    public
    validFreeze 
    virtual override returns (bool) {
        require(locked(msg.sender) == false, TOKEN_LOCKED);

        bool isEntity = _manualEntity[msg.sender];
        if(isEntity) {
            _updateTokenLockInfo();

            LockInfo storage li = _lockInfos[msg.sender];
            require(li.releaseRatio > 0, "TimeLock : Please wait to release");
            require(li.releaseAmount >= amount, "TimeLock : Please check release amount");
        }

        bool rst = super.transfer(to, amount);
        if(!rst) {
            revert();
        }

        if(isEntity) {
            LockInfo storage li = _lockInfos[msg.sender];
            li.releaseAmount -= amount;
        }

        return rst;
    }
}

contract THANKQ is ERC20Base {
    constructor() ERC20Base("THANKQ", "TQP") {
        mint(msg.sender, 30*(10**8)*(10**uint256(decimals())));
    }
}

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":[],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Locked","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"},{"anonymous":false,"inputs":[],"name":"UnFreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"_freezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_manualEntity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allFreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allUnFreeze","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":[],"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":"address","name":"to","type":"address"}],"name":"getTokensLockedInfo","outputs":[{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"freezeTime","type":"uint256"},{"internalType":"uint256","name":"freezeRatio","type":"uint256"},{"internalType":"uint256","name":"releaseRatio","type":"uint256"},{"internalType":"uint256","name":"releaseAmount","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"nextTime","type":"uint256"}],"internalType":"struct ERC20Base.LockInfo","name":"","type":"tuple"}],"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":[{"internalType":"address","name":"to","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"tokensLockedAtTime","outputs":[],"stateMutability":"nonpayable","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":"to","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060068152602001655448414e4b5160d01b8152506040518060400160405280600381526020016205451560ec1b815250818181600390805190602001906200006792919062000279565b5080516200007d90600490602084019062000279565b5050506200009a62000094620000cc60201b60201c565b620000d0565b50620000c6905033620000b06012600a62000383565b620000c09063b2d05e006200044e565b62000122565b620004c3565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6200018e828262000192565b5050565b6001600160a01b038216620001ea5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000179565b8060026000828254620001fe91906200031f565b90915550506001600160a01b038216600090815260208190526040812080548392906200022d9084906200031f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36200018e565b828054620002879062000470565b90600052602060002090601f016020900481019282620002ab5760008555620002f6565b82601f10620002c657805160ff1916838001178555620002f6565b82800160010185558215620002f6579182015b82811115620002f6578251825591602001919060010190620002d9565b506200030492915062000308565b5090565b5b8082111562000304576000815560010162000309565b60008219821115620003355762000335620004ad565b500190565b600181815b808511156200037b5781600019048211156200035f576200035f620004ad565b808516156200036d57918102915b93841c93908002906200033f565b509250929050565b600062000391838362000398565b9392505050565b600082620003a95750600162000448565b81620003b85750600062000448565b8160018114620003d15760028114620003dc57620003fc565b600191505062000448565b60ff841115620003f057620003f0620004ad565b50506001821b62000448565b5060208310610133831016604e8410600b841016171562000421575081810a62000448565b6200042d83836200033a565b8060001904821115620004445762000444620004ad565b0290505b92915050565b60008160001904831182151516156200046b576200046b620004ad565b500290565b600181811c908216806200048557607f821691505b60208210811415620004a757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6117fa80620004d36000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063abdf636a1161007c578063abdf636a146102af578063cbf9fe5f146102c3578063dd62ed3e146102ef578063f2b1d8c214610302578063f2fde38b1461036b578063f435f5a71461037e57600080fd5b80638da5cb5b146102305780638ff759f31461024b57806390e16f281461026e57806395d89b4114610281578063a457c2d714610289578063a9059cbb1461029c57600080fd5b80632f6c493c116101155780632f6c493c146101c2578063313ce567146101d557806339509351146101e457806370a08231146101f7578063715018a614610220578063780f0e351461022857600080fd5b806306fdde0314610152578063095ea7b31461017057806318160ddd1461019357806321be8a55146101a557806323b872dd146101af575b600080fd5b61015a610391565b60405161016791906115bb565b60405180910390f35b61018361017e36600461154f565b610423565b6040519015158152602001610167565b6002545b604051908152602001610167565b6101ad61043d565b005b6101836101bd366004611513565b61047a565b6101ad6101d03660046114be565b61061e565b60405160128152602001610167565b6101836101f236600461154f565b610654565b6101976102053660046114be565b6001600160a01b031660009081526020819052604090205490565b6101ad610676565b6101ad6106aa565b6005546040516001600160a01b039091168152602001610167565b6101836102593660046114be565b60086020526000908152604090205460ff1681565b6101ad61027c366004611579565b6106dc565b61015a610918565b61018361029736600461154f565b610927565b6101836102aa36600461154f565b6109ad565b60055461018390600160a01b900460ff1681565b6101836102d13660046114be565b6001600160a01b031660009081526006602052604090205460ff1690565b6101976102fd3660046114e0565b610b34565b6103156103103660046114be565b610b5f565b6040516101679190600060e082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b6101ad6103793660046114be565b610ca0565b6101ad61038c3660046114be565b610d38565b6060600380546103a090611773565b80601f01602080910402602001604051908101604052809291908181526020018280546103cc90611773565b80156104195780601f106103ee57610100808354040283529160200191610419565b820191906000526020600020905b8154815290600101906020018083116103fc57829003601f168201915b5050505050905090565b600033610431818585610d6b565b60019150505b92915050565b6005546001600160a01b031633146104705760405162461bcd60e51b815260040161046790611656565b60405180910390fd5b610478610e8f565b565b600554600090600160a01b900460ff16156104d75760405162461bcd60e51b815260206004820152601b60248201527f45524332303a20616c6c20746f6b656e20697320667265657a656400000000006044820152606401610467565b6001600160a01b03841660009081526006602052604090205460ff16604080518082019091526017815276115490cc8c0e88151bdad95b9cc81a5cc81b1bd8dad959604a1b602082015290156105405760405162461bcd60e51b815260040161046791906115bb565b506001600160a01b03841660009081526008602052604090205460ff1680156105cb5761056b610ec7565b506001600160a01b038516600090815260076020526040902060038101546105a55760405162461bcd60e51b8152600401610467906116c2565b83816004015410156105c95760405162461bcd60e51b815260040161046790611610565b505b60006105d8868686611084565b9050806105e457600080fd5b8115610615573360009081526007602052604081206004810180549192879261060e90849061175c565b9091555050505b95945050505050565b6005546001600160a01b031633146106485760405162461bcd60e51b815260040161046790611656565b6106518161109d565b50565b6000336104318185856106678383610b34565b6106719190611703565b610d6b565b6005546001600160a01b031633146106a05760405162461bcd60e51b815260040161046790611656565b610478600061111b565b6005546001600160a01b031633146106d45760405162461bcd60e51b815260040161046790611656565b61047861116d565b6005546001600160a01b031633146107065760405162461bcd60e51b815260040161046790611656565b6001600160a01b03851661072c5760405162461bcd60e51b81526004016104679061168b565b6000841161077c5760405162461bcd60e51b815260206004820152601a60248201527f45524332303a20616d6f756e74206973206f766572207a65726f0000000000006044820152606401610467565b4283116107dc5760405162461bcd60e51b815260206004820152602860248201527f54696d654c6f636b3a206c6f636b2074696d65206973206f7665722063757272604482015267656e742074696d6560c01b6064820152608401610467565b6001600160a01b0385166000908152602081905260409020548411156108575760405162461bcd60e51b815260206004820152602a60248201527f54696d654c6f636b3a206c6f636b2074696d6520616d6f756e7420657863656560448201526964732062616c616e636560b01b6064820152608401610467565b6001600160a01b03851660009081526008602052604090205460ff1680610910576001600160a01b0386166000818152600860209081526040808320805460ff19166001908117909155815160e0810183528a81528084018a81528184018a8152606083018781526080840188815260a085018c815260c086018f81529a8a5260079098529590972092518355905192820192909255905160028201559251600384015551600483015551600582015590516006909101555b505050505050565b6060600480546103a090611773565b600033816109358286610b34565b9050838110156109955760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610467565b6109a28286868403610d6b565b506001949350505050565b600554600090600160a01b900460ff1615610a0a5760405162461bcd60e51b815260206004820152601b60248201527f45524332303a20616c6c20746f6b656e20697320667265657a656400000000006044820152606401610467565b3360009081526006602052604090205460ff16604080518082019091526017815276115490cc8c0e88151bdad95b9cc81a5cc81b1bd8dad959604a1b60208201529015610a6a5760405162461bcd60e51b815260040161046791906115bb565b503360009081526008602052604090205460ff168015610ae357610a8c610ec7565b503360009081526007602052604090206003810154610abd5760405162461bcd60e51b8152600401610467906116c2565b8381600401541015610ae15760405162461bcd60e51b815260040161046790611610565b505b6000610aef85856111ab565b905080610afb57600080fd5b8115610b2c5733600090815260076020526040812060048101805491928792610b2590849061175c565b9091555050505b949350505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610b9f6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216610bc55760405162461bcd60e51b81526004016104679061168b565b6001600160a01b03821660009081526008602052604090205460ff16801515600114610c335760405162461bcd60e51b815260206004820152601f60248201527f54696d654c6f636b3a205468657265206973206e6f74206c6f636b696e666f006044820152606401610467565b50506001600160a01b0316600090815260076020908152604091829020825160e081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a082015260069091015460c082015290565b6005546001600160a01b03163314610cca5760405162461bcd60e51b815260040161046790611656565b6001600160a01b038116610d2f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610467565b6106518161111b565b6005546001600160a01b03163314610d625760405162461bcd60e51b815260040161046790611656565b610651816111b9565b6001600160a01b038316610dcd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610467565b6001600160a01b038216610e2e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610467565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005805460ff60a01b191690556040517ff0daac2271a735ea786b9adf80dfcbd6a3cbd52f3cab0a78337114692d5faf5d90600090a1565b610f076040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b3360009081526008602052604090205460ff16801515600114610f6c5760405162461bcd60e51b815260206004820152601c60248201527f45524332303a205468657265206973206e6f74206c6f636b696e666f000000006044820152606401610467565b336000908152600760205260409020600681015442118015610f92575060648160030154105b1561101d57610fa981600601548260050154611233565b60068201556002810154600382018054600090610fc7908490611703565b909155505060028101548154606491610fdf9161173d565b610fe9919061171b565b816004016000828254610ffc9190611703565b909155505060038101546064101561101d5760646003820155805460048201555b505033600090815260076020908152604091829020825160e081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546080820152600582015460a082015260069091015460c0820152919050565b60003361109285828561125a565b6109a28585856112d4565b6001600160a01b0381166110c35760405162461bcd60e51b81526004016104679061168b565b6001600160a01b038116600081815260066020908152604091829020805460ff1916905590519182527f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea91015b60405180910390a150565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005805460ff60a01b1916600160a01b1790556040517f962a6139ca22015759d0878e2cf5d770dcb8152e1d5ba08e46a969dd9b154a9c90600090a1565b6000336104318185856112d4565b6001600160a01b0381166111df5760405162461bcd60e51b81526004016104679061168b565b6001600160a01b038116600081815260066020908152604091829020805460ff1916600117905590519182527f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc1599101611110565b6000611241610e108361173d565b61124b9084611703565b90508281101561043757600080fd5b60006112668484610b34565b905060001981146112ce57818110156112c15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610467565b6112ce8484848403610d6b565b50505050565b6001600160a01b0383166113385760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610467565b6001600160a01b03821661139a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610467565b6001600160a01b038316600090815260208190526040902054818110156114125760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610467565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611449908490611703565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161149591815260200190565b60405180910390a36112ce565b80356001600160a01b03811681146114b957600080fd5b919050565b6000602082840312156114d057600080fd5b6114d9826114a2565b9392505050565b600080604083850312156114f357600080fd5b6114fc836114a2565b915061150a602084016114a2565b90509250929050565b60008060006060848603121561152857600080fd5b611531846114a2565b925061153f602085016114a2565b9150604084013590509250925092565b6000806040838503121561156257600080fd5b61156b836114a2565b946020939093013593505050565b600080600080600060a0868803121561159157600080fd5b61159a866114a2565b97602087013597506040870135966060810135965060800135945092505050565b600060208083528351808285015260005b818110156115e8578581018301518582016040015282016115cc565b818111156115fa576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f54696d654c6f636b203a20506c6561736520636865636b2072656c6561736520604082015265185b5bdd5b9d60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206c6f636b20746f20746865207a65726f206164647265737300604082015260600190565b60208082526021908201527f54696d654c6f636b203a20506c65617365207761697420746f2072656c6561736040820152606560f81b606082015260800190565b60008219821115611716576117166117ae565b500190565b60008261173857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611757576117576117ae565b500290565b60008282101561176e5761176e6117ae565b500390565b600181811c9082168061178757607f821691505b602082108114156117a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fdfea26469706673582212202e7562174d4effe0531cd75fdcc80b527d12677a64aeafd385f25a3434da84a264736f6c63430008070033

Deployed ByteCode Sourcemap

20486:153:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9144:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10076:201;;;;;;:::i;:::-;;:::i;:::-;;;2078:14:1;;2071:22;2053:41;;2041:2;2026:18;10076:201:0;1913:187:1;9465:108:0;9553:12;;9465:108;;;10447:25:1;;;10435:2;10420:18;9465:108:0;10301:177:1;16057:70:0;;;:::i;:::-;;18829:836;;;;;;:::i;:::-;;:::i;16214:75::-;;;;;;:::i;:::-;;:::i;9364:93::-;;;9447:2;10625:36:1;;10613:2;10598:18;9364:93:0;10483:184:1;10588:238:0;;;;;;:::i;:::-;;:::i;9581:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9682:18:0;9655:7;9682:18;;;;;;;;;;;;9581:127;7030:103;;;:::i;15983:66::-;;;:::i;6807:87::-;6880:6;;6807:87;;-1:-1:-1;;;;;6880:6:0;;;1851:51:1;;1839:2;1824:18;6807:87:0;1705:203:1;15644:46:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;17861:638;;;;;;:::i;:::-;;:::i;9252:104::-;;;:::i;10834:436::-;;;;;;:::i;:::-;;:::i;19673:806::-;;;;;;:::i;:::-;;:::i;14236:20::-;;;;;-1:-1:-1;;;14236:20:0;;;;;;14640:94;;;;;;:::i;:::-;-1:-1:-1;;;;;14714:12:0;14690:4;14714:12;;;:7;:12;;;;;;;;;14640:94;9917:151;;;;;;:::i;:::-;;:::i;18507:314::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;9825:4:1;9867:3;9856:9;9852:19;9844:27;;9904:6;9898:13;9887:9;9880:32;9968:4;9960:6;9956:17;9950:24;9943:4;9932:9;9928:20;9921:54;10031:4;10023:6;10019:17;10013:24;10006:4;9995:9;9991:20;9984:54;10094:4;10086:6;10082:17;10076:24;10069:4;10058:9;10054:20;10047:54;10157:4;10149:6;10145:17;10139:24;10132:4;10121:9;10117:20;10110:54;10220:4;10212:6;10208:17;10202:24;10195:4;10184:9;10180:20;10173:54;10283:4;10275:6;10271:17;10265:24;10258:4;10247:9;10243:20;10236:54;9681:615;;;;;7141:201:0;;;;;;:::i;:::-;;:::i;16135:71::-;;;;;;:::i;:::-;;:::i;9144:100::-;9198:13;9231:5;9224:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9144:100;:::o;10076:201::-;10159:4;6433:10;10215:32;6433:10;10231:7;10240:6;10215:8;:32::i;:::-;10265:4;10258:11;;;10076:201;;;;;:::o;16057:70::-;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;;;;;;;;;16108:11:::1;:9;:11::i;:::-;16057:70::o:0;18829:836::-;14352:8;;18974:4;;-1:-1:-1;;;14352:8:0;;;;:17;14344:57;;;;-1:-1:-1;;;14344:57:0;;4123:2:1;14344:57:0;;;4105:21:1;4162:2;4142:18;;;4135:30;4201:29;4181:18;;;4174:57;4248:18;;14344:57:0;3921:351:1;14344:57:0;-1:-1:-1;;;;;14714:12:0;;14690:4;14714:12;;;:7;:12;;;;;;;;19023::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;19023:12:0::1;::::0;::::1;::::0;;19000:21:::1;18992:44;;;;-1:-1:-1::0;;;18992:44:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;19065:19:0;::::1;19049:13;19065:19:::0;;;:13:::1;:19;::::0;;;;;::::1;;19095:289:::0;::::1;;;19123:22;:20;:22::i;:::-;-1:-1:-1::0;;;;;;19184:16:0;::::1;19162:19;19184:16:::0;;;:10:::1;:16;::::0;;;;19223:15:::1;::::0;::::1;::::0;19215:65:::1;;;;-1:-1:-1::0;;;19215:65:0::1;;;;;;;:::i;:::-;19323:6;19303:2;:16;;;:26;;19295:77;;;;-1:-1:-1::0;;;19295:77:0::1;;;;;;;:::i;:::-;19108:276;19095:289;19396:8;19407:36;19426:4;19432:2;19436:6;19407:18;:36::i;:::-;19396:47;;19458:3;19454:44;;19478:8;::::0;::::1;19454:44;19513:8;19510:125;;;19571:10;19538:19;19560:22:::0;;;:10:::1;:22;::::0;;;;19597:16:::1;::::0;::::1;:26:::0;;19560:22;;19617:6;;19597:26:::1;::::0;19617:6;;19597:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;;19510:125:0::1;19654:3:::0;18829:836;-1:-1:-1;;;;;18829:836:0:o;16214:75::-;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;16270:11:::1;16278:2;16270:7;:11::i;:::-;16214:75:::0;:::o;10588:238::-;10676:4;6433:10;10732:64;6433:10;10748:7;10785:10;10757:25;6433:10;10748:7;10757:9;:25::i;:::-;:38;;;;:::i;:::-;10732:8;:64::i;7030:103::-;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;7095:30:::1;7122:1;7095:18;:30::i;15983:66::-:0;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;16032:9:::1;:7;:9::i;17861:638::-:0;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18000:16:0;::::1;17992:60;;;;-1:-1:-1::0;;;17992:60:0::1;;;;;;;:::i;:::-;18080:1;18071:6;:10;18063:49;;;::::0;-1:-1:-1;;;18063:49:0;;6828:2:1;18063:49:0::1;::::0;::::1;6810:21:1::0;6867:2;6847:18;;;6840:30;6906:28;6886:18;;;6879:56;6952:18;;18063:49:0::1;6626:350:1::0;18063:49:0::1;18138:15;18131:4;:22;18123:75;;;::::0;-1:-1:-1;;;18123:75:0;;5655:2:1;18123:75:0::1;::::0;::::1;5637:21:1::0;5694:2;5674:18;;;5667:30;5733:34;5713:18;;;5706:62;-1:-1:-1;;;5784:18:1;;;5777:38;5832:19;;18123:75:0::1;5453:404:1::0;18123:75:0::1;-1:-1:-1::0;;;;;9682:18:0;;9655:7;9682:18;;;;;;;;;;;18217:6:::1;:23;;18209:78;;;::::0;-1:-1:-1;;;18209:78:0;;4837:2:1;18209:78:0::1;::::0;::::1;4819:21:1::0;4876:2;4856:18;;;4849:30;4915:34;4895:18;;;4888:62;-1:-1:-1;;;4966:18:1;;;4959:40;5016:19;;18209:78:0::1;4635:406:1::0;18209:78:0::1;-1:-1:-1::0;;;;;18316:17:0;::::1;18300:13;18316:17:::0;;;:13:::1;:17;::::0;;;;;::::1;;::::0;18344:148:::1;;-1:-1:-1::0;;;;;18373:17:0;::::1;;::::0;;;:13:::1;:17;::::0;;;;;;;:24;;-1:-1:-1;;18373:24:0::1;18393:4;18373:24:::0;;::::1;::::0;;;18429:51;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18412:14;;;:10:::1;:14:::0;;;;;;;:68;;;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;18344:148:::1;17981:518;17861:638:::0;;;;;:::o;9252:104::-;9308:13;9341:7;9334:14;;;;;:::i;10834:436::-;10927:4;6433:10;10927:4;11010:25;6433:10;11027:7;11010:9;:25::i;:::-;10983:52;;11074:15;11054:16;:35;;11046:85;;;;-1:-1:-1;;;11046:85:0;;9477:2:1;11046:85:0;;;9459:21:1;9516:2;9496:18;;;9489:30;9555:34;9535:18;;;9528:62;-1:-1:-1;;;9606:18:1;;;9599:35;9651:19;;11046:85:0;9275:401:1;11046:85:0;11167:60;11176:5;11183:7;11211:15;11192:16;:34;11167:8;:60::i;:::-;-1:-1:-1;11258:4:0;;10834:436;-1:-1:-1;;;;10834:436:0:o;19673:806::-;14352:8;;19781:4;;-1:-1:-1;;;14352:8:0;;;;:17;14344:57;;;;-1:-1:-1;;;14344:57:0;;4123:2:1;14344:57:0;;;4105:21:1;4162:2;4142:18;;;4135:30;4201:29;4181:18;;;4174:57;4248:18;;14344:57:0;3921:351:1;14344:57:0;19813:10:::1;14690:4:::0;14714:12;;;:7;:12;;;;;;;;19835::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;19835:12:0::1;::::0;::::1;::::0;;19806:27:::1;19798:50;;;;-1:-1:-1::0;;;19798:50:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;19891:10:0::1;19861:13;19877:25:::0;;;:13:::1;:25;::::0;;;;;::::1;;19913:295:::0;::::1;;;19941:22;:20;:22::i;:::-;-1:-1:-1::0;20013:10:0::1;19980:19;20002:22:::0;;;:10:::1;:22;::::0;;;;20047:15:::1;::::0;::::1;::::0;20039:65:::1;;;;-1:-1:-1::0;;;20039:65:0::1;;;;;;;:::i;:::-;20147:6;20127:2;:16;;;:26;;20119:77;;;;-1:-1:-1::0;;;20119:77:0::1;;;;;;;:::i;:::-;19926:282;19913:295;20220:8;20231:26;20246:2;20250:6;20231:14;:26::i;:::-;20220:37;;20272:3;20268:44;;20292:8;::::0;::::1;20268:44;20327:8;20324:125;;;20385:10;20352:19;20374:22:::0;;;:10:::1;:22;::::0;;;;20411:16:::1;::::0;::::1;:26:::0;;20374:22;;20431:6;;20411:26:::1;::::0;20431:6;;20411:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;;20324:125:0::1;20468:3:::0;19673:806;-1:-1:-1;;;;19673:806:0:o;9917:151::-;-1:-1:-1;;;;;10033:18:0;;;10006:7;10033:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9917:151::o;18507:314::-;18568:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18568:15:0;-1:-1:-1;;;;;18604:16:0;;18596:60;;;;-1:-1:-1;;;18596:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18683:17:0;;18667:13;18683:17;;;:13;:17;;;;;;;;18719:16;;;18683:17;18719:16;18711:60;;;;-1:-1:-1;;;18711:60:0;;7544:2:1;18711:60:0;;;7526:21:1;7583:2;7563:18;;;7556:30;7622:33;7602:18;;;7595:61;7673:18;;18711:60:0;7342:355:1;18711:60:0;-1:-1:-1;;;;;;;18799:14:0;;;;;:10;:14;;;;;;;;;18792:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18507:314::o;7141:201::-;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7230:22:0;::::1;7222:73;;;::::0;-1:-1:-1;;;7222:73:0;;3313:2:1;7222:73:0::1;::::0;::::1;3295:21:1::0;3352:2;3332:18;;;3325:30;3391:34;3371:18;;;3364:62;-1:-1:-1;;;3442:18:1;;;3435:36;3488:19;;7222:73:0::1;3111:402:1::0;7222:73:0::1;7306:28;7325:8;7306:18;:28::i;16135:71::-:0;6880:6;;-1:-1:-1;;;;;6880:6:0;6433:10;6942:23;6934:68;;;;-1:-1:-1;;;6934:68:0;;;;;;;:::i;:::-;16189:9:::1;16195:2;16189:5;:9::i;12963:380::-:0;-1:-1:-1;;;;;13099:19:0;;13091:68;;;;-1:-1:-1;;;13091:68:0;;8310:2:1;13091:68:0;;;8292:21:1;8349:2;8329:18;;;8322:30;8388:34;8368:18;;;8361:62;-1:-1:-1;;;8439:18:1;;;8432:34;8483:19;;13091:68:0;8108:400:1;13091:68:0;-1:-1:-1;;;;;13178:21:0;;13170:68;;;;-1:-1:-1;;;13170:68:0;;3720:2:1;13170:68:0;;;3702:21:1;3759:2;3739:18;;;3732:30;3798:34;3778:18;;;3771:62;-1:-1:-1;;;3849:18:1;;;3842:32;3891:19;;13170:68:0;3518:398:1;13170:68:0;-1:-1:-1;;;;;13251:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13303:32;;10447:25:1;;;13303:32:0;;10420:18:1;13303:32:0;;;;;;;12963:380;;;:::o;14532:100::-;14581:8;:16;;-1:-1:-1;;;;14581:16:0;;;14613:11;;;;14592:5;;14613:11;14532:100::o;17156:697::-;17205:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17205:15:0;17263:10;17233:13;17249:25;;;:13;:25;;;;;;;;17293:16;;;17249:25;17293:16;17285:57;;;;-1:-1:-1;;;17285:57:0;;6064:2:1;17285:57:0;;;6046:21:1;6103:2;6083:18;;;6076:30;6142;6122:18;;;6115:58;6190:18;;17285:57:0;5862:352:1;17285:57:0;17388:10;17355:19;17377:22;;;:10;:22;;;;;17413:11;;;;17427:15;-1:-1:-1;17413:54:0;;;;;17464:3;17446:2;:15;;;:21;17413:54;17410:394;;;17498:35;17508:2;:11;;;17521:2;:11;;;17498:9;:35::i;:::-;17484:11;;;:49;17567:14;;;;17548:15;;;:33;;:15;;:33;;17567:14;;17548:33;:::i;:::-;;;;-1:-1:-1;;17628:14:0;;;;17617:8;;17646:3;;17617:25;;;:::i;:::-;17616:33;;;;:::i;:::-;17596:2;:16;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;;17669:15:0;;;;17687:3;-1:-1:-1;17666:127:0;;;17728:3;17710:15;;;:21;17769:8;;17750:16;;;:27;17666:127;-1:-1:-1;;17834:10:0;17823:22;;;;:10;:22;;;;;;;;;17816:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17156:697;-1:-1:-1;17156:697:0:o;10285:295::-;10416:4;6433:10;10474:38;10490:4;6433:10;10505:6;10474:15;:38::i;:::-;10523:27;10533:4;10539:2;10543:6;10523:9;:27::i;14930:185::-;-1:-1:-1;;;;;14995:16:0;;14987:60;;;;-1:-1:-1;;;14987:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15060:11:0;;15074:5;15060:11;;;:7;:11;;;;;;;;;:19;;-1:-1:-1;;15060:19:0;;;15095:12;;1851:51:1;;;15095:12:0;;1824:18:1;15095:12:0;;;;;;;;14930:185;:::o;7350:191::-;7443:6;;;-1:-1:-1;;;;;7460:17:0;;;-1:-1:-1;;;;;;7460:17:0;;;;;;;7493:40;;7443:6;;;7460:17;7443:6;;7493:40;;7424:16;;7493:40;7413:128;7350:191;:::o;14429:95::-;14476:8;:15;;-1:-1:-1;;;;14476:15:0;-1:-1:-1;;;14476:15:0;;;14507:9;;;;14476:15;;14507:9;14429:95::o;9716:193::-;9795:4;6433:10;9851:28;6433:10;9868:2;9872:6;9851:9;:28::i;14742:180::-;-1:-1:-1;;;;;14805:16:0;;14797:60;;;;-1:-1:-1;;;14797:60:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14870:11:0;;;;;;:7;:11;;;;;;;;;:18;;-1:-1:-1;;14870:18:0;14884:4;14870:18;;;14904:10;;1851:51:1;;;14904:10:0;;1824:18:1;14904:10:0;1705:203:1;16515:212:0;16592:17;16649:25;15269:7;16649:6;:25;:::i;:::-;16637:37;;:9;:37;:::i;:::-;16622:52;;16709:9;16693:12;:25;;16685:34;;;;;13351:453;13486:24;13513:25;13523:5;13530:7;13513:9;:25::i;:::-;13486:52;;-1:-1:-1;;13553:16:0;:37;13549:248;;13635:6;13615:16;:26;;13607:68;;;;-1:-1:-1;;;13607:68:0;;4479:2:1;13607:68:0;;;4461:21:1;4518:2;4498:18;;;4491:30;4557:31;4537:18;;;4530:59;4606:18;;13607:68:0;4277:353:1;13607:68:0;13719:51;13728:5;13735:7;13763:6;13744:16;:25;13719:8;:51::i;:::-;13475:329;13351:453;;;:::o;11278:671::-;-1:-1:-1;;;;;11409:18:0;;11401:68;;;;-1:-1:-1;;;11401:68:0;;7904:2:1;11401:68:0;;;7886:21:1;7943:2;7923:18;;;7916:30;7982:34;7962:18;;;7955:62;-1:-1:-1;;;8033:18:1;;;8026:35;8078:19;;11401:68:0;7702:401:1;11401:68:0;-1:-1:-1;;;;;11488:16:0;;11480:64;;;;-1:-1:-1;;;11480:64:0;;2909:2:1;11480:64:0;;;2891:21:1;2948:2;2928:18;;;2921:30;2987:34;2967:18;;;2960:62;-1:-1:-1;;;3038:18:1;;;3031:33;3081:19;;11480:64:0;2707:399:1;11480:64:0;-1:-1:-1;;;;;11630:15:0;;11608:19;11630:15;;;;;;;;;;;11664:21;;;;11656:72;;;;-1:-1:-1;;;11656:72:0;;5248:2:1;11656:72:0;;;5230:21:1;5287:2;5267:18;;;5260:30;5326:34;5306:18;;;5299:62;-1:-1:-1;;;5377:18:1;;;5370:36;5423:19;;11656:72:0;5046:402:1;11656:72:0;-1:-1:-1;;;;;11764:15:0;;;:9;:15;;;;;;;;;;;11782:20;;;11764:38;;11824:13;;;;;;;;:23;;11796:6;;11764:9;11824:23;;11796:6;;11824:23;:::i;:::-;;;;;;;;11880:2;-1:-1:-1;;;;;11865:26:0;11874:4;-1:-1:-1;;;;;11865:26:0;;11884:6;11865:26;;;;10447:25:1;;10435:2;10420:18;;10301:177;11865:26:0;;;;;;;;11904:37;13812:125;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:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:254::-;1049:6;1057;1110:2;1098:9;1089:7;1085:23;1081:32;1078:52;;;1126:1;1123;1116:12;1078:52;1149:29;1168:9;1149:29;:::i;:::-;1139:39;1225:2;1210:18;;;;1197:32;;-1:-1:-1;;;981:254:1:o;1240:460::-;1335:6;1343;1351;1359;1367;1420:3;1408:9;1399:7;1395:23;1391:33;1388:53;;;1437:1;1434;1427:12;1388:53;1460:29;1479:9;1460:29;:::i;:::-;1450:39;1536:2;1521:18;;1508:32;;-1:-1:-1;1587:2:1;1572:18;;1559:32;;1638:2;1623:18;;1610:32;;-1:-1:-1;1689:3:1;1674:19;1661:33;;-1:-1:-1;1240:460:1;-1:-1:-1;;;1240:460:1:o;2105:597::-;2217:4;2246:2;2275;2264:9;2257:21;2307:6;2301:13;2350:6;2345:2;2334:9;2330:18;2323:34;2375:1;2385:140;2399:6;2396:1;2393:13;2385:140;;;2494:14;;;2490:23;;2484:30;2460:17;;;2479:2;2456:26;2449:66;2414:10;;2385:140;;;2543:6;2540:1;2537:13;2534:91;;;2613:1;2608:2;2599:6;2588:9;2584:22;2580:31;2573:42;2534:91;-1:-1:-1;2686:2:1;2665:15;-1:-1:-1;;2661:29:1;2646:45;;;;2693:2;2642:54;;2105:597;-1:-1:-1;;;2105:597:1:o;6219:402::-;6421:2;6403:21;;;6460:2;6440:18;;;6433:30;6499:34;6494:2;6479:18;;6472:62;-1:-1:-1;;;6565:2:1;6550:18;;6543:36;6611:3;6596:19;;6219:402::o;6981:356::-;7183:2;7165:21;;;7202:18;;;7195:30;7261:34;7256:2;7241:18;;7234:62;7328:2;7313:18;;6981:356::o;8513:355::-;8715:2;8697:21;;;8754:2;8734:18;;;8727:30;8793:33;8788:2;8773:18;;8766:61;8859:2;8844:18;;8513:355::o;8873:397::-;9075:2;9057:21;;;9114:2;9094:18;;;9087:30;9153:34;9148:2;9133:18;;9126:62;-1:-1:-1;;;9219:2:1;9204:18;;9197:31;9260:3;9245:19;;8873:397::o;10672:128::-;10712:3;10743:1;10739:6;10736:1;10733:13;10730:39;;;10749:18;;:::i;:::-;-1:-1:-1;10785:9:1;;10672:128::o;10805:217::-;10845:1;10871;10861:132;;10915:10;10910:3;10906:20;10903:1;10896:31;10950:4;10947:1;10940:15;10978:4;10975:1;10968:15;10861:132;-1:-1:-1;11007:9:1;;10805:217::o;11027:168::-;11067:7;11133:1;11129;11125:6;11121:14;11118:1;11115:21;11110:1;11103:9;11096:17;11092:45;11089:71;;;11140:18;;:::i;:::-;-1:-1:-1;11180:9:1;;11027:168::o;11200:125::-;11240:4;11268:1;11265;11262:8;11259:34;;;11273:18;;:::i;:::-;-1:-1:-1;11310:9:1;;11200:125::o;11330:380::-;11409:1;11405:12;;;;11452;;;11473:61;;11527:4;11519:6;11515:17;11505:27;;11473:61;11580:2;11572:6;11569:14;11549:18;11546:38;11543:161;;;11626:10;11621:3;11617:20;11614:1;11607:31;11661:4;11658:1;11651:15;11689:4;11686:1;11679:15;11543:161;;11330:380;;;:::o;11715:127::-;11776:10;11771:3;11767:20;11764:1;11757:31;11807:4;11804:1;11797:15;11831:4;11828:1;11821:15

Swarm Source

ipfs://2e7562174d4effe0531cd75fdcc80b527d12677a64aeafd385f25a3434da84a2

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.