ETH Price: $3,337.26 (-1.11%)
Gas: 9 Gwei

Token

SOLIDBLOCK (SOLID)
 

Overview

Max Total Supply

100,000,000,000 SOLID

Holders

170

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
arthurtoscano.eth
Balance
7,208,956.188530877036051678 SOLID

Value
$0.00
0x0ac6924ea443ac45ee9cbf44be16c1dfdf08c42c
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:
SOLIDBLOCK

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license
File 1 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 2 of 9 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * 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 default value returned by this function, unless
     * it's 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, allowance(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 = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * 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;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _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;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * 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 3 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

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

File 4 of 9 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @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 5 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// 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 6 of 9 : SolidBlock.sol
//SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IUniswapV2Pair.sol";
import "./interfaces/IUniswapV2Router.sol";

contract SOLIDBLOCK is ERC20, Ownable {

    address payable public treasury = payable(0x538a2Df2760b98C0Fc37fdE218A0A2481C1106e2);
    address payable public nftRewards = payable(0xBF177e5238B88068648F58d2292a3Ec3FB164f38);

    mapping (address => bool) public isExcludedFromFee;

    mapping (address => bool) private _isBlocked;

    uint256 public treasuryFee = 50;
    uint256 public nftRewardsFee = 10;
    uint256 public totalFee = treasuryFee + nftRewardsFee;
    uint256 public constant DENOMINATOR = 1000;

    uint256 public maxWallet;
    mapping (address => bool) public isExcludedFromMax;

    bool public tradingPaused;

    uint256 public minimumTokensBeforeSwap = 1_500* 10 ** decimals();

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool inSwap;
    bool public swapEnabled;

    event SwapEnabledUpdated(bool enabled);
    event SwapETHForTokens(uint256 amountIn, address[] path);
    event SwapTokensForETH(uint256 amountIn, address[] path);
    event ETHSentTo(uint256 amount, address wallet);

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () ERC20("SOLIDBLOCK", "SOLID") {

        _mint(msg.sender, 1 * 10 ** 11 * 10 ** decimals());

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);//router main
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        maxWallet = totalSupply() / 100;

        isExcludedFromMax[owner()] = true;
        isExcludedFromMax[address(this)] = true;
        isExcludedFromMax[address(treasury)] = true;
        isExcludedFromMax[address(nftRewards)] = true;
        isExcludedFromMax[address(uniswapV2Router)] = true;
        isExcludedFromMax[address(address(uniswapV2Pair))] = true;

        isExcludedFromFee[owner()] = true;
        isExcludedFromFee[address(this)] = true;
        isExcludedFromFee[address(treasury)] = true;
        isExcludedFromFee[address(nftRewards)] = true;
        isExcludedFromFee[address(uniswapV2Router)] = true;

    }

    function updateMaxWallet(uint256 newValue) public onlyOwner {
        maxWallet = newValue;
    }

    function updateTradingPaused(bool newValue) public onlyOwner {
        tradingPaused = newValue;
    }

    function updateIsExcludedFromMax(address account, bool newValue) public onlyOwner {
        isExcludedFromMax[account] = newValue;
    }

    function updateIsExcludedFromFee(address account, bool newValue) public onlyOwner {
        isExcludedFromFee[account] = newValue;
    }

    function updateIsBlocked(address account, bool newValue) public onlyOwner {
        _isBlocked[account] = newValue;
    }

    function setTaxes(uint256 newTreasury, uint256 newRewards) external onlyOwner {
        treasuryFee = newTreasury;
        nftRewardsFee = newRewards;
        totalFee = treasuryFee + nftRewardsFee;
    }

    function updateWallets(address newTreasury, address newNFTRewards) external onlyOwner {
        treasury = payable(newTreasury);
        nftRewards = payable(newNFTRewards);
    }

    function setSwapEnabled(bool _enabled) public onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabledUpdated(_enabled);
    }

    function setNumTokensBeforeSwap(uint256 newLimit) external onlyOwner {
        minimumTokensBeforeSwap = newLimit;
    }

    function updateRouter(address newRouterAddress) public onlyOwner returns(address newPairAddress) {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(newRouterAddress);

        newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(address(this), _uniswapV2Router.WETH());

        if(newPairAddress == address(0)) //Create If Doesnt exist
        {
            newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        }

        uniswapV2Pair = newPairAddress; //Set new pair address
        uniswapV2Router = _uniswapV2Router; //Set new router address
    }

    receive() external payable {}

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal override {
        require(!_isBlocked[sender], 'Sender is blocked');
        require(!_isBlocked[recipient], 'Recipient is blocked');
        require(!tradingPaused,'Trading paused');

        if(inSwap)
        {
            super._transfer(sender, recipient, amount);
            return;
        }
        else
        {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;

            if (overMinimumTokenBalance && !inSwap && sender != uniswapV2Pair && swapEnabled)
            {
                swapAndSendToWallets(minimumTokensBeforeSwap);
            }

            if(!isExcludedFromFee[sender] && !isExcludedFromFee[recipient]) {
                uint256 feeAmount = amount * totalFee / DENOMINATOR;
                amount -= feeAmount;
                super._transfer(sender, address(this), feeAmount);
            }

            if (!isExcludedFromMax[recipient]){
                require(balanceOf(recipient) + amount <= maxWallet, 'Max holding limit');
            }

            super._transfer(sender, recipient, amount);
        }
    }

    function swapAndSendToWallets(uint256 tokens) private  lockTheSwap {
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(tokens);
        uint256 receivedETH = address(this).balance - initialBalance;

        uint256 treasuryETH = receivedETH * treasuryFee / totalFee;
        uint256 nftRewardsETH = receivedETH - treasuryETH;

        bool success;
        (success,) = address(treasury).call{value: treasuryETH}("");
        if (success) {
            emit ETHSentTo(treasuryETH, treasury);
        }
        (success,) = address(nftRewards).call{value: nftRewardsETH}("");
        if (success) {
            emit ETHSentTo(nftRewardsETH, nftRewards);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

}

File 7 of 9 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 8 of 9 : IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 9 of 9 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



// pragma solidity >=0.6.2;

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

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":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ETHSentTo","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":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"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":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewards","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setNumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTreasury","type":"uint256"},{"internalType":"uint256","name":"newRewards","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"updateIsBlocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"updateIsExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"newValue","type":"bool"}],"name":"updateIsExcludedFromMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"updateRouter","outputs":[{"internalType":"address","name":"newPairAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"updateTradingPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"},{"internalType":"address","name":"newNFTRewards","type":"address"}],"name":"updateWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600680546001600160a01b031990811673538a2df2760b98c0fc37fde218a0a2481c1106e2179091556007805490911673bf177e5238b88068648f58d2292a3ec3fb164f381790556032600a818155600b8190556200006391620006b8565b600c556200007062000451565b6200007d90600a62000741565b6200008b906105dc6200082c565b6010553480156200009b57600080fd5b50604080518082018252600a815269534f4c4944424c4f434b60b01b60208083019182528351808501909452600584526414d3d3125160da1b908401528151919291620000eb9160039162000588565b5080516200010190600490602084019062000588565b5050506200011e620001186200045660201b60201c565b6200045a565b62000151336200012d62000451565b6200013a90600a62000741565b6200014b9064174876e8006200082c565b620004ac565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001a457600080fd5b505afa158015620001b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001df91906200062e565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200022857600080fd5b505afa1580156200023d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026391906200062e565b6040518363ffffffff1660e01b8152600401620002829291906200065e565b602060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d891906200062e565b601280546001600160a01b03199081166001600160a01b0393841617909155601180549091169183169190911790556064620003136200056e565b6200031f9190620006d3565b600d556001600e60006200033262000574565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600e909352818320805485166001908117909155600654821684528284208054861682179055600754821684528284208054861682179055601154821684528284208054861682179055601254909116835290822080549093168117909255600890620003cf62000574565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600890935281832080548516600190811790915560065482168452828420805486168217905560075482168452828420805486168217905560115490911683529120805490921617905550620008a1565b601290565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004de5760405162461bcd60e51b8152600401620004d59062000678565b60405180910390fd5b620004ec6000838362000583565b8060026000828254620005009190620006b8565b90915550506001600160a01b038216600081815260208190526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000554908590620006af565b60405180910390a36200056a6000838362000583565b5050565b60025490565b6005546001600160a01b031690565b505050565b82805462000596906200084e565b90600052602060002090601f016020900481019282620005ba576000855562000605565b82601f10620005d557805160ff191683800117855562000605565b8280016001018555821562000605579182015b8281111562000605578251825591602001919060010190620005e8565b506200061392915062000617565b5090565b5b8082111562000613576000815560010162000618565b60006020828403121562000640578081fd5b81516001600160a01b038116811462000657578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620006ce57620006ce6200088b565b500190565b600082620006ef57634e487b7160e01b81526012600452602481fd5b500490565b80825b600180861162000708575062000738565b8187048211156200071d576200071d6200088b565b808616156200072b57918102915b9490941c938002620006f7565b94509492505050565b60006200065760001960ff851684600082620007605750600162000657565b816200076f5750600062000657565b81600181146200078857600281146200079357620007c7565b600191505062000657565b60ff841115620007a757620007a76200088b565b6001841b915084821115620007c057620007c06200088b565b5062000657565b5060208310610133831016604e8410600b8410161715620007ff575081810a83811115620007f957620007f96200088b565b62000657565b6200080e8484846001620006f4565b8086048211156200082357620008236200088b565b02949350505050565b60008160001904831182151516156200084957620008496200088b565b500290565b6002810460018216806200086357607f821691505b602082108114156200088557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611cf380620008b16000396000f3fe6080604052600436106102295760003560e01c806370a0823111610123578063c851cc32116100ab578063e01af92c1161006f578063e01af92c146105e6578063e8ba854f14610606578063ee86636b14610626578063f2fde38b14610646578063f8b45b051461066657610230565b8063c851cc321461055c578063cc32d1761461057c578063d2d7ad8314610591578063da78876f146105a6578063dd62ed3e146105c657610230565b8063918f8674116100f2578063918f8674146104d257806395d89b41146104e7578063a457c2d7146104fc578063a9059cbb1461051c578063c647b20e1461053c57610230565b806370a0823114610473578063715018a61461049357806387bef55c146104a85780638da5cb5b146104bd57610230565b8063313ce567116101b157806353e23e2e1161017557806353e23e2e146103ff57806358481541146104145780635ad9f9931461043457806361d027b3146104495780636ddd17131461045e57610230565b8063313ce56714610368578063395093511461038a5780633b97084a146103aa57806349bd5a5e146103ca5780635342acb4146103df57610230565b80631694505e116101f85780631694505e146102cf57806318160ddd146102f15780631c499ab0146103135780631df4ccfc1461033357806323b872dd1461034857610230565b806306fdde0314610235578063095ea7b3146102605780630f833e3e1461028d5780631039ad75146102af57610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a61067b565b6040516102579190611814565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004611717565b61070d565b6040516102579190611809565b34801561029957600080fd5b506102ad6102a83660046116e3565b61072f565b005b3480156102bb57600080fd5b506102ad6102ca366004611742565b610762565b3480156102db57600080fd5b506102e461077d565b60405161025791906117db565b3480156102fd57600080fd5b5061030661078c565b6040516102579190611b5e565b34801561031f57600080fd5b506102ad61032e36600461175c565b610792565b34801561033f57600080fd5b5061030661079f565b34801561035457600080fd5b506102806103633660046116a3565b6107a5565b34801561037457600080fd5b5061037d6107d3565b6040516102579190611bdb565b34801561039657600080fd5b506102806103a5366004611717565b6107d8565b3480156103b657600080fd5b506102ad6103c536600461175c565b610804565b3480156103d657600080fd5b506102e4610811565b3480156103eb57600080fd5b506102806103fa36600461162c565b610820565b34801561040b57600080fd5b50610280610835565b34801561042057600080fd5b506102ad61042f3660046116e3565b61083e565b34801561044057600080fd5b506102e4610871565b34801561045557600080fd5b506102e4610880565b34801561046a57600080fd5b5061028061088f565b34801561047f57600080fd5b5061030661048e36600461162c565b61089f565b34801561049f57600080fd5b506102ad6108be565b3480156104b457600080fd5b506103066108d2565b3480156104c957600080fd5b506102e46108d8565b3480156104de57600080fd5b506103066108e7565b3480156104f357600080fd5b5061024a6108ed565b34801561050857600080fd5b50610280610517366004611717565b6108fc565b34801561052857600080fd5b50610280610537366004611717565b61094d565b34801561054857600080fd5b506102ad610557366004611774565b61096a565b34801561056857600080fd5b506102e461057736600461162c565b61098d565b34801561058857600080fd5b50610306610ca1565b34801561059d57600080fd5b50610306610ca7565b3480156105b257600080fd5b506102806105c136600461162c565b610cad565b3480156105d257600080fd5b506103066105e136600461166b565b610cc2565b3480156105f257600080fd5b506102ad610601366004611742565b610ced565b34801561061257600080fd5b506102ad61062136600461166b565b610d47565b34801561063257600080fd5b506102ad6106413660046116e3565b610d7d565b34801561065257600080fd5b506102ad61066136600461162c565b610db0565b34801561067257600080fd5b50610306610dea565b60606003805461068a90611c57565b80601f01602080910402602001604051908101604052809291908181526020018280546106b690611c57565b80156107035780601f106106d857610100808354040283529160200191610703565b820191906000526020600020905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b600080610718610df0565b9050610725818585610df4565b5060019392505050565b610737610ea8565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b61076a610ea8565b600f805460ff1916911515919091179055565b6011546001600160a01b031681565b60025490565b61079a610ea8565b600d55565b600c5481565b6000806107b0610df0565b90506107bd858285610ee7565b6107c8858585610f31565b506001949350505050565b601290565b6000806107e3610df0565b90506107258185856107f58589610cc2565b6107ff9190611be9565b610df4565b61080c610ea8565b601055565b6012546001600160a01b031681565b60086020526000908152604090205460ff1681565b600f5460ff1681565b610846610ea8565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6007546001600160a01b031681565b6006546001600160a01b031681565b601254600160a81b900460ff1681565b6001600160a01b0381166000908152602081905260409020545b919050565b6108c6610ea8565b6108d0600061113a565b565b600b5481565b6005546001600160a01b031690565b6103e881565b60606004805461068a90611c57565b600080610907610df0565b905060006109158286610cc2565b9050838110156109405760405162461bcd60e51b815260040161093790611b19565b60405180910390fd5b6107c88286868403610df4565b600061096161095a610df0565b8484610f31565b50600192915050565b610972610ea8565b600a829055600b8190556109868183611be9565b600c555050565b6000610997610ea8565b6000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d919061164f565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5557600080fd5b505afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d919061164f565b6040518363ffffffff1660e01b8152600401610aaa9291906117ef565b60206040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa919061164f565b91506001600160a01b038216610c6d57806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4357600080fd5b505afa158015610b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7b919061164f565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc357600080fd5b505afa158015610bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfb919061164f565b6040518363ffffffff1660e01b8152600401610c189291906117ef565b602060405180830381600087803b158015610c3257600080fd5b505af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a919061164f565b91505b601280546001600160a01b038085166001600160a01b03199283161790925560118054939092169216919091179055919050565b600a5481565b60105481565b600e6020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610cf5610ea8565b6012805460ff60a81b1916600160a81b831515021790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1290610d3c908390611809565b60405180910390a150565b610d4f610ea8565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b610d85610ea8565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610db8610ea8565b6001600160a01b038116610dde5760405162461bcd60e51b8152600401610937906118aa565b610de78161113a565b50565b600d5481565b3390565b6001600160a01b038316610e1a5760405162461bcd60e51b815260040161093790611aaa565b6001600160a01b038216610e405760405162461bcd60e51b8152600401610937906118f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e9b908590611b5e565b60405180910390a3505050565b610eb0610df0565b6001600160a01b0316610ec16108d8565b6001600160a01b0316146108d05760405162461bcd60e51b815260040161093790611a02565b6000610ef38484610cc2565b90506000198114610f2b5781811015610f1e5760405162461bcd60e51b81526004016109379061195d565b610f2b8484848403610df4565b50505050565b6001600160a01b03831660009081526009602052604090205460ff1615610f6a5760405162461bcd60e51b815260040161093790611932565b6001600160a01b03821660009081526009602052604090205460ff1615610fa35760405162461bcd60e51b815260040161093790611a7c565b600f5460ff1615610fc65760405162461bcd60e51b8152600401610937906119da565b601254600160a01b900460ff1615610fe857610fe383838361118c565b611135565b6000610ff33061089f565b601054909150811080159081906110145750601254600160a01b900460ff16155b801561102e57506012546001600160a01b03868116911614155b80156110435750601254600160a81b900460ff165b156110535761105360105461128d565b6001600160a01b03851660009081526008602052604090205460ff1615801561109557506001600160a01b03841660009081526008602052604090205460ff16155b156110d25760006103e8600c54856110ad9190611c21565b6110b79190611c01565b90506110c38185611c40565b93506110d086308361118c565b505b6001600160a01b0384166000908152600e602052604090205460ff1661112757600d54836110ff8661089f565b6111099190611be9565b11156111275760405162461bcd60e51b815260040161093790611aee565b61113285858561118c565b50505b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166111b25760405162461bcd60e51b815260040161093790611a37565b6001600160a01b0382166111d85760405162461bcd60e51b815260040161093790611867565b6111e3838383611135565b6001600160a01b0383166000908152602081905260409020548181101561121c5760405162461bcd60e51b815260040161093790611994565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061127a908690611b5e565b60405180910390a3610f2b848484611135565b6012805460ff60a01b1916600160a01b179055476112aa8261145e565b60006112b68247611c40565b90506000600c54600a54836112cb9190611c21565b6112d59190611c01565b905060006112e38284611c40565b6006546040519192506000916001600160a01b03909116908490611306906117d8565b60006040518083038185875af1925050503d8060008114611343576040519150601f19603f3d011682016040523d82523d6000602084013e611348565b606091505b50909150508015611399576006546040517fb3a7eb63b41c90c3a13e7d791bc37682793f3cbf70ee7cba22735c2ded2fe40f916113909186916001600160a01b031690611b67565b60405180910390a15b6007546040516001600160a01b039091169083906113b6906117d8565b60006040518083038185875af1925050503d80600081146113f3576040519150601f19603f3d011682016040523d82523d6000602084013e6113f8565b606091505b50909150508015611449576007546040517fb3a7eb63b41c90c3a13e7d791bc37682793f3cbf70ee7cba22735c2ded2fe40f916114409185916001600160a01b031690611b67565b60405180910390a15b50506012805460ff60a01b1916905550505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106114a157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156114f557600080fd5b505afa158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152d919061164f565b8160018151811061154e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526011546115749130911684610df4565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac947906115ad908590600090869030904290600401611b9f565b600060405180830381600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611610929190611b7e565b60405180910390a15050565b803580151581146108b957600080fd5b60006020828403121561163d578081fd5b813561164881611ca8565b9392505050565b600060208284031215611660578081fd5b815161164881611ca8565b6000806040838503121561167d578081fd5b823561168881611ca8565b9150602083013561169881611ca8565b809150509250929050565b6000806000606084860312156116b7578081fd5b83356116c281611ca8565b925060208401356116d281611ca8565b929592945050506040919091013590565b600080604083850312156116f5578182fd5b823561170081611ca8565b915061170e6020840161161c565b90509250929050565b60008060408385031215611729578182fd5b823561173481611ca8565b946020939093013593505050565b600060208284031215611753578081fd5b6116488261161c565b60006020828403121561176d578081fd5b5035919050565b60008060408385031215611786578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156117cd5781516001600160a01b0316875295820195908201906001016117a8565b509495945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6000602080835283518082850152825b8181101561184057858101830151858201604001528201611824565b818111156118515783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526011908201527014d95b99195c881a5cc8189b1bd8dad959607a1b604082015260600190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600e908201526d151c98591a5b99c81c185d5cd95960921b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260149082015273149958da5c1a595b9d081a5cc8189b1bd8dad95960621b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526011908201527013585e081a1bdb191a5b99c81b1a5b5a5d607a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b600083825260406020830152611b976040830184611795565b949350505050565b600086825285602083015260a06040830152611bbe60a0830186611795565b6001600160a01b0394909416606083015250608001529392505050565b60ff91909116815260200190565b60008219821115611bfc57611bfc611c92565b500190565b600082611c1c57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611c3b57611c3b611c92565b500290565b600082821015611c5257611c52611c92565b500390565b600281046001821680611c6b57607f821691505b60208210811415611c8c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610de757600080fdfea2646970667358221220091a2001292d8f26f5ed1a30cb2c93511026f858d4212e07690f4aa3c224190e64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102295760003560e01c806370a0823111610123578063c851cc32116100ab578063e01af92c1161006f578063e01af92c146105e6578063e8ba854f14610606578063ee86636b14610626578063f2fde38b14610646578063f8b45b051461066657610230565b8063c851cc321461055c578063cc32d1761461057c578063d2d7ad8314610591578063da78876f146105a6578063dd62ed3e146105c657610230565b8063918f8674116100f2578063918f8674146104d257806395d89b41146104e7578063a457c2d7146104fc578063a9059cbb1461051c578063c647b20e1461053c57610230565b806370a0823114610473578063715018a61461049357806387bef55c146104a85780638da5cb5b146104bd57610230565b8063313ce567116101b157806353e23e2e1161017557806353e23e2e146103ff57806358481541146104145780635ad9f9931461043457806361d027b3146104495780636ddd17131461045e57610230565b8063313ce56714610368578063395093511461038a5780633b97084a146103aa57806349bd5a5e146103ca5780635342acb4146103df57610230565b80631694505e116101f85780631694505e146102cf57806318160ddd146102f15780631c499ab0146103135780631df4ccfc1461033357806323b872dd1461034857610230565b806306fdde0314610235578063095ea7b3146102605780630f833e3e1461028d5780631039ad75146102af57610230565b3661023057005b600080fd5b34801561024157600080fd5b5061024a61067b565b6040516102579190611814565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004611717565b61070d565b6040516102579190611809565b34801561029957600080fd5b506102ad6102a83660046116e3565b61072f565b005b3480156102bb57600080fd5b506102ad6102ca366004611742565b610762565b3480156102db57600080fd5b506102e461077d565b60405161025791906117db565b3480156102fd57600080fd5b5061030661078c565b6040516102579190611b5e565b34801561031f57600080fd5b506102ad61032e36600461175c565b610792565b34801561033f57600080fd5b5061030661079f565b34801561035457600080fd5b506102806103633660046116a3565b6107a5565b34801561037457600080fd5b5061037d6107d3565b6040516102579190611bdb565b34801561039657600080fd5b506102806103a5366004611717565b6107d8565b3480156103b657600080fd5b506102ad6103c536600461175c565b610804565b3480156103d657600080fd5b506102e4610811565b3480156103eb57600080fd5b506102806103fa36600461162c565b610820565b34801561040b57600080fd5b50610280610835565b34801561042057600080fd5b506102ad61042f3660046116e3565b61083e565b34801561044057600080fd5b506102e4610871565b34801561045557600080fd5b506102e4610880565b34801561046a57600080fd5b5061028061088f565b34801561047f57600080fd5b5061030661048e36600461162c565b61089f565b34801561049f57600080fd5b506102ad6108be565b3480156104b457600080fd5b506103066108d2565b3480156104c957600080fd5b506102e46108d8565b3480156104de57600080fd5b506103066108e7565b3480156104f357600080fd5b5061024a6108ed565b34801561050857600080fd5b50610280610517366004611717565b6108fc565b34801561052857600080fd5b50610280610537366004611717565b61094d565b34801561054857600080fd5b506102ad610557366004611774565b61096a565b34801561056857600080fd5b506102e461057736600461162c565b61098d565b34801561058857600080fd5b50610306610ca1565b34801561059d57600080fd5b50610306610ca7565b3480156105b257600080fd5b506102806105c136600461162c565b610cad565b3480156105d257600080fd5b506103066105e136600461166b565b610cc2565b3480156105f257600080fd5b506102ad610601366004611742565b610ced565b34801561061257600080fd5b506102ad61062136600461166b565b610d47565b34801561063257600080fd5b506102ad6106413660046116e3565b610d7d565b34801561065257600080fd5b506102ad61066136600461162c565b610db0565b34801561067257600080fd5b50610306610dea565b60606003805461068a90611c57565b80601f01602080910402602001604051908101604052809291908181526020018280546106b690611c57565b80156107035780601f106106d857610100808354040283529160200191610703565b820191906000526020600020905b8154815290600101906020018083116106e657829003601f168201915b5050505050905090565b600080610718610df0565b9050610725818585610df4565b5060019392505050565b610737610ea8565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b61076a610ea8565b600f805460ff1916911515919091179055565b6011546001600160a01b031681565b60025490565b61079a610ea8565b600d55565b600c5481565b6000806107b0610df0565b90506107bd858285610ee7565b6107c8858585610f31565b506001949350505050565b601290565b6000806107e3610df0565b90506107258185856107f58589610cc2565b6107ff9190611be9565b610df4565b61080c610ea8565b601055565b6012546001600160a01b031681565b60086020526000908152604090205460ff1681565b600f5460ff1681565b610846610ea8565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6007546001600160a01b031681565b6006546001600160a01b031681565b601254600160a81b900460ff1681565b6001600160a01b0381166000908152602081905260409020545b919050565b6108c6610ea8565b6108d0600061113a565b565b600b5481565b6005546001600160a01b031690565b6103e881565b60606004805461068a90611c57565b600080610907610df0565b905060006109158286610cc2565b9050838110156109405760405162461bcd60e51b815260040161093790611b19565b60405180910390fd5b6107c88286868403610df4565b600061096161095a610df0565b8484610f31565b50600192915050565b610972610ea8565b600a829055600b8190556109868183611be9565b600c555050565b6000610997610ea8565b6000829050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d557600080fd5b505afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d919061164f565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5557600080fd5b505afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d919061164f565b6040518363ffffffff1660e01b8152600401610aaa9291906117ef565b60206040518083038186803b158015610ac257600080fd5b505afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa919061164f565b91506001600160a01b038216610c6d57806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4357600080fd5b505afa158015610b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7b919061164f565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610bc357600080fd5b505afa158015610bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bfb919061164f565b6040518363ffffffff1660e01b8152600401610c189291906117ef565b602060405180830381600087803b158015610c3257600080fd5b505af1158015610c46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6a919061164f565b91505b601280546001600160a01b038085166001600160a01b03199283161790925560118054939092169216919091179055919050565b600a5481565b60105481565b600e6020526000908152604090205460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610cf5610ea8565b6012805460ff60a81b1916600160a81b831515021790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1290610d3c908390611809565b60405180910390a150565b610d4f610ea8565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b610d85610ea8565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610db8610ea8565b6001600160a01b038116610dde5760405162461bcd60e51b8152600401610937906118aa565b610de78161113a565b50565b600d5481565b3390565b6001600160a01b038316610e1a5760405162461bcd60e51b815260040161093790611aaa565b6001600160a01b038216610e405760405162461bcd60e51b8152600401610937906118f0565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e9b908590611b5e565b60405180910390a3505050565b610eb0610df0565b6001600160a01b0316610ec16108d8565b6001600160a01b0316146108d05760405162461bcd60e51b815260040161093790611a02565b6000610ef38484610cc2565b90506000198114610f2b5781811015610f1e5760405162461bcd60e51b81526004016109379061195d565b610f2b8484848403610df4565b50505050565b6001600160a01b03831660009081526009602052604090205460ff1615610f6a5760405162461bcd60e51b815260040161093790611932565b6001600160a01b03821660009081526009602052604090205460ff1615610fa35760405162461bcd60e51b815260040161093790611a7c565b600f5460ff1615610fc65760405162461bcd60e51b8152600401610937906119da565b601254600160a01b900460ff1615610fe857610fe383838361118c565b611135565b6000610ff33061089f565b601054909150811080159081906110145750601254600160a01b900460ff16155b801561102e57506012546001600160a01b03868116911614155b80156110435750601254600160a81b900460ff165b156110535761105360105461128d565b6001600160a01b03851660009081526008602052604090205460ff1615801561109557506001600160a01b03841660009081526008602052604090205460ff16155b156110d25760006103e8600c54856110ad9190611c21565b6110b79190611c01565b90506110c38185611c40565b93506110d086308361118c565b505b6001600160a01b0384166000908152600e602052604090205460ff1661112757600d54836110ff8661089f565b6111099190611be9565b11156111275760405162461bcd60e51b815260040161093790611aee565b61113285858561118c565b50505b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166111b25760405162461bcd60e51b815260040161093790611a37565b6001600160a01b0382166111d85760405162461bcd60e51b815260040161093790611867565b6111e3838383611135565b6001600160a01b0383166000908152602081905260409020548181101561121c5760405162461bcd60e51b815260040161093790611994565b6001600160a01b0380851660008181526020819052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061127a908690611b5e565b60405180910390a3610f2b848484611135565b6012805460ff60a01b1916600160a01b179055476112aa8261145e565b60006112b68247611c40565b90506000600c54600a54836112cb9190611c21565b6112d59190611c01565b905060006112e38284611c40565b6006546040519192506000916001600160a01b03909116908490611306906117d8565b60006040518083038185875af1925050503d8060008114611343576040519150601f19603f3d011682016040523d82523d6000602084013e611348565b606091505b50909150508015611399576006546040517fb3a7eb63b41c90c3a13e7d791bc37682793f3cbf70ee7cba22735c2ded2fe40f916113909186916001600160a01b031690611b67565b60405180910390a15b6007546040516001600160a01b039091169083906113b6906117d8565b60006040518083038185875af1925050503d80600081146113f3576040519150601f19603f3d011682016040523d82523d6000602084013e6113f8565b606091505b50909150508015611449576007546040517fb3a7eb63b41c90c3a13e7d791bc37682793f3cbf70ee7cba22735c2ded2fe40f916114409185916001600160a01b031690611b67565b60405180910390a15b50506012805460ff60a01b1916905550505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106114a157634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152601154604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156114f557600080fd5b505afa158015611509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152d919061164f565b8160018151811061154e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526011546115749130911684610df4565b60115460405163791ac94760e01b81526001600160a01b039091169063791ac947906115ad908590600090869030904290600401611b9f565b600060405180830381600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611610929190611b7e565b60405180910390a15050565b803580151581146108b957600080fd5b60006020828403121561163d578081fd5b813561164881611ca8565b9392505050565b600060208284031215611660578081fd5b815161164881611ca8565b6000806040838503121561167d578081fd5b823561168881611ca8565b9150602083013561169881611ca8565b809150509250929050565b6000806000606084860312156116b7578081fd5b83356116c281611ca8565b925060208401356116d281611ca8565b929592945050506040919091013590565b600080604083850312156116f5578182fd5b823561170081611ca8565b915061170e6020840161161c565b90509250929050565b60008060408385031215611729578182fd5b823561173481611ca8565b946020939093013593505050565b600060208284031215611753578081fd5b6116488261161c565b60006020828403121561176d578081fd5b5035919050565b60008060408385031215611786578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156117cd5781516001600160a01b0316875295820195908201906001016117a8565b509495945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6000602080835283518082850152825b8181101561184057858101830151858201604001528201611824565b818111156118515783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526011908201527014d95b99195c881a5cc8189b1bd8dad959607a1b604082015260600190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600e908201526d151c98591a5b99c81c185d5cd95960921b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b602080825260149082015273149958da5c1a595b9d081a5cc8189b1bd8dad95960621b604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526011908201527013585e081a1bdb191a5b99c81b1a5b5a5d607a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b600083825260406020830152611b976040830184611795565b949350505050565b600086825285602083015260a06040830152611bbe60a0830186611795565b6001600160a01b0394909416606083015250608001529392505050565b60ff91909116815260200190565b60008219821115611bfc57611bfc611c92565b500190565b600082611c1c57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611c3b57611c3b611c92565b500290565b600082821015611c5257611c52611c92565b500390565b600281046001821680611c6b57607f821691505b60208210811415611c8c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610de757600080fdfea2646970667358221220091a2001292d8f26f5ed1a30cb2c93511026f858d4212e07690f4aa3c224190e64736f6c63430008000033

Deployed Bytecode Sourcemap

355:6968:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2158:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4444:197;;;;;;;;;;-1:-1:-1;4444:197:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3055:121:5:-;;;;;;;;;;-1:-1:-1;3055:121:5;;;;;:::i;:::-;;:::i;:::-;;2663:102;;;;;;;;;;-1:-1:-1;2663:102:5;;;;;:::i;:::-;;:::i;1067:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3255:106:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2560:97:5:-;;;;;;;;;;-1:-1:-1;2560:97:5;;;;;:::i;:::-;;:::i;769:53::-;;;;;;;;;;;;;:::i;5203:256:1:-;;;;;;;;;;-1:-1:-1;5203:256:1;;;;;:::i;:::-;;:::i;3104:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5854:234::-;;;;;;;;;;-1:-1:-1;5854:234:1;;;;;:::i;:::-;;:::i;3721:120:5:-;;;;;;;;;;-1:-1:-1;3721:120:5;;;;;:::i;:::-;;:::i;1114:28::-;;;;;;;;;;;;;:::i;585:50::-;;;;;;;;;;-1:-1:-1;585:50:5;;;;;:::i;:::-;;:::i;964:25::-;;;;;;;;;;;;;:::i;2771:136::-;;;;;;;;;;-1:-1:-1;2771:136:5;;;;;:::i;:::-;;:::i;491:87::-;;;;;;;;;;;;;:::i;400:85::-;;;;;;;;;;;;;:::i;1166:23::-;;;;;;;;;;;;;:::i;3419:125:1:-;;;;;;;;;;-1:-1:-1;3419:125:1;;;;;:::i;:::-;;:::i;1824:101:0:-;;;;;;;;;;;;;:::i;730:33:5:-;;;;;;;;;;;;;:::i;1201:85:0:-;;;;;;;;;;;;;:::i;828:42:5:-;;;;;;;;;;;;;:::i;2369:102:1:-;;;;;;;;;;;;;:::i;6575:427::-;;;;;;;;;;-1:-1:-1;6575:427:1;;;;;:::i;:::-;;:::i;4558:164:5:-;;;;;;;;;;-1:-1:-1;4558:164:5;;;;;:::i;:::-;;:::i;3182:204::-;;;;;;;;;;-1:-1:-1;3182:204:5;;;;;:::i;:::-;;:::i;3847:670::-;;;;;;;;;;-1:-1:-1;3847:670:5;;;;;:::i;:::-;;:::i;693:31::-;;;;;;;;;;;;;:::i;996:64::-;;;;;;;;;;;;;:::i;907:50::-;;;;;;;;;;-1:-1:-1;907:50:5;;;;;:::i;:::-;;:::i;3987:149:1:-;;;;;;;;;;-1:-1:-1;3987:149:1;;;;;:::i;:::-;;:::i;3577:138:5:-;;;;;;;;;;-1:-1:-1;3577:138:5;;;;;:::i;:::-;;:::i;3392:179::-;;;;;;;;;;-1:-1:-1;3392:179:5;;;;;:::i;:::-;;:::i;2913:136::-;;;;;;;;;;-1:-1:-1;2913:136:5;;;;;:::i;:::-;;:::i;2074:198:0:-;;;;;;;;;;-1:-1:-1;2074:198:0;;;;;:::i;:::-;;:::i;877:24:5:-;;;;;;;;;;;;;:::i;2158:98:1:-;2212:13;2244:5;2237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2158:98;:::o;4444:197::-;4527:4;4543:13;4559:12;:10;:12::i;:::-;4543:28;;4581:32;4590:5;4597:7;4606:6;4581:8;:32::i;:::-;-1:-1:-1;4630:4:1;;4444:197;-1:-1:-1;;;4444:197:1:o;3055:121:5:-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;3139:19:5;;;::::1;;::::0;;;:10:::1;:19;::::0;;;;:30;;-1:-1:-1;;3139:30:5::1;::::0;::::1;;::::0;;;::::1;::::0;;3055:121::o;2663:102::-;1094:13:0;:11;:13::i;:::-;2734::5::1;:24:::0;;-1:-1:-1;;2734:24:5::1;::::0;::::1;;::::0;;;::::1;::::0;;2663:102::o;1067:41::-;;;-1:-1:-1;;;;;1067:41:5;;:::o;3255:106:1:-;3342:12;;3255:106;:::o;2560:97:5:-;1094:13:0;:11;:13::i;:::-;2630:9:5::1;:20:::0;2560:97::o;769:53::-;;;;:::o;5203:256:1:-;5300:4;5316:15;5334:12;:10;:12::i;:::-;5316:30;;5356:38;5372:4;5378:7;5387:6;5356:15;:38::i;:::-;5404:27;5414:4;5420:2;5424:6;5404:9;:27::i;:::-;-1:-1:-1;5448:4:1;;5203:256;-1:-1:-1;;;;5203:256:1:o;3104:91::-;3186:2;3104:91;:::o;5854:234::-;5942:4;5958:13;5974:12;:10;:12::i;:::-;5958:28;;5996:64;6005:5;6012:7;6049:10;6021:25;6031:5;6038:7;6021:9;:25::i;:::-;:38;;;;:::i;:::-;5996:8;:64::i;3721:120:5:-;1094:13:0;:11;:13::i;:::-;3800:23:5::1;:34:::0;3721:120::o;1114:28::-;;;-1:-1:-1;;;;;1114:28:5;;:::o;585:50::-;;;;;;;;;;;;;;;:::o;964:25::-;;;;;;:::o;2771:136::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;2863:26:5;;;::::1;;::::0;;;:17:::1;:26;::::0;;;;:37;;-1:-1:-1;;2863:37:5::1;::::0;::::1;;::::0;;;::::1;::::0;;2771:136::o;491:87::-;;;-1:-1:-1;;;;;491:87:5;;:::o;400:85::-;;;-1:-1:-1;;;;;400:85:5;;:::o;1166:23::-;;;-1:-1:-1;;;1166:23:5;;;;;:::o;3419:125:1:-;-1:-1:-1;;;;;3519:18:1;;3493:7;3519:18;;;;;;;;;;;3419:125;;;;:::o;1824:101:0:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;730:33:5:-;;;;:::o;1201:85:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;1201:85;:::o;828:42:5:-;866:4;828:42;:::o;2369:102:1:-;2425:13;2457:7;2450:14;;;;;:::i;6575:427::-;6668:4;6684:13;6700:12;:10;:12::i;:::-;6684:28;;6722:24;6749:25;6759:5;6766:7;6749:9;:25::i;:::-;6722:52;;6812:15;6792:16;:35;;6784:85;;;;-1:-1:-1;;;6784:85:1;;;;;;;:::i;:::-;;;;;;;;;6903:60;6912:5;6919:7;6947:15;6928:16;:34;6903:8;:60::i;4558:164:5:-;4636:4;4652:42;4662:12;:10;:12::i;:::-;4676:9;4687:6;4652:9;:42::i;:::-;-1:-1:-1;4711:4:5;4558:164;;;;:::o;3182:204::-;1094:13:0;:11;:13::i;:::-;3270:11:5::1;:25:::0;;;3305:13:::1;:26:::0;;;3352:27:::1;3321:10:::0;3284:11;3352:27:::1;:::i;:::-;3341:8;:38:::0;-1:-1:-1;;3182:204:5:o;3847:670::-;3920:22;1094:13:0;:11;:13::i;:::-;3955:35:5::1;4012:16;3955:74;;4075:16;-1:-1:-1::0;;;;;4075:24:5::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4057:53:5::1;;4119:4;4126:16;-1:-1:-1::0;;;;;4126:21:5::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4057:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4040:110:::0;-1:-1:-1;;;;;;4164:28:5;::::1;4161:217;;4276:16;-1:-1:-1::0;;;;;4276:24:5::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4258:69:5::1;;4336:4;4343:16;-1:-1:-1::0;;;;;4343:21:5::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4258:109;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4241:126;;4161:217;4388:13;:30:::0;;-1:-1:-1;;;;;4388:30:5;;::::1;-1:-1:-1::0;;;;;;4388:30:5;;::::1;;::::0;;;4451:15:::1;:34:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;4404:14;3847:670;-1:-1:-1;3847:670:5:o;693:31::-;;;;:::o;996:64::-;;;;:::o;907:50::-;;;;;;;;;;;;;;;:::o;3987:149:1:-;-1:-1:-1;;;;;4102:18:1;;;4076:7;4102:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3987:149::o;3577:138:5:-;1094:13:0;:11;:13::i;:::-;3643:11:5::1;:22:::0;;-1:-1:-1;;;;3643:22:5::1;-1:-1:-1::0;;;3643:22:5;::::1;;;;::::0;;3680:28:::1;::::0;::::1;::::0;::::1;::::0;3643:22;;3680:28:::1;:::i;:::-;;;;;;;;3577:138:::0;:::o;3392:179::-;1094:13:0;:11;:13::i;:::-;3488:8:5::1;:31:::0;;-1:-1:-1;;;;;3488:31:5;;::::1;-1:-1:-1::0;;;;;;3488:31:5;;::::1;;::::0;;;3529:10:::1;:35:::0;;;;;::::1;::::0;::::1;;::::0;;3392:179::o;2913:136::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;3005:26:5;;;::::1;;::::0;;;:17:::1;:26;::::0;;;;:37;;-1:-1:-1;;3005:37:5::1;::::0;::::1;;::::0;;;::::1;::::0;;2913:136::o;2074:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:0;::::1;2154:73;;;;-1:-1:-1::0;;;2154:73:0::1;;;;;;;:::i;:::-;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;877:24:5:-;;;;:::o;640:96:4:-;719:10;640:96;:::o;10457:340:1:-;-1:-1:-1;;;;;10558:19:1;;10550:68;;;;-1:-1:-1;;;10550:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10636:21:1;;10628:68;;;;-1:-1:-1;;;10628:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10707:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;10758:32;;;;;10737:6;;10758:32;:::i;:::-;;;;;;;;10457:340;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;-1:-1:-1;;;;;1422:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1422:23:0;;1414:68;;;;-1:-1:-1;;;1414:68:0;;;;;;;:::i;11078:411:1:-;11178:24;11205:25;11215:5;11222:7;11205:9;:25::i;:::-;11178:52;;-1:-1:-1;;11244:16:1;:37;11240:243;;11325:6;11305:16;:26;;11297:68;;;;-1:-1:-1;;;11297:68:1;;;;;;;:::i;:::-;11407:51;11416:5;11423:7;11451:6;11432:16;:25;11407:8;:51::i;:::-;11078:411;;;;:::o;4728:1241:5:-;-1:-1:-1;;;;;4835:18:5;;;;;;:10;:18;;;;;;;;4834:19;4826:49;;;;-1:-1:-1;;;4826:49:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;4894:21:5;;;;;;:10;:21;;;;;;;;4893:22;4885:55;;;;-1:-1:-1;;;4885:55:5;;;;;;;:::i;:::-;4959:13;;;;4958:14;4950:40;;;;-1:-1:-1;;;4950:40:5;;;;;;;:::i;:::-;5004:6;;-1:-1:-1;;;5004:6:5;;;;5001:962;;;5034:42;5050:6;5058:9;5069:6;5034:15;:42::i;:::-;5090:7;;5001:962;5143:28;5174:24;5192:4;5174:9;:24::i;:::-;5267:23;;5143:55;;-1:-1:-1;5243:47:5;;;;;;;5309:34;;-1:-1:-1;5337:6:5;;-1:-1:-1;;;5337:6:5;;;;5336:7;5309:34;:61;;;;-1:-1:-1;5357:13:5;;-1:-1:-1;;;;;5347:23:5;;;5357:13;;5347:23;;5309:61;:76;;;;-1:-1:-1;5374:11:5;;-1:-1:-1;;;5374:11:5;;;;5309:76;5305:172;;;5417:45;5438:23;;5417:20;:45::i;:::-;-1:-1:-1;;;;;5495:25:5;;;;;;:17;:25;;;;;;;;5494:26;:59;;;;-1:-1:-1;;;;;;5525:28:5;;;;;;:17;:28;;;;;;;;5524:29;5494:59;5491:252;;;5573:17;866:4;5602:8;;5593:6;:17;;;;:::i;:::-;:31;;;;:::i;:::-;5573:51;-1:-1:-1;5642:19:5;5573:51;5642:19;;:::i;:::-;;;5679:49;5695:6;5711:4;5718:9;5679:15;:49::i;:::-;5491:252;;-1:-1:-1;;;;;5762:28:5;;;;;;:17;:28;;;;;;;;5757:139;;5850:9;;5840:6;5817:20;5827:9;5817;:20::i;:::-;:29;;;;:::i;:::-;:42;;5809:72;;;;-1:-1:-1;;;5809:72:5;;;;;;;:::i;:::-;5910:42;5926:6;5934:9;5945:6;5910:15;:42::i;:::-;5001:962;;;4728:1241;;;:::o;2426:187:0:-;2518:6;;;-1:-1:-1;;;;;2534:17:0;;;-1:-1:-1;;;;;;2534:17:0;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2426:187;;:::o;7456:788:1:-;-1:-1:-1;;;;;7552:18:1;;7544:68;;;;-1:-1:-1;;;7544:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7630:16:1;;7622:64;;;;-1:-1:-1;;;7622:64:1;;;;;;;:::i;:::-;7697:38;7718:4;7724:2;7728:6;7697:20;:38::i;:::-;-1:-1:-1;;;;;7768:15:1;;7746:19;7768:15;;;;;;;;;;;7801:21;;;;7793:72;;;;-1:-1:-1;;;7793:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7899:15:1;;;:9;:15;;;;;;;;;;;7917:20;;;7899:38;;8114:13;;;;;;;;;;:23;;;;;;8163:26;;;;;;7931:6;;8163:26;:::i;:::-;;;;;;;;8200:37;8220:4;8226:2;8230:6;8200:19;:37::i;5975:699:5:-;1449:6;:13;;-1:-1:-1;;;;1449:13:5;-1:-1:-1;;;1449:13:5;;;6077:21:::1;6108:24;6125:6:::0;6108:16:::1;:24::i;:::-;6142:19;6164:38;6188:14:::0;6164:21:::1;:38;:::i;:::-;6142:60;;6213:19;6263:8;;6249:11;;6235;:25;;;;:::i;:::-;:36;;;;:::i;:::-;6213:58:::0;-1:-1:-1;6281:21:5::1;6305:25;6213:58:::0;6305:11;:25:::1;:::i;:::-;6384:8;::::0;6376:46:::1;::::0;6281:49;;-1:-1:-1;6341:12:5::1;::::0;-1:-1:-1;;;;;6384:8:5;;::::1;::::0;6406:11;;6376:46:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;6363:59:5;;-1:-1:-1;;6432:75:5;::::1;;;6487:8;::::0;6464:32:::1;::::0;::::1;::::0;::::1;::::0;6474:11;;-1:-1:-1;;;;;6487:8:5::1;::::0;6464:32:::1;:::i;:::-;;;;;;;;6432:75;6537:10;::::0;6529:50:::1;::::0;-1:-1:-1;;;;;6537:10:5;;::::1;::::0;6561:13;;6529:50:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;6516:63:5;;-1:-1:-1;;6589:79:5;::::1;;;6646:10;::::0;6621:36:::1;::::0;::::1;::::0;::::1;::::0;6631:13;;-1:-1:-1;;;;;6646:10:5::1;::::0;6621:36:::1;:::i;:::-;;;;;;;;6589:79;-1:-1:-1::0;;1483:6:5;:14;;-1:-1:-1;;;;1483:14:5;;;-1:-1:-1;;;;5975:699:5:o;6680:640::-;6828:16;;;6842:1;6828:16;;;;;;;;6804:21;;6828:16;;;;;;;;;;-1:-1:-1;6828:16:5;6804:40;;6872:4;6854;6859:1;6854:7;;;;;;-1:-1:-1;;;6854:7:5;;;;;;;;;-1:-1:-1;;;;;6854:23:5;;;:7;;;;;;;;;;:23;;;;6897:15;;:22;;;-1:-1:-1;;;6897:22:5;;;;:15;;;;;:20;;:22;;;;;6854:7;;6897:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6887:4;6892:1;6887:7;;;;;;-1:-1:-1;;;6887:7:5;;;;;;;;;-1:-1:-1;;;;;6887:32:5;;;:7;;;;;;;;;:32;6962:15;;6930:62;;6947:4;;6962:15;6980:11;6930:8;:62::i;:::-;7028:15;;:234;;-1:-1:-1;;;7028:234:5;;-1:-1:-1;;;;;7028:15:5;;;;:66;;:234;;7108:11;;7028:15;;7176:4;;7202;;7237:15;;7028:234;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:35;7295:11;7308:4;7278:35;;;;;;;:::i;:::-;;;;;;;;6680:640;;:::o;14:162:9:-;81:20;;137:13;;130:21;120:32;;110:2;;166:1;163;156:12;181:259;;293:2;281:9;272:7;268:23;264:32;261:2;;;314:6;306;299:22;261:2;358:9;345:23;377:33;404:5;377:33;:::i;:::-;429:5;251:189;-1:-1:-1;;;251:189:9:o;445:263::-;;568:2;556:9;547:7;543:23;539:32;536:2;;;589:6;581;574:22;536:2;626:9;620:16;645:33;672:5;645:33;:::i;713:402::-;;;842:2;830:9;821:7;817:23;813:32;810:2;;;863:6;855;848:22;810:2;907:9;894:23;926:33;953:5;926:33;:::i;:::-;978:5;-1:-1:-1;1035:2:9;1020:18;;1007:32;1048:35;1007:32;1048:35;:::i;:::-;1102:7;1092:17;;;800:315;;;;;:::o;1120:470::-;;;;1266:2;1254:9;1245:7;1241:23;1237:32;1234:2;;;1287:6;1279;1272:22;1234:2;1331:9;1318:23;1350:33;1377:5;1350:33;:::i;:::-;1402:5;-1:-1:-1;1459:2:9;1444:18;;1431:32;1472:35;1431:32;1472:35;:::i;:::-;1224:366;;1526:7;;-1:-1:-1;;;1580:2:9;1565:18;;;;1552:32;;1224:366::o;1595:329::-;;;1721:2;1709:9;1700:7;1696:23;1692:32;1689:2;;;1742:6;1734;1727:22;1689:2;1786:9;1773:23;1805:33;1832:5;1805:33;:::i;:::-;1857:5;-1:-1:-1;1881:37:9;1914:2;1899:18;;1881:37;:::i;:::-;1871:47;;1679:245;;;;;:::o;1929:327::-;;;2058:2;2046:9;2037:7;2033:23;2029:32;2026:2;;;2079:6;2071;2064:22;2026:2;2123:9;2110:23;2142:33;2169:5;2142:33;:::i;:::-;2194:5;2246:2;2231:18;;;;2218:32;;-1:-1:-1;;;2016:240:9:o;2261:192::-;;2370:2;2358:9;2349:7;2345:23;2341:32;2338:2;;;2391:6;2383;2376:22;2338:2;2419:28;2437:9;2419:28;:::i;2458:190::-;;2570:2;2558:9;2549:7;2545:23;2541:32;2538:2;;;2591:6;2583;2576:22;2538:2;-1:-1:-1;2619:23:9;;2528:120;-1:-1:-1;2528:120:9:o;2653:258::-;;;2782:2;2770:9;2761:7;2757:23;2753:32;2750:2;;;2803:6;2795;2788:22;2750:2;-1:-1:-1;;2831:23:9;;;2901:2;2886:18;;;2873:32;;-1:-1:-1;2740:171:9:o;2916:469::-;;3013:5;3007:12;3040:6;3035:3;3028:19;3066:4;3095:2;3090:3;3086:12;3079:19;;3132:2;3125:5;3121:14;3153:3;3165:195;3179:6;3176:1;3173:13;3165:195;;;3244:13;;-1:-1:-1;;;;;3240:39:9;3228:52;;3300:12;;;;3335:15;;;;3276:1;3194:9;3165:195;;;-1:-1:-1;3376:3:9;;2983:402;-1:-1:-1;;;;;2983:402:9:o;3390:205::-;3590:3;3581:14::o;3600:203::-;-1:-1:-1;;;;;3764:32:9;;;;3746:51;;3734:2;3719:18;;3701:102::o;4032:304::-;-1:-1:-1;;;;;4262:15:9;;;4244:34;;4314:15;;4309:2;4294:18;;4287:43;4194:2;4179:18;;4161:175::o;4341:187::-;4506:14;;4499:22;4481:41;;4469:2;4454:18;;4436:92::o;4768:603::-;;4909:2;4938;4927:9;4920:21;4970:6;4964:13;5013:6;5008:2;4997:9;4993:18;4986:34;5038:4;5051:140;5065:6;5062:1;5059:13;5051:140;;;5160:14;;;5156:23;;5150:30;5126:17;;;5145:2;5122:26;5115:66;5080:10;;5051:140;;;5209:6;5206:1;5203:13;5200:2;;;5279:4;5274:2;5265:6;5254:9;5250:22;5246:31;5239:45;5200:2;-1:-1:-1;5355:2:9;5334:15;-1:-1:-1;;5330:29:9;5315:45;;;;5362:2;5311:54;;4889:482;-1:-1:-1;;;4889:482:9:o;5376:399::-;5578:2;5560:21;;;5617:2;5597:18;;;5590:30;5656:34;5651:2;5636:18;;5629:62;-1:-1:-1;;;5722:2:9;5707:18;;5700:33;5765:3;5750:19;;5550:225::o;5780:402::-;5982:2;5964:21;;;6021:2;6001:18;;;5994:30;6060:34;6055:2;6040:18;;6033:62;-1:-1:-1;;;6126:2:9;6111:18;;6104:36;6172:3;6157:19;;5954:228::o;6187:398::-;6389:2;6371:21;;;6428:2;6408:18;;;6401:30;6467:34;6462:2;6447:18;;6440:62;-1:-1:-1;;;6533:2:9;6518:18;;6511:32;6575:3;6560:19;;6361:224::o;6590:341::-;6792:2;6774:21;;;6831:2;6811:18;;;6804:30;-1:-1:-1;;;6865:2:9;6850:18;;6843:47;6922:2;6907:18;;6764:167::o;6936:353::-;7138:2;7120:21;;;7177:2;7157:18;;;7150:30;7216:31;7211:2;7196:18;;7189:59;7280:2;7265:18;;7110:179::o;7294:402::-;7496:2;7478:21;;;7535:2;7515:18;;;7508:30;7574:34;7569:2;7554:18;;7547:62;-1:-1:-1;;;7640:2:9;7625:18;;7618:36;7686:3;7671:19;;7468:228::o;7701:338::-;7903:2;7885:21;;;7942:2;7922:18;;;7915:30;-1:-1:-1;;;7976:2:9;7961:18;;7954:44;8030:2;8015:18;;7875:164::o;8044:356::-;8246:2;8228:21;;;8265:18;;;8258:30;8324:34;8319:2;8304:18;;8297:62;8391:2;8376:18;;8218:182::o;8405:401::-;8607:2;8589:21;;;8646:2;8626:18;;;8619:30;8685:34;8680:2;8665:18;;8658:62;-1:-1:-1;;;8751:2:9;8736:18;;8729:35;8796:3;8781:19;;8579:227::o;8811:344::-;9013:2;8995:21;;;9052:2;9032:18;;;9025:30;-1:-1:-1;;;9086:2:9;9071:18;;9064:50;9146:2;9131:18;;8985:170::o;9160:400::-;9362:2;9344:21;;;9401:2;9381:18;;;9374:30;9440:34;9435:2;9420:18;;9413:62;-1:-1:-1;;;9506:2:9;9491:18;;9484:34;9550:3;9535:19;;9334:226::o;9565:341::-;9767:2;9749:21;;;9806:2;9786:18;;;9779:30;-1:-1:-1;;;9840:2:9;9825:18;;9818:47;9897:2;9882:18;;9739:167::o;9911:401::-;10113:2;10095:21;;;10152:2;10132:18;;;10125:30;10191:34;10186:2;10171:18;;10164:62;-1:-1:-1;;;10257:2:9;10242:18;;10235:35;10302:3;10287:19;;10085:227::o;10317:177::-;10463:25;;;10451:2;10436:18;;10418:76::o;10499:282::-;10681:25;;;-1:-1:-1;;;;;10742:32:9;10737:2;10722:18;;10715:60;10669:2;10654:18;;10636:145::o;10786:338::-;;10993:6;10982:9;10975:25;11036:2;11031;11020:9;11016:18;11009:30;11056:62;11114:2;11103:9;11099:18;11091:6;11056:62;:::i;:::-;11048:70;10965:159;-1:-1:-1;;;;10965:159:9:o;11129:588::-;;11428:6;11417:9;11410:25;11471:6;11466:2;11455:9;11451:18;11444:34;11514:3;11509:2;11498:9;11494:18;11487:31;11535:63;11593:3;11582:9;11578:19;11570:6;11535:63;:::i;:::-;-1:-1:-1;;;;;11634:32:9;;;;11629:2;11614:18;;11607:60;-1:-1:-1;11698:3:9;11683:19;11676:35;11527:71;11400:317;-1:-1:-1;;;11400:317:9:o;11722:184::-;11894:4;11882:17;;;;11864:36;;11852:2;11837:18;;11819:87::o;11911:128::-;;11982:1;11978:6;11975:1;11972:13;11969:2;;;11988:18;;:::i;:::-;-1:-1:-1;12024:9:9;;11959:80::o;12044:217::-;;12110:1;12100:2;;-1:-1:-1;;;12135:31:9;;12189:4;12186:1;12179:15;12217:4;12142:1;12207:15;12100:2;-1:-1:-1;12246:9:9;;12090:171::o;12266:168::-;;12372:1;12368;12364:6;12360:14;12357:1;12354:21;12349:1;12342:9;12335:17;12331:45;12328:2;;;12379:18;;:::i;:::-;-1:-1:-1;12419:9:9;;12318:116::o;12439:125::-;;12507:1;12504;12501:8;12498:2;;;12512:18;;:::i;:::-;-1:-1:-1;12549:9:9;;12488:76::o;12569:380::-;12654:1;12644:12;;12701:1;12691:12;;;12712:2;;12766:4;12758:6;12754:17;12744:27;;12712:2;12819;12811:6;12808:14;12788:18;12785:38;12782:2;;;12865:10;12860:3;12856:20;12853:1;12846:31;12900:4;12897:1;12890:15;12928:4;12925:1;12918:15;12782:2;;12624:325;;;:::o;12954:127::-;13015:10;13010:3;13006:20;13003:1;12996:31;13046:4;13043:1;13036:15;13070:4;13067:1;13060:15;13086:133;-1:-1:-1;;;;;13163:31:9;;13153:42;;13143:2;;13209:1;13206;13199:12

Swarm Source

ipfs://091a2001292d8f26f5ed1a30cb2c93511026f858d4212e07690f4aa3c224190e
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.