ETH Price: $2,094.61 (-11.70%)

Token

YieldFu (FU)
 

Overview

Max Total Supply

880,026,367.175529188 FU

Holders

61

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
966,292.71199202 FU

Value
$0.00
0x7a724f891be6c0370C68E575A831EA963A65B8DA
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:
YieldFu

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-28
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.18;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

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

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

interface InterfaceLP {
    function sync() external;
}

abstract contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor(
        string memory tokenName,
        string memory tokenSymbol,
        uint8 tokenDecimals
    ) {
        _name = tokenName;
        _symbol = tokenSymbol;
        _decimals = tokenDecimals;
    }

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

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

    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}


/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) internal _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

interface IDEXFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

interface IDEXRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);
    
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

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

    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
    returns (uint[] memory amounts);
}

contract YieldFu is ERC20Detailed, AccessControl {
    bytes32 public constant TOKEN_MANAGER = keccak256("TOKEN_MANAGER");
    bytes32 public constant UNRESTRICTED = keccak256("UNRESTRICTED");
    
    event LogRebase(uint256 totalSupply);

    modifier validRecipient(address to) {
        require(to != address(0x0));
        _;
    }

    uint256 private constant DECIMALS = 9;
    uint256 private constant MAX_UINT256 = type(uint256).max;

    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    IDEXRouter immutable router;
    address[] public pairs;
    mapping(address => bool) public isPair;

    uint256 private constant INITIAL_FRAGMENTS_SUPPLY = 888_888_888_000 * 10**DECIMALS;
    uint256 private constant TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY);
    uint256 internal gonMaxWallet = (TOTAL_GONS / 100000) * 2;

    uint256 private constant MAX_SUPPLY = type(uint128).max;

    uint256 private _totalSupply;
    uint256 private _excessSupply;
    uint256 private _gonsPerFragment;
    mapping(address => uint256) private _gonBalances;

    mapping(address => mapping(address => uint256)) private _allowedFragments;
    
    bool public autoRebase = true;
    uint256 public autoRebasePercent = 125;
    uint256 autoRebaseTimer = 1 hours;
    uint256 public lastRebase = 0;

    bool private inSwap = false;
    bool private swapEnabled = false;
    uint256 public immutable _maxSwap;
    address immutable treasury;

    uint256 internal launched;
    bool internal generalTrading = false;

    modifier lockSwap {
        inSwap = true;
        _;
        inSwap = false;
    }
    
    function runAutoRebase() public {
        uint256 elapsed = block.timestamp - lastRebase;
        uint256 cycles = elapsed / autoRebaseTimer;
        if (autoRebase && cycles > 0) {
            rebase(-int256((_totalSupply * autoRebasePercent * cycles) / 100000), false);
            lastRebase = block.timestamp - (elapsed % autoRebaseTimer);
        }
    }
    
    function rebasePercent(uint256 _percent, bool up, bool priceChange) external onlyRole(TOKEN_MANAGER) returns (uint256) {
        if (up) {
            return rebase(int256((_totalSupply * _percent) / 100), priceChange);
        } else {
            return rebase(-int256((_totalSupply * _percent) / 100), priceChange);
        }
    }

    function rebase(int256 supplyDelta, bool priceChange)
        internal
        returns (uint256)
    {
        if (supplyDelta == 0) {
            emit LogRebase(_totalSupply);
            return _totalSupply;
        }

        if (supplyDelta < 0) {
            _totalSupply -= uint256(-supplyDelta);
        } else {
            _totalSupply += uint256(supplyDelta);
        }

        if (_totalSupply > MAX_SUPPLY) {
            _totalSupply = MAX_SUPPLY;
        }

        uint256 prev = _gonsPerFragment;
        
        _gonsPerFragment = TOTAL_GONS / _totalSupply;
        
        uint256 diff;
        for(uint256 i = 0; i < pairs.length; i++) {
            address pair = pairs[i];
            if(!priceChange) {
                if (supplyDelta < 0) {
                    diff = (_gonBalances[pair] / prev) - balanceOf(pair);
                    _gonBalances[pair] += diff * _gonsPerFragment;
                }
                else {
                    diff = balanceOf(pair) - (_gonBalances[pair] / prev);
                    _gonBalances[pair] -= diff * _gonsPerFragment;
                }
            } else {
                try InterfaceLP(pair).sync() {}
                catch {}
            }
        }

        emit LogRebase(_totalSupply);
        return _totalSupply;
    }

    constructor() ERC20Detailed("YieldFu", "FU", uint8(DECIMALS)) {
        lastRebase = block.timestamp;
        treasury = 0x192A4F559Ff5B8aE8D78914078f6F592055aB813;
        
        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(UNRESTRICTED, msg.sender);
        _grantRole(UNRESTRICTED, DEAD);
        _grantRole(UNRESTRICTED, address(this));
        
        _allowedFragments[address(this)][address(router)] = type(uint256).max;
        _allowedFragments[msg.sender][address(router)] = type(uint256).max;
        
        _totalSupply = INITIAL_FRAGMENTS_SUPPLY;
        _gonsPerFragment = TOTAL_GONS / _totalSupply;
        _gonBalances[address(this)] = TOTAL_GONS / 1000;
        _excessSupply = TOTAL_GONS - (TOTAL_GONS / 1000);

        _maxSwap = _totalSupply * 3 / 1000000;
        
        emit Transfer(address(0), address(this), _totalSupply / 1000);
    }
    
    function setAutoRebase(bool _auto, uint256 _percent, uint256 _timer) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_percent <= 5000);
        require(_timer >= 1 hours);
        autoRebase = _auto;
        autoRebasePercent = _percent;
        autoRebaseTimer = _timer;
    }
    
    function setAutoRebaseTimer(uint256 _timer) external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(_timer >= 1 hours);
        autoRebaseTimer = _timer;
    }

    function addLP(address _address) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(pairs.length < 10, "Too many pairs");
        pairs.push(_address);
        isPair[_address] = true;
    }

    function totalSupply() external view override returns (uint256) {
        return _totalSupply - _excessSupply / _gonsPerFragment;
    }

    function balanceOf(address who) public view override returns (uint256) {
        return _gonBalances[who] / _gonsPerFragment;
    }

    function transfer(address to, uint256 value)
        external
        override
        validRecipient(to)
        returns (bool)
    {
        _transferFrom(msg.sender, to, value);
        return true;
    }

    function allowance(address owner_, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowedFragments[owner_][spender];
    }

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external override validRecipient(to) returns (bool) {
        if (_allowedFragments[from][msg.sender] != type(uint256).max) {
            _allowedFragments[from][msg.sender] -= value;
        }

        _transferFrom(from, to, value);
        return true;
    }

    function getTax() internal view returns(uint256) {
        if(block.number - launched > 50) return 0;
        else if(block.number - launched > 4) return 3;
        else return 35;
    }

    function _transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        uint256 gonAmount = amount * _gonsPerFragment;
        uint256 taxAmount = 0;
        uint256 tax = getTax();
        if (!generalTrading) {
            require(hasRole(UNRESTRICTED, recipient) || hasRole(UNRESTRICTED, sender), "Try again shortly");
        }
        if (launched > 0) {
            if (tax > 0 && sender != address(this)) {
                taxAmount = gonAmount / 100 * tax;
                if(taxAmount>0){
                    _gonBalances[sender] -= taxAmount;
                    _gonBalances[address(this)] += taxAmount;
                }
            }

            if (!inSwap && isPair[recipient] && swapEnabled && sender != address(this)) {
                tokensToEth(amount);
            }

            if (!hasRole(UNRESTRICTED,sender) && !hasRole(UNRESTRICTED,recipient)) {
                runAutoRebase();
            }
        }

        _gonBalances[sender] -= (gonAmount-taxAmount);
        _gonBalances[recipient] += (gonAmount-taxAmount);
        
        emit Transfer(
            sender,
            recipient,
            (gonAmount-taxAmount) / _gonsPerFragment
        );
        return true;
    }

    function tokensToEth(uint256 tokenAmount) private lockSwap {
        uint256 bal = balanceOf(address(this));
        tokenAmount = tokenAmount / 3;
        if(tokenAmount > bal) tokenAmount = bal;
        if(tokenAmount > _maxSwap) tokenAmount = _maxSwap;

        if(tokenAmount > 0) {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = router.WETH();
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                path,
                address(this),
                block.timestamp
            );
        }

        clearETH();
    }

    function issueRewards(address to, uint256 amount) external onlyRole(TOKEN_MANAGER) {
        uint256 gonAmount = amount * _gonsPerFragment;
        _gonBalances[to] += gonAmount;
        _excessSupply -= gonAmount;
        emit Transfer(
            address(0),
            to,
            gonAmount / _gonsPerFragment
        );
    }
    
    function removeRewards(address from, uint256 amount) external onlyRole(TOKEN_MANAGER) {
        uint256 gonAmount = amount * _gonsPerFragment;
        if (_allowedFragments[from][msg.sender] != type(uint256).max) {
            _allowedFragments[from][msg.sender] -= amount;
        }
        _gonBalances[from] -= gonAmount;
        _excessSupply += gonAmount;
        emit Transfer(
            from,
            address(0),
            gonAmount / _gonsPerFragment
        );
    }

    function clearTax() external onlyRole(DEFAULT_ADMIN_ROLE) {
        tokensToEth(_maxSwap);
    }

    function clearETH() public {
        uint256 contractETHBalance = address(this).balance;
        if (contractETHBalance > 0) {
            bool success;
            (success, ) = treasury.call{value: contractETHBalance}("");
        }
    }

    function approve(address spender, uint256 value)
        external
        override
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool)
    {
        _allowedFragments[msg.sender][spender] += addedValue;
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool)
    {
        if (subtractedValue >= _allowedFragments[msg.sender][spender]) {
            _allowedFragments[msg.sender][spender] = 0;
        } else {
            _allowedFragments[msg.sender][spender] -= subtractedValue;
        }
        emit Approval(
            msg.sender,
            spender,
            _allowedFragments[msg.sender][spender]
        );
        return true;
    }

    function lp(address deliver) external payable onlyRole(DEFAULT_ADMIN_ROLE) {
        address uniswapV2Pair = IDEXFactory(router.factory()).createPair(address(this), router.WETH());
        addLP(uniswapV2Pair);
        router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,deliver,block.timestamp);

        swapEnabled = true;
    }

    function enableTax() external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(launched == 0);
        launched = block.number;
        lastRebase = block.timestamp;
    }

    function generalOpen() external onlyRole(DEFAULT_ADMIN_ROLE) {
        require(!generalTrading);
        launched = block.number;
        generalTrading = true;
        lastRebase = block.timestamp;
    }

    function setRoles(bytes32 role, address[] calldata wallets, bool active) external onlyRole(DEFAULT_ADMIN_ROLE) {
        for(uint256 i = 0; i < wallets.length; i++) {
            _roles[role].hasRole[wallets[i]] = active;
        }
    }

    function toggleSwap() external onlyRole(DEFAULT_ADMIN_ROLE) {
        swapEnabled = !swapEnabled;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return (TOTAL_GONS - (_gonBalances[DEAD] + _gonBalances[ZERO] + _excessSupply)) / _gonsPerFragment;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"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":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNRESTRICTED","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoRebase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoRebasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clearETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generalOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"issueRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastRebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deliver","type":"address"}],"name":"lp","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"up","type":"bool"},{"internalType":"bool","name":"priceChange","type":"bool"}],"name":"rebasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"removeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runAutoRebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_auto","type":"bool"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"uint256","name":"_timer","type":"uint256"}],"name":"setAutoRebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timer","type":"uint256"}],"name":"setAutoRebaseTimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","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":"toggleSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600480546001600160a01b031990811661dead17909155600580549091169055620186a0620000366009600a620005ae565b620000479064cef5e80ac0620005c3565b6200005590600019620005f3565b62000063906000196200060a565b6200006f919062000620565b6200007c906002620005c3565b600855600e805460ff19908116600117909155607d600f55610e1060105560006011556012805461ffff19169055601480549091169055348015620000c057600080fd5b50604051806040016040528060078152602001665969656c64467560c81b81525060405180604001604052806002815260200161465560f01b815250600982600090816200010f9190620006dc565b5060016200011e8382620006dc565b506002805460ff191660ff9290921691909117905550504260115573192a4f559ff5b8ae8d78914078f6f592055ab81360c052737a250d5630b4cf539739df2c5dacb4c659f2488d60805262000176600033620003e8565b506200019260008051602062002c0283398151915233620003e8565b50600454620001bb9060008051602062002c02833981519152906001600160a01b0316620003e8565b50620001d760008051602062002c0283398151915230620003e8565b50306000908152600d602081815260408084206080516001600160a01b03168086529083528185206000199081905533865293835281852090855290915290912055620002276009600a620005ae565b620002389064cef5e80ac0620005c3565b60098181556200024a90600a620005ae565b6200025b9064cef5e80ac0620005c3565b6200026990600019620005f3565b62000277906000196200060a565b62000283919062000620565b600b556103e8620002976009600a620005ae565b620002a89064cef5e80ac0620005c3565b620002b690600019620005f3565b620002c4906000196200060a565b620002d0919062000620565b306000908152600c60205260409020556103e8620002f16009600a620005ae565b620003029064cef5e80ac0620005c3565b6200031090600019620005f3565b6200031e906000196200060a565b6200032a919062000620565b620003386009600a620005ae565b620003499064cef5e80ac0620005c3565b6200035790600019620005f3565b62000365906000196200060a565b6200037191906200060a565b600a55600954620f42409062000389906003620005c3565b62000395919062000620565b60a05260095430906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003d1906103e89062000620565b60405190815260200160405180910390a3620007a8565b60008281526003602090815260408083206001600160a01b038516845290915281205460ff16620004915760008381526003602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620004483390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000495565b5060005b92915050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004f2578160001904821115620004d657620004d66200049b565b80851615620004e457918102915b93841c9390800290620004b6565b509250929050565b6000826200050b5750600162000495565b816200051a5750600062000495565b81600181146200053357600281146200053e576200055e565b600191505062000495565b60ff8411156200055257620005526200049b565b50506001821b62000495565b5060208310610133831016604e8410600b841016171562000583575081810a62000495565b6200058f8383620004b1565b8060001904821115620005a657620005a66200049b565b029392505050565b6000620005bc8383620004fa565b9392505050565b80820281158282048414176200049557620004956200049b565b634e487b7160e01b600052601260045260246000fd5b600082620006055762000605620005dd565b500690565b818103818111156200049557620004956200049b565b600082620006325762000632620005dd565b500490565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200066257607f821691505b6020821081036200068357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006d757600081815260208120601f850160051c81016020861015620006b25750805b601f850160051c820191505b81811015620006d357828155600101620006be565b5050505b505050565b81516001600160401b03811115620006f857620006f862000637565b62000710816200070984546200064d565b8462000689565b602080601f8311600181146200074857600084156200072f5750858301515b600019600386901b1c1916600185901b178555620006d3565b600085815260208120601f198616915b82811015620007795788860151825594840194600190910190840162000758565b5085821015620007985787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c0516123f9620008096000396000610db501526000818161067001528181610aab015281816117f90152611821015260008181610e6001528181610ef101528181610fef015281816118a0015261195801526123f96000f3fe60806040526004361061024a5760003560e01c806370a0823111610139578063a457c2d7116100b6578063dd62ed3e1161007a578063dd62ed3e14610692578063ddf731f3146106d8578063e0956e0f146106f8578063e399ab911461071a578063e47a966a14610730578063e5e31b131461075057600080fd5b8063a457c2d7146105c6578063a9059cbb146105e6578063b91ac78814610606578063d547741f1461063e578063d7091b711461065e57600080fd5b80638cb6768d116100fd5780638cb6768d146105425780639079f9321461056257806391d148541461057c57806395d89b411461059c578063a217fddf146105b157600080fd5b806370a08231146104b9578063733948c1146104d957806378f353a1146104ec5780637b8e378a1461050257806384a41ba71461052257600080fd5b80632ac3495a116101c757806336568abe1161018b57806336568abe1461042d578063395093511461044d57806353eb3bcf1461046d578063616eb638146104825780637015f2271461049757600080fd5b80632ac3495a146103a15780632b112e49146103c15780632bb35ec0146103d65780632f2ff15d146103eb578063313ce5671461040b57600080fd5b806318160ddd1161020e57806318160ddd146103045780631872d96d146103275780631ff8d5071461033c57806323b872dd14610351578063248a9ca31461037157600080fd5b806301ffc9a71461025657806303b1e00a1461028b57806304b638af146102ad57806306fdde03146102c2578063095ea7b3146102e457600080fd5b3661025157005b600080fd5b34801561026257600080fd5b50610276610271366004611e18565b610780565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004611e5e565b6107b7565b005b3480156102b957600080fd5b506102ab6108e1565b3480156102ce57600080fd5b506102d7610979565b6040516102829190611e8a565b3480156102f057600080fd5b506102766102ff366004611e5e565b610a0b565b34801561031057600080fd5b50610319610a77565b604051908152602001610282565b34801561033357600080fd5b506102ab610a9b565b34801561034857600080fd5b506102ab610ad2565b34801561035d57600080fd5b5061027661036c366004611ed8565b610afb565b34801561037d57600080fd5b5061031961038c366004611f19565b60009081526003602052604090206001015490565b3480156103ad57600080fd5b506102ab6103bc366004611f47565b610b8f565b3480156103cd57600080fd5b50610319610bd3565b3480156103e257600080fd5b506102ab610c60565b3480156103f757600080fd5b506102ab610406366004611f7a565b610c93565b34801561041757600080fd5b5060025460405160ff9091168152602001610282565b34801561043957600080fd5b506102ab610448366004611f7a565b610cbe565b34801561045957600080fd5b50610276610468366004611e5e565b610cf6565b34801561047957600080fd5b506102ab610d87565b34801561048e57600080fd5b506102ab610daa565b3480156104a357600080fd5b5061031960008051602061238483398151915281565b3480156104c557600080fd5b506103196104d4366004611faa565b610e2a565b6102ab6104e7366004611faa565b610e51565b3480156104f857600080fd5b5061031960115481565b34801561050e57600080fd5b5061031961051d366004611fc7565b6110cc565b34801561052e57600080fd5b506102ab61053d366004611f19565b61113c565b34801561054e57600080fd5b506102ab61055d366004612003565b61115c565b34801561056e57600080fd5b50600e546102769060ff1681565b34801561058857600080fd5b50610276610597366004611f7a565b6111eb565b3480156105a857600080fd5b506102d7611216565b3480156105bd57600080fd5b50610319600081565b3480156105d257600080fd5b506102766105e1366004611e5e565b611225565b3480156105f257600080fd5b50610276610601366004611e5e565b611302565b34801561061257600080fd5b50610626610621366004611f19565b61132e565b6040516001600160a01b039091168152602001610282565b34801561064a57600080fd5b506102ab610659366004611f7a565b611358565b34801561066a57600080fd5b506103197f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e57600080fd5b506103196106ad366004612093565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156106e457600080fd5b506102ab6106f3366004611faa565b61137d565b34801561070457600080fd5b506103196000805160206123a483398151915281565b34801561072657600080fd5b50610319600f5481565b34801561073c57600080fd5b506102ab61074b366004611e5e565b611438565b34801561075c57600080fd5b5061027661076b366004611faa565b60076020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b14806107b157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206123a48339815191526107cf816114e8565b6000600b54836107df91906120d7565b6001600160a01b0385166000908152600d6020908152604080832033845290915290205490915060001914610847576001600160a01b0384166000908152600d60209081526040808320338452909152812080548592906108419084906120ee565b90915550505b6001600160a01b0384166000908152600c60205260408120805483929061086f9084906120ee565b9250508190555080600a60008282546108889190612101565b9091555050600b546000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108ca908561212a565b60405190815260200160405180910390a350505050565b6000601154426108f191906120ee565b9050600060105482610903919061212a565b600e5490915060ff1680156109185750600081115b1561097557610959620186a082600f5460095461093591906120d7565b61093f91906120d7565b610949919061212a565b6109529061213e565b60006114f2565b50601054610967908361215a565b61097190426120ee565b6011555b5050565b6060600080546109889061216e565b80601f01602080910402602001604051908101604052809291908181526020018280546109b49061216e565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b336000818152600d602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a669086815260200190565b60405180910390a350600192915050565b6000600b54600a54610a89919061212a565b600954610a9691906120ee565b905090565b6000610aa6816114e8565b610acf7f00000000000000000000000000000000000000000000000000000000000000006117c4565b50565b6000610add816114e8565b506012805461ff001981166101009182900460ff1615909102179055565b6000826001600160a01b038116610b1157600080fd5b6001600160a01b0385166000908152600d6020908152604080832033845290915290205460001914610b76576001600160a01b0385166000908152600d6020908152604080832033845290915281208054859290610b709084906120ee565b90915550505b610b818585856119e2565b50600191505b509392505050565b6000610b9a816114e8565b611388831115610ba957600080fd5b610e10821015610bb857600080fd5b50600e805460ff191693151593909317909255600f55601055565b600b54600a546005546001600160a01b039081166000908152600c602052604080822054600454909316825281205490939291610c0f91612101565b610c199190612101565b610c256009600a61228c565b610c349064cef5e80ac06120d7565b610c409060001961215a565b610c4c906000196120ee565b610c5691906120ee565b610a96919061212a565b6000610c6b816114e8565b60145460ff1615610c7b57600080fd5b50436013556014805460ff1916600117905542601155565b600082815260036020526040902060010154610cae816114e8565b610cb88383611c9e565b50505050565b6001600160a01b0381163314610ce75760405163334bd91960e11b815260040160405180910390fd5b610cf18282611d32565b505050565b336000908152600d602090815260408083206001600160a01b0386168452909152812080548391908390610d2b908490612101565b9091555050336000818152600d602090815260408083206001600160a01b038816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610a66565b6000610d92816114e8565b60135415610d9f57600080fd5b504360135542601155565b478015610acf5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e1e576040519150601f19603f3d011682016040523d82523d6000602084013e610e23565b606091505b5050505050565b600b546001600160a01b0382166000908152600c602052604081205490916107b19161212a565b6000610e5c816114e8565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190612298565b6001600160a01b031663c9c65396307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190612298565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612298565b9050610fed8161137d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d719473061102730610e2a565b6040516001600160e01b031960e086901b1681526001600160a01b0392831660048201526024810191909152600060448201819052606482015290871660848201524260a482015260c40160606040518083038185885af1158015611090573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110b591906122b5565b50506012805461ff00191661010017905550505050565b60006000805160206123a48339815191526110e6816114e8565b83156111165761110f6064866009546110ff91906120d7565b611109919061212a565b846114f2565b9150610b87565b61110f60648660095461112991906120d7565b611133919061212a565b6111099061213e565b6000611147816114e8565b610e1082101561115657600080fd5b50601055565b6000611167816114e8565b60005b838110156111e35760008681526003602052604081208491878785818110611194576111946122e3565b90506020020160208101906111a99190611faa565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111db816122f9565b91505061116a565b505050505050565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109889061216e565b336000908152600d602090815260408083206001600160a01b0386168452909152812054821061127857336000908152600d602090815260408083206001600160a01b03871684529091528120556112ab565b336000908152600d602090815260408083206001600160a01b038716845290915281208054849290610d2b9084906120ee565b336000818152600d602090815260408083206001600160a01b038816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610a66565b6000826001600160a01b03811661131857600080fd5b6113233385856119e2565b506001949350505050565b6006818154811061133e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600082815260036020526040902060010154611373816114e8565b610cb88383611d32565b6000611388816114e8565b600654600a116113d05760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920706169727360901b60448201526064015b60405180910390fd5b506006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039093166001600160a01b031990931683179055600091825260076020526040909120805460ff19169091179055565b6000805160206123a4833981519152611450816114e8565b6000600b548361146091906120d7565b6001600160a01b0385166000908152600c602052604081208054929350839290919061148d908490612101565b9250508190555080600a60008282546114a691906120ee565b9091555050600b546001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108ca908561212a565b610acf8133611d9f565b600082600003611540577f60633057fb2c2558942a126acc1dc7c639b6fdee660a0171f7500e2ac5918b2e60095460405161152f91815260200190565b60405180910390a1506009546107b1565b600083121561156e576115528361213e565b6009600082825461156391906120ee565b909155506115869050565b82600960008282546115809190612101565b90915550505b6009546001600160801b0310156115a3576001600160801b036009555b600b5460098054906115b690600a61228c565b6115c59064cef5e80ac06120d7565b6115d19060001961215a565b6115dd906000196120ee565b6115e7919061212a565b600b556000805b60065481101561177c5760006006828154811061160d5761160d6122e3565b6000918252602090912001546001600160a01b031690508561171b5760008712156116ac5761163b81610e2a565b6001600160a01b0382166000908152600c602052604090205461165f90869061212a565b61166991906120ee565b9250600b548361167991906120d7565b6001600160a01b0382166000908152600c6020526040812080549091906116a1908490612101565b909155506117699050565b6001600160a01b0381166000908152600c60205260409020546116d090859061212a565b6116d982610e2a565b6116e391906120ee565b9250600b54836116f391906120d7565b6001600160a01b0382166000908152600c6020526040812080549091906116a19084906120ee565b806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175657600080fd5b505af1925050508015611767575060015b505b5080611774816122f9565b9150506115ee565b507f60633057fb2c2558942a126acc1dc7c639b6fdee660a0171f7500e2ac5918b2e6009546040516117b091815260200190565b60405180910390a150506009549392505050565b6012805460ff1916600117905560006117dc30610e2a565b90506117e960038361212a565b9150808211156117f7578091505b7f0000000000000000000000000000000000000000000000000000000000000000821115611843577f000000000000000000000000000000000000000000000000000000000000000091505b81156119cc57604080516002808252606082018352600092602083019080368337019050509050308160008151811061187e5761187e6122e3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119209190612298565b81600181518110611933576119336122e3565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790611998908690600090869030904290600401612312565b600060405180830381600087803b1580156119b257600080fd5b505af11580156119c6573d6000803e3d6000fd5b50505050505b6119d4610daa565b50506012805460ff19169055565b600080600b54836119f391906120d7565b9050600080611a00611dd8565b60145490915060ff16611a8357611a25600080516020612384833981519152876111eb565b80611a435750611a43600080516020612384833981519152886111eb565b611a835760405162461bcd60e51b815260206004820152601160248201527054727920616761696e2073686f72746c7960781b60448201526064016113c7565b60135415611bc157600081118015611aa457506001600160a01b0387163014155b15611b195780611ab560648561212a565b611abf91906120d7565b91508115611b19576001600160a01b0387166000908152600c602052604081208054849290611aef9084906120ee565b9091555050306000908152600c602052604081208054849290611b13908490612101565b90915550505b60125460ff16158015611b4457506001600160a01b03861660009081526007602052604090205460ff165b8015611b575750601254610100900460ff165b8015611b6c57506001600160a01b0387163014155b15611b7a57611b7a856117c4565b611b92600080516020612384833981519152886111eb565b158015611bb45750611bb2600080516020612384833981519152876111eb565b155b15611bc157611bc16108e1565b611bcb82846120ee565b6001600160a01b0388166000908152600c602052604081208054909190611bf39084906120ee565b90915550611c03905082846120ee565b6001600160a01b0387166000908152600c602052604081208054909190611c2b908490612101565b92505081905550856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b548587611c7691906120ee565b611c80919061212a565b60405190815260200160405180910390a35060019695505050505050565b6000611caa83836111eb565b611d2a5760008381526003602090815260408083206001600160a01b03861684529091529020805460ff19166001179055611ce23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016107b1565b5060006107b1565b6000611d3e83836111eb565b15611d2a5760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016107b1565b611da982826111eb565b6109755760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016113c7565b6000603260135443611dea91906120ee565b1115611df65750600090565b600460135443611e0691906120ee565b1115611e125750600390565b50602390565b600060208284031215611e2a57600080fd5b81356001600160e01b031981168114611e4257600080fd5b9392505050565b6001600160a01b0381168114610acf57600080fd5b60008060408385031215611e7157600080fd5b8235611e7c81611e49565b946020939093013593505050565b600060208083528351808285015260005b81811015611eb757858101830151858201604001528201611e9b565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215611eed57600080fd5b8335611ef881611e49565b92506020840135611f0881611e49565b929592945050506040919091013590565b600060208284031215611f2b57600080fd5b5035919050565b80358015158114611f4257600080fd5b919050565b600080600060608486031215611f5c57600080fd5b611f6584611f32565b95602085013595506040909401359392505050565b60008060408385031215611f8d57600080fd5b823591506020830135611f9f81611e49565b809150509250929050565b600060208284031215611fbc57600080fd5b8135611e4281611e49565b600080600060608486031215611fdc57600080fd5b83359250611fec60208501611f32565b9150611ffa60408501611f32565b90509250925092565b6000806000806060858703121561201957600080fd5b84359350602085013567ffffffffffffffff8082111561203857600080fd5b818701915087601f83011261204c57600080fd5b81358181111561205b57600080fd5b8860208260051b850101111561207057600080fd5b60208301955080945050505061208860408601611f32565b905092959194509250565b600080604083850312156120a657600080fd5b82356120b181611e49565b91506020830135611f9f81611e49565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107b1576107b16120c1565b818103818111156107b1576107b16120c1565b808201808211156107b1576107b16120c1565b634e487b7160e01b600052601260045260246000fd5b60008261213957612139612114565b500490565b6000600160ff1b8201612153576121536120c1565b5060000390565b60008261216957612169612114565b500690565b600181811c9082168061218257607f821691505b6020821081036121a257634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b808511156121e35781600019048211156121c9576121c96120c1565b808516156121d657918102915b93841c93908002906121ad565b509250929050565b6000826121fa575060016107b1565b81612207575060006107b1565b816001811461221d576002811461222757612243565b60019150506107b1565b60ff841115612238576122386120c1565b50506001821b6107b1565b5060208310610133831016604e8410600b8410161715612266575081810a6107b1565b61227083836121a8565b8060001904821115612284576122846120c1565b029392505050565b6000611e4283836121eb565b6000602082840312156122aa57600080fd5b8151611e4281611e49565b6000806000606084860312156122ca57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b60006001820161230b5761230b6120c1565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123625784516001600160a01b03168352938301939183019160010161233d565b50506001600160a01b0396909616606085015250505060800152939250505056fe91d0ca641b4a271c992464d0c8d47e8cececb6cb7bcb03d087fb339947fac912593fb413ec9f9ad9f53f309300b515310ff474591268ca3cbe9752fd88eb76a0a2646970667358221220446b09c41c207392782c48cd5c19c76390d0f6010bfede07f524b0dd7991f81d64736f6c6343000812003391d0ca641b4a271c992464d0c8d47e8cececb6cb7bcb03d087fb339947fac912

Deployed Bytecode

0x60806040526004361061024a5760003560e01c806370a0823111610139578063a457c2d7116100b6578063dd62ed3e1161007a578063dd62ed3e14610692578063ddf731f3146106d8578063e0956e0f146106f8578063e399ab911461071a578063e47a966a14610730578063e5e31b131461075057600080fd5b8063a457c2d7146105c6578063a9059cbb146105e6578063b91ac78814610606578063d547741f1461063e578063d7091b711461065e57600080fd5b80638cb6768d116100fd5780638cb6768d146105425780639079f9321461056257806391d148541461057c57806395d89b411461059c578063a217fddf146105b157600080fd5b806370a08231146104b9578063733948c1146104d957806378f353a1146104ec5780637b8e378a1461050257806384a41ba71461052257600080fd5b80632ac3495a116101c757806336568abe1161018b57806336568abe1461042d578063395093511461044d57806353eb3bcf1461046d578063616eb638146104825780637015f2271461049757600080fd5b80632ac3495a146103a15780632b112e49146103c15780632bb35ec0146103d65780632f2ff15d146103eb578063313ce5671461040b57600080fd5b806318160ddd1161020e57806318160ddd146103045780631872d96d146103275780631ff8d5071461033c57806323b872dd14610351578063248a9ca31461037157600080fd5b806301ffc9a71461025657806303b1e00a1461028b57806304b638af146102ad57806306fdde03146102c2578063095ea7b3146102e457600080fd5b3661025157005b600080fd5b34801561026257600080fd5b50610276610271366004611e18565b610780565b60405190151581526020015b60405180910390f35b34801561029757600080fd5b506102ab6102a6366004611e5e565b6107b7565b005b3480156102b957600080fd5b506102ab6108e1565b3480156102ce57600080fd5b506102d7610979565b6040516102829190611e8a565b3480156102f057600080fd5b506102766102ff366004611e5e565b610a0b565b34801561031057600080fd5b50610319610a77565b604051908152602001610282565b34801561033357600080fd5b506102ab610a9b565b34801561034857600080fd5b506102ab610ad2565b34801561035d57600080fd5b5061027661036c366004611ed8565b610afb565b34801561037d57600080fd5b5061031961038c366004611f19565b60009081526003602052604090206001015490565b3480156103ad57600080fd5b506102ab6103bc366004611f47565b610b8f565b3480156103cd57600080fd5b50610319610bd3565b3480156103e257600080fd5b506102ab610c60565b3480156103f757600080fd5b506102ab610406366004611f7a565b610c93565b34801561041757600080fd5b5060025460405160ff9091168152602001610282565b34801561043957600080fd5b506102ab610448366004611f7a565b610cbe565b34801561045957600080fd5b50610276610468366004611e5e565b610cf6565b34801561047957600080fd5b506102ab610d87565b34801561048e57600080fd5b506102ab610daa565b3480156104a357600080fd5b5061031960008051602061238483398151915281565b3480156104c557600080fd5b506103196104d4366004611faa565b610e2a565b6102ab6104e7366004611faa565b610e51565b3480156104f857600080fd5b5061031960115481565b34801561050e57600080fd5b5061031961051d366004611fc7565b6110cc565b34801561052e57600080fd5b506102ab61053d366004611f19565b61113c565b34801561054e57600080fd5b506102ab61055d366004612003565b61115c565b34801561056e57600080fd5b50600e546102769060ff1681565b34801561058857600080fd5b50610276610597366004611f7a565b6111eb565b3480156105a857600080fd5b506102d7611216565b3480156105bd57600080fd5b50610319600081565b3480156105d257600080fd5b506102766105e1366004611e5e565b611225565b3480156105f257600080fd5b50610276610601366004611e5e565b611302565b34801561061257600080fd5b50610626610621366004611f19565b61132e565b6040516001600160a01b039091168152602001610282565b34801561064a57600080fd5b506102ab610659366004611f7a565b611358565b34801561066a57600080fd5b506103197f00000000000000000000000000000000000000000000000000097951b73dfa0081565b34801561069e57600080fd5b506103196106ad366004612093565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b3480156106e457600080fd5b506102ab6106f3366004611faa565b61137d565b34801561070457600080fd5b506103196000805160206123a483398151915281565b34801561072657600080fd5b50610319600f5481565b34801561073c57600080fd5b506102ab61074b366004611e5e565b611438565b34801561075c57600080fd5b5061027661076b366004611faa565b60076020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b14806107b157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000805160206123a48339815191526107cf816114e8565b6000600b54836107df91906120d7565b6001600160a01b0385166000908152600d6020908152604080832033845290915290205490915060001914610847576001600160a01b0384166000908152600d60209081526040808320338452909152812080548592906108419084906120ee565b90915550505b6001600160a01b0384166000908152600c60205260408120805483929061086f9084906120ee565b9250508190555080600a60008282546108889190612101565b9091555050600b546000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108ca908561212a565b60405190815260200160405180910390a350505050565b6000601154426108f191906120ee565b9050600060105482610903919061212a565b600e5490915060ff1680156109185750600081115b1561097557610959620186a082600f5460095461093591906120d7565b61093f91906120d7565b610949919061212a565b6109529061213e565b60006114f2565b50601054610967908361215a565b61097190426120ee565b6011555b5050565b6060600080546109889061216e565b80601f01602080910402602001604051908101604052809291908181526020018280546109b49061216e565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b336000818152600d602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a669086815260200190565b60405180910390a350600192915050565b6000600b54600a54610a89919061212a565b600954610a9691906120ee565b905090565b6000610aa6816114e8565b610acf7f00000000000000000000000000000000000000000000000000097951b73dfa006117c4565b50565b6000610add816114e8565b506012805461ff001981166101009182900460ff1615909102179055565b6000826001600160a01b038116610b1157600080fd5b6001600160a01b0385166000908152600d6020908152604080832033845290915290205460001914610b76576001600160a01b0385166000908152600d6020908152604080832033845290915281208054859290610b709084906120ee565b90915550505b610b818585856119e2565b50600191505b509392505050565b6000610b9a816114e8565b611388831115610ba957600080fd5b610e10821015610bb857600080fd5b50600e805460ff191693151593909317909255600f55601055565b600b54600a546005546001600160a01b039081166000908152600c602052604080822054600454909316825281205490939291610c0f91612101565b610c199190612101565b610c256009600a61228c565b610c349064cef5e80ac06120d7565b610c409060001961215a565b610c4c906000196120ee565b610c5691906120ee565b610a96919061212a565b6000610c6b816114e8565b60145460ff1615610c7b57600080fd5b50436013556014805460ff1916600117905542601155565b600082815260036020526040902060010154610cae816114e8565b610cb88383611c9e565b50505050565b6001600160a01b0381163314610ce75760405163334bd91960e11b815260040160405180910390fd5b610cf18282611d32565b505050565b336000908152600d602090815260408083206001600160a01b0386168452909152812080548391908390610d2b908490612101565b9091555050336000818152600d602090815260408083206001600160a01b038816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610a66565b6000610d92816114e8565b60135415610d9f57600080fd5b504360135542601155565b478015610acf5760007f000000000000000000000000192a4f559ff5b8ae8d78914078f6f592055ab8136001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e1e576040519150601f19603f3d011682016040523d82523d6000602084013e610e23565b606091505b5050505050565b600b546001600160a01b0382166000908152600c602052604081205490916107b19161212a565b6000610e5c816114e8565b60007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190612298565b6001600160a01b031663c9c65396307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f719190612298565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610fbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe29190612298565b9050610fed8161137d565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d719473061102730610e2a565b6040516001600160e01b031960e086901b1681526001600160a01b0392831660048201526024810191909152600060448201819052606482015290871660848201524260a482015260c40160606040518083038185885af1158015611090573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110b591906122b5565b50506012805461ff00191661010017905550505050565b60006000805160206123a48339815191526110e6816114e8565b83156111165761110f6064866009546110ff91906120d7565b611109919061212a565b846114f2565b9150610b87565b61110f60648660095461112991906120d7565b611133919061212a565b6111099061213e565b6000611147816114e8565b610e1082101561115657600080fd5b50601055565b6000611167816114e8565b60005b838110156111e35760008681526003602052604081208491878785818110611194576111946122e3565b90506020020160208101906111a99190611faa565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111db816122f9565b91505061116a565b505050505050565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600180546109889061216e565b336000908152600d602090815260408083206001600160a01b0386168452909152812054821061127857336000908152600d602090815260408083206001600160a01b03871684529091528120556112ab565b336000908152600d602090815260408083206001600160a01b038716845290915281208054849290610d2b9084906120ee565b336000818152600d602090815260408083206001600160a01b038816808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610a66565b6000826001600160a01b03811661131857600080fd5b6113233385856119e2565b506001949350505050565b6006818154811061133e57600080fd5b6000918252602090912001546001600160a01b0316905081565b600082815260036020526040902060010154611373816114e8565b610cb88383611d32565b6000611388816114e8565b600654600a116113d05760405162461bcd60e51b815260206004820152600e60248201526d546f6f206d616e7920706169727360901b60448201526064015b60405180910390fd5b506006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b039093166001600160a01b031990931683179055600091825260076020526040909120805460ff19169091179055565b6000805160206123a4833981519152611450816114e8565b6000600b548361146091906120d7565b6001600160a01b0385166000908152600c602052604081208054929350839290919061148d908490612101565b9250508190555080600a60008282546114a691906120ee565b9091555050600b546001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108ca908561212a565b610acf8133611d9f565b600082600003611540577f60633057fb2c2558942a126acc1dc7c639b6fdee660a0171f7500e2ac5918b2e60095460405161152f91815260200190565b60405180910390a1506009546107b1565b600083121561156e576115528361213e565b6009600082825461156391906120ee565b909155506115869050565b82600960008282546115809190612101565b90915550505b6009546001600160801b0310156115a3576001600160801b036009555b600b5460098054906115b690600a61228c565b6115c59064cef5e80ac06120d7565b6115d19060001961215a565b6115dd906000196120ee565b6115e7919061212a565b600b556000805b60065481101561177c5760006006828154811061160d5761160d6122e3565b6000918252602090912001546001600160a01b031690508561171b5760008712156116ac5761163b81610e2a565b6001600160a01b0382166000908152600c602052604090205461165f90869061212a565b61166991906120ee565b9250600b548361167991906120d7565b6001600160a01b0382166000908152600c6020526040812080549091906116a1908490612101565b909155506117699050565b6001600160a01b0381166000908152600c60205260409020546116d090859061212a565b6116d982610e2a565b6116e391906120ee565b9250600b54836116f391906120d7565b6001600160a01b0382166000908152600c6020526040812080549091906116a19084906120ee565b806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175657600080fd5b505af1925050508015611767575060015b505b5080611774816122f9565b9150506115ee565b507f60633057fb2c2558942a126acc1dc7c639b6fdee660a0171f7500e2ac5918b2e6009546040516117b091815260200190565b60405180910390a150506009549392505050565b6012805460ff1916600117905560006117dc30610e2a565b90506117e960038361212a565b9150808211156117f7578091505b7f00000000000000000000000000000000000000000000000000097951b73dfa00821115611843577f00000000000000000000000000000000000000000000000000097951b73dfa0091505b81156119cc57604080516002808252606082018352600092602083019080368337019050509050308160008151811061187e5761187e6122e3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119209190612298565b81600181518110611933576119336122e3565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790611998908690600090869030904290600401612312565b600060405180830381600087803b1580156119b257600080fd5b505af11580156119c6573d6000803e3d6000fd5b50505050505b6119d4610daa565b50506012805460ff19169055565b600080600b54836119f391906120d7565b9050600080611a00611dd8565b60145490915060ff16611a8357611a25600080516020612384833981519152876111eb565b80611a435750611a43600080516020612384833981519152886111eb565b611a835760405162461bcd60e51b815260206004820152601160248201527054727920616761696e2073686f72746c7960781b60448201526064016113c7565b60135415611bc157600081118015611aa457506001600160a01b0387163014155b15611b195780611ab560648561212a565b611abf91906120d7565b91508115611b19576001600160a01b0387166000908152600c602052604081208054849290611aef9084906120ee565b9091555050306000908152600c602052604081208054849290611b13908490612101565b90915550505b60125460ff16158015611b4457506001600160a01b03861660009081526007602052604090205460ff165b8015611b575750601254610100900460ff165b8015611b6c57506001600160a01b0387163014155b15611b7a57611b7a856117c4565b611b92600080516020612384833981519152886111eb565b158015611bb45750611bb2600080516020612384833981519152876111eb565b155b15611bc157611bc16108e1565b611bcb82846120ee565b6001600160a01b0388166000908152600c602052604081208054909190611bf39084906120ee565b90915550611c03905082846120ee565b6001600160a01b0387166000908152600c602052604081208054909190611c2b908490612101565b92505081905550856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600b548587611c7691906120ee565b611c80919061212a565b60405190815260200160405180910390a35060019695505050505050565b6000611caa83836111eb565b611d2a5760008381526003602090815260408083206001600160a01b03861684529091529020805460ff19166001179055611ce23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016107b1565b5060006107b1565b6000611d3e83836111eb565b15611d2a5760008381526003602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016107b1565b611da982826111eb565b6109755760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016113c7565b6000603260135443611dea91906120ee565b1115611df65750600090565b600460135443611e0691906120ee565b1115611e125750600390565b50602390565b600060208284031215611e2a57600080fd5b81356001600160e01b031981168114611e4257600080fd5b9392505050565b6001600160a01b0381168114610acf57600080fd5b60008060408385031215611e7157600080fd5b8235611e7c81611e49565b946020939093013593505050565b600060208083528351808285015260005b81811015611eb757858101830151858201604001528201611e9b565b506000604082860101526040601f19601f8301168501019250505092915050565b600080600060608486031215611eed57600080fd5b8335611ef881611e49565b92506020840135611f0881611e49565b929592945050506040919091013590565b600060208284031215611f2b57600080fd5b5035919050565b80358015158114611f4257600080fd5b919050565b600080600060608486031215611f5c57600080fd5b611f6584611f32565b95602085013595506040909401359392505050565b60008060408385031215611f8d57600080fd5b823591506020830135611f9f81611e49565b809150509250929050565b600060208284031215611fbc57600080fd5b8135611e4281611e49565b600080600060608486031215611fdc57600080fd5b83359250611fec60208501611f32565b9150611ffa60408501611f32565b90509250925092565b6000806000806060858703121561201957600080fd5b84359350602085013567ffffffffffffffff8082111561203857600080fd5b818701915087601f83011261204c57600080fd5b81358181111561205b57600080fd5b8860208260051b850101111561207057600080fd5b60208301955080945050505061208860408601611f32565b905092959194509250565b600080604083850312156120a657600080fd5b82356120b181611e49565b91506020830135611f9f81611e49565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107b1576107b16120c1565b818103818111156107b1576107b16120c1565b808201808211156107b1576107b16120c1565b634e487b7160e01b600052601260045260246000fd5b60008261213957612139612114565b500490565b6000600160ff1b8201612153576121536120c1565b5060000390565b60008261216957612169612114565b500690565b600181811c9082168061218257607f821691505b6020821081036121a257634e487b7160e01b600052602260045260246000fd5b50919050565b600181815b808511156121e35781600019048211156121c9576121c96120c1565b808516156121d657918102915b93841c93908002906121ad565b509250929050565b6000826121fa575060016107b1565b81612207575060006107b1565b816001811461221d576002811461222757612243565b60019150506107b1565b60ff841115612238576122386120c1565b50506001821b6107b1565b5060208310610133831016604e8410600b8410161715612266575081810a6107b1565b61227083836121a8565b8060001904821115612284576122846120c1565b029392505050565b6000611e4283836121eb565b6000602082840312156122aa57600080fd5b8151611e4281611e49565b6000806000606084860312156122ca57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b60006001820161230b5761230b6120c1565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156123625784516001600160a01b03168352938301939183019160010161233d565b50506001600160a01b0396909616606085015250505060800152939250505056fe91d0ca641b4a271c992464d0c8d47e8cececb6cb7bcb03d087fb339947fac912593fb413ec9f9ad9f53f309300b515310ff474591268ca3cbe9752fd88eb76a0a2646970667358221220446b09c41c207392782c48cd5c19c76390d0f6010bfede07f524b0dd7991f81d64736f6c63430008120033

Deployed Bytecode Sourcemap

15247:12529:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9454:204;;;;;;;;;;-1:-1:-1;9454:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;9454:204:0;;;;;;;;24416:495;;;;;;;;;;-1:-1:-1;24416:495:0;;;;;:::i;:::-;;:::i;:::-;;17003:366;;;;;;;;;;;;;:::i;3622:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25279:253::-;;;;;;;;;;-1:-1:-1;25279:253:0;;;;;:::i;:::-;;:::i;20757:137::-;;;;;;;;;;;;;:::i;:::-;;;1652:25:1;;;1640:2;1625:18;20757:137:0;1506:177:1;24919:98:0;;;;;;;;;;;;;:::i;27444:105::-;;;;;;;;;;;;;:::i;21468:365::-;;;;;;;;;;-1:-1:-1;21468:365:0;;;;;:::i;:::-;;:::i;10734:122::-;;;;;;;;;;-1:-1:-1;10734:122:0;;;;;:::i;:::-;10799:7;10826:12;;;:6;:12;;;;;:22;;;;10734:122;20079:291;;;;;;;;;;-1:-1:-1;20079:291:0;;;;;:::i;:::-;;:::i;27557:179::-;;;;;;;;;;;;;:::i;26978:209::-;;;;;;;;;;;;;:::i;11166:138::-;;;;;;;;;;-1:-1:-1;11166:138:0;;;;;:::i;:::-;;:::i;3808:83::-;;;;;;;;;;-1:-1:-1;3874:9:0;;3808:83;;3874:9;;;;3464:36:1;;3452:2;3437:18;3808:83:0;3322:184:1;12303:251:0;;;;;;;;;;-1:-1:-1;12303:251:0;;;;;:::i;:::-;;:::i;25540:339::-;;;;;;;;;;-1:-1:-1;25540:339:0;;;;;:::i;:::-;;:::i;26797:173::-;;;;;;;;;;;;;:::i;25025:246::-;;;;;;;;;;;;;:::i;15376:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15376:64:0;;20902:133;;;;;;;;;;-1:-1:-1;20902:133:0;;;;;:::i;:::-;;:::i;26408:381::-;;;;;;:::i;:::-;;:::i;16641:29::-;;;;;;;;;;;;;;;;17381:340;;;;;;;;;;-1:-1:-1;17381:340:0;;;;;:::i;:::-;;:::i;20382:162::-;;;;;;;;;;-1:-1:-1;20382:162:0;;;;;:::i;:::-;;:::i;27195:241::-;;;;;;;;;;-1:-1:-1;27195:241:0;;;;;:::i;:::-;;:::i;16520:29::-;;;;;;;;;;-1:-1:-1;16520:29:0;;;;;;;;9750:138;;;;;;;;;;-1:-1:-1;9750:138:0;;;;;:::i;:::-;;:::i;3713:87::-;;;;;;;;;;;;;:::i;9062:49::-;;;;;;;;;;-1:-1:-1;9062:49:0;9107:4;9062:49;;25887:513;;;;;;;;;;-1:-1:-1;25887:513:0;;;;;:::i;:::-;;:::i;21043:215::-;;;;;;;;;;-1:-1:-1;21043:215:0;;;;;:::i;:::-;;:::i;15873:22::-;;;;;;;;;;-1:-1:-1;15873:22:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5189:32:1;;;5171:51;;5159:2;5144:18;15873:22:0;5025:203:1;11597:140:0;;;;;;;;;;-1:-1:-1;11597:140:0;;;;;:::i;:::-;;:::i;16752:33::-;;;;;;;;;;;;;;;21266:194;;;;;;;;;;-1:-1:-1;21266:194:0;;;;;:::i;:::-;-1:-1:-1;;;;;21418:25:0;;;21386:7;21418:25;;;:17;:25;;;;;;;;:34;;;;;;;;;;;;;21266:194;20552:197;;;;;;;;;;-1:-1:-1;20552:197:0;;;;;:::i;:::-;;:::i;15303:66::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;15303:66:0;;16556:38;;;;;;;;;;;;;;;;24060:344;;;;;;;;;;-1:-1:-1;24060:344:0;;;;;:::i;:::-;;:::i;15902:38::-;;;;;;;;;;-1:-1:-1;15902:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9454:204;9539:4;-1:-1:-1;;;;;;9563:47:0;;-1:-1:-1;;;9563:47:0;;:87;;-1:-1:-1;;;;;;;;;;2375:40:0;;;9614:36;9556:94;9454:204;-1:-1:-1;;9454:204:0:o;24416:495::-;-1:-1:-1;;;;;;;;;;;9346:16:0;9357:4;9346:10;:16::i;:::-;24513:17:::1;24542:16;;24533:6;:25;;;;:::i;:::-;-1:-1:-1::0;;;;;24573:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;24597:10:::1;24573:35:::0;;;;;;;;24513:45;;-1:-1:-1;;;24573:56:0::1;24569:134;;-1:-1:-1::0;;;;;24646:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;24670:10:::1;24646:35:::0;;;;;;;:45;;24685:6;;24646:23;:45:::1;::::0;24685:6;;24646:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;24569:134:0::1;-1:-1:-1::0;;;;;24713:18:0;::::1;;::::0;;;:12:::1;:18;::::0;;;;:31;;24735:9;;24713:18;:31:::1;::::0;24735:9;;24713:31:::1;:::i;:::-;;;;;;;;24772:9;24755:13;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24876:16:0::1;::::0;24847:1:::1;::::0;-1:-1:-1;;;;;24797:106:0;::::1;::::0;::::1;::::0;24864:28:::1;::::0;:9;:28:::1;:::i;:::-;24797:106;::::0;1652:25:1;;;1640:2;1625:18;24797:106:0::1;;;;;;;24502:409;24416:495:::0;;;:::o;17003:366::-;17046:15;17082:10;;17064:15;:28;;;;:::i;:::-;17046:46;;17103:14;17130:15;;17120:7;:25;;;;:::i;:::-;17160:10;;17103:42;;-1:-1:-1;17160:10:0;;:24;;;;;17183:1;17174:6;:10;17160:24;17156:206;;;17201:76;17262:6;17252;17232:17;;17217:12;;:32;;;;:::i;:::-;:41;;;;:::i;:::-;17216:52;;;;:::i;:::-;17208:61;;;:::i;:::-;17271:5;17201:6;:76::i;:::-;-1:-1:-1;17334:15:0;;17324:25;;:7;:25;:::i;:::-;17305:45;;:15;:45;:::i;:::-;17292:10;:58;17156:206;17035:334;;17003:366::o;3622:83::-;3659:13;3692:5;3685:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3622:83;:::o;25279:253::-;25422:10;25382:4;25404:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25404:38:0;;;;;;;;;;:46;;;25466:36;25382:4;;25404:38;;25466:36;;;;25445:5;1652:25:1;;1640:2;1625:18;;1506:177;25466:36:0;;;;;;;;-1:-1:-1;25520:4:0;25279:253;;;;:::o;20757:137::-;20812:7;20870:16;;20854:13;;:32;;;;:::i;:::-;20839:12;;:47;;;;:::i;:::-;20832:54;;20757:137;:::o;24919:98::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;24988:21:::1;25000:8;24988:11;:21::i;:::-;24919:98:::0;:::o;27444:105::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;-1:-1:-1;27530:11:0::1;::::0;;-1:-1:-1;;27515:26:0;::::1;27530:11;::::0;;;::::1;;;27529:12;27515:26:::0;;::::1;;::::0;;27444:105::o;21468:365::-;21611:4;21598:2;-1:-1:-1;;;;;15553:18:0;;15545:27;;;;;;-1:-1:-1;;;;;21632:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;21656:10:::1;21632:35:::0;;;;;;;;-1:-1:-1;;21632:56:0::1;21628:133;;-1:-1:-1::0;;;;;21705:23:0;::::1;;::::0;;;:17:::1;:23;::::0;;;;;;;21729:10:::1;21705:35:::0;;;;;;;:44;;21744:5;;21705:23;:44:::1;::::0;21744:5;;21705:44:::1;:::i;:::-;::::0;;;-1:-1:-1;;21628:133:0::1;21773:30;21787:4;21793:2;21797:5;21773:13;:30::i;:::-;;21821:4;21814:11;;15583:1;21468:365:::0;;;;;;:::o;20079:291::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;20217:4:::1;20205:8;:16;;20197:25;;;::::0;::::1;;20251:7;20241:6;:17;;20233:26;;;::::0;::::1;;-1:-1:-1::0;20270:10:0::1;:18:::0;;-1:-1:-1;;20270:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;20299:17:::1;:28:::0;20338:15:::1;:24:::0;20079:291::o;27557:179::-;27712:16;;27694:13;;27686:4;;-1:-1:-1;;;;;27686:4:0;;;27610:7;27673:18;;;:12;:18;;;;;;;27665:4;;;;;27652:18;;;;;27610:7;;27712:16;27694:13;27652:39;;;:::i;:::-;:55;;;;:::i;:::-;16019:12;15636:1;16019:2;:12;:::i;:::-;16001:30;;:15;:30;:::i;:::-;16091:38;;-1:-1:-1;;16091:38:0;:::i;:::-;16076:54;;-1:-1:-1;;16076:54:0;:::i;:::-;27638:70;;;;:::i;:::-;27637:91;;;;:::i;26978:209::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;27059:14:::1;::::0;::::1;;27058:15;27050:24;;;::::0;::::1;;-1:-1:-1::0;27096:12:0::1;27085:8;:23:::0;27119:14:::1;:21:::0;;-1:-1:-1;;27119:21:0::1;27136:4;27119:21;::::0;;27164:15:::1;27151:10;:28:::0;26978:209::o;11166:138::-;10799:7;10826:12;;;:6;:12;;;;;:22;;;9346:16;9357:4;9346:10;:16::i;:::-;11271:25:::1;11282:4;11288:7;11271:10;:25::i;:::-;;11166:138:::0;;;:::o;12303:251::-;-1:-1:-1;;;;;12397:34:0;;682:10;12397:34;12393:104;;12455:30;;-1:-1:-1;;;12455:30:0;;;;;;;;;;;12393:104;12509:37;12521:4;12527:18;12509:11;:37::i;:::-;;12303:251;;:::o;25540:339::-;25680:10;25640:4;25662:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25662:38:0;;;;;;;;;:52;;25704:10;;25662:38;25640:4;;25662:52;;25704:10;;25662:52;:::i;:::-;;;;-1:-1:-1;;25753:10:0;25800:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;25730:119:0;;25800:38;;;;;;;;;;;25730:119;;1652:25:1;;;25730:119:0;;25753:10;25730:119;;1625:18:1;25730:119:0;1506:177:1;26797:173:0;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;26875:8:::1;::::0;:13;26867:22:::1;;;::::0;::::1;;-1:-1:-1::0;26911:12:0::1;26900:8;:23:::0;26947:15:::1;26934:10;:28:::0;26797:173::o;25025:246::-;25092:21;25128:22;;25124:140;;25167:12;25208:8;-1:-1:-1;;;;;25208:13:0;25229:18;25208:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;25052:219:0;25025:246::o;20902:133::-;21011:16;;-1:-1:-1;;;;;20991:17:0;;20964:7;20991:17;;;:12;:17;;;;;;20964:7;;20991:36;;;:::i;26408:381::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;26494:21:::1;26530:6;-1:-1:-1::0;;;;;26530:14:0::1;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26518:40:0::1;;26567:4;26574:6;-1:-1:-1::0;;;;;26574:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26518:70;::::0;-1:-1:-1;;;;;;26518:70:0::1;::::0;;;;;;-1:-1:-1;;;;;9164:15:1;;;26518:70:0::1;::::0;::::1;9146:34:1::0;9216:15;;9196:18;;;9189:43;9081:18;;26518:70:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26494:94;;26599:20;26605:13;26599:5;:20::i;:::-;26630:6;-1:-1:-1::0;;;;;26630:22:0::1;;26660:21;26691:4;26697:24;26715:4;26697:9;:24::i;:::-;26630:120;::::0;-1:-1:-1;;;;;;26630:120:0::1;::::0;;;;;;-1:-1:-1;;;;;9602:15:1;;;26630:120:0::1;::::0;::::1;9584:34:1::0;9634:18;;;9627:34;;;;26722:1:0::1;9677:18:1::0;;;9670:34;;;9720:18;;;9713:34;9784:15;;;9763:19;;;9756:44;26734:15:0::1;9816:19:1::0;;;9809:35;9518:19;;26630:120:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;26763:11:0::1;:18:::0;;-1:-1:-1;;26763:18:0::1;;;::::0;;-1:-1:-1;;;;26408:381:0:o;17381:340::-;17491:7;-1:-1:-1;;;;;;;;;;;9346:16:0;9357:4;9346:10;:16::i;:::-;17515:2:::1;17511:203;;;17541:60;17583:3;17571:8;17556:12;;:23;;;;:::i;:::-;17555:31;;;;:::i;:::-;17589:11;17541:6;:60::i;:::-;17534:67;;;;17511:203;17641:61;17684:3;17672:8;17657:12;;:23;;;;:::i;:::-;17656:31;;;;:::i;:::-;17648:40;;;:::i;20382:162::-:0;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;20493:7:::1;20483:6;:17;;20475:26;;;::::0;::::1;;-1:-1:-1::0;20512:15:0::1;:24:::0;20382:162::o;27195:241::-;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;27321:9:::1;27317:112;27336:18:::0;;::::1;27317:112;;;27376:12;::::0;;;:6:::1;:12;::::0;;;;27411:6;;27397:7;;27405:1;27397:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27376:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;27376:32:0;:41;;-1:-1:-1;;27376:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27356:3;::::1;::::0;::::1;:::i;:::-;;;;27317:112;;;;27195:241:::0;;;;;:::o;9750:138::-;9827:4;9851:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;9851:29:0;;;;;;;;;;;;;;;9750:138::o;3713:87::-;3752:13;3785:7;3778:14;;;;;:::i;25887:513::-;26055:10;25992:4;26037:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26037:38:0;;;;;;;;;;26018:57;;26014:222;;26110:10;26133:1;26092:29;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26092:38:0;;;;;;;;;:42;26014:222;;;26185:10;26167:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26167:38:0;;;;;;;;;:57;;26209:15;;26167:29;:57;;26209:15;;26167:57;:::i;26014:222::-;26274:10;26321:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;26251:119:0;;26321:38;;;;;;;;;;;26251:119;;1652:25:1;;;26251:119:0;;26274:10;26251:119;;1625:18:1;26251:119:0;1506:177:1;21043:215:0;21170:4;21148:2;-1:-1:-1;;;;;15553:18:0;;15545:27;;;;;;21192:36:::1;21206:10;21218:2;21222:5;21192:13;:36::i;:::-;-1:-1:-1::0;21246:4:0::1;::::0;21043:215;-1:-1:-1;;;;21043:215:0:o;15873:22::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15873:22:0;;-1:-1:-1;15873:22:0;:::o;11597:140::-;10799:7;10826:12;;;:6;:12;;;;;:22;;;9346:16;9357:4;9346:10;:16::i;:::-;11703:26:::1;11715:4;11721:7;11703:11;:26::i;20552:197::-:0;9107:4;9346:16;9107:4;9346:10;:16::i;:::-;20640:5:::1;:12:::0;20655:2:::1;-1:-1:-1::0;20632:44:0::1;;;::::0;-1:-1:-1;;;20632:44:0;;10640:2:1;20632:44:0::1;::::0;::::1;10622:21:1::0;10679:2;10659:18;;;10652:30;-1:-1:-1;;;10698:18:1;;;10691:44;10752:18;;20632:44:0::1;;;;;;;;;-1:-1:-1::0;20687:5:0::1;:20:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;20687:20:0;;::::1;-1:-1:-1::0;;;;;;20687:20:0;;::::1;::::0;::::1;::::0;;-1:-1:-1;20718:16:0;;;:6:::1;20687:20;20718:16:::0;;;;;:23;;-1:-1:-1;;20718:23:0::1;::::0;;::::1;::::0;;20552:197::o;24060:344::-;-1:-1:-1;;;;;;;;;;;9346:16:0;9357:4;9346:10;:16::i;:::-;24154:17:::1;24183:16;;24174:6;:25;;;;:::i;:::-;-1:-1:-1::0;;;;;24210:16:0;::::1;;::::0;;;:12:::1;:16;::::0;;;;:29;;24154:45;;-1:-1:-1;24154:45:0;;24210:16;;;:29:::1;::::0;24154:45;;24210:29:::1;:::i;:::-;;;;;;;;24267:9;24250:13;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24369:16:0::1;::::0;-1:-1:-1;;;;;24292:104:0;::::1;::::0;24323:1:::1;::::0;24292:104:::1;::::0;24357:28:::1;::::0;:9;:28:::1;:::i;10103:105::-:0;10170:30;10181:4;682:10;10170;:30::i;17729:1341::-;17819:7;17848:11;17863:1;17848:16;17844:111;;17886:23;17896:12;;17886:23;;;;1652:25:1;;1640:2;1625:18;;1506:177;17886:23:0;;;;;;;;-1:-1:-1;17931:12:0;;17924:19;;17844:111;17985:1;17971:11;:15;17967:154;;;18027:12;18028:11;18027:12;:::i;:::-;18003;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;17967:154:0;;-1:-1:-1;17967:154:0;;18097:11;18073:12;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;17967:154:0;18137:12;;-1:-1:-1;;;;;;18133:83:0;;;-1:-1:-1;;;;;18179:12:0;:25;18133:83;18243:16;;18312:12;;;;16019;;:2;:12;:::i;:::-;16001:30;;:15;:30;:::i;:::-;16091:38;;-1:-1:-1;;16091:38:0;:::i;:::-;16076:54;;-1:-1:-1;;16076:54:0;:::i;:::-;18299:25;;;;:::i;:::-;18280:16;:44;18345:12;;18368:624;18391:5;:12;18387:16;;18368:624;;;18425:12;18440:5;18446:1;18440:8;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18440:8:0;;-1:-1:-1;18467:11:0;18463:518;;18517:1;18503:11;:15;18499:370;;;18580:15;18590:4;18580:9;:15::i;:::-;-1:-1:-1;;;;;18551:18:0;;;;;;:12;:18;;;;;;:25;;18572:4;;18551:25;:::i;:::-;18550:45;;;;:::i;:::-;18543:52;;18647:16;;18640:4;:23;;;;:::i;:::-;-1:-1:-1;;;;;18618:18:0;;;;;;:12;:18;;;;;:45;;:18;;;:45;;;;;:::i;:::-;;;;-1:-1:-1;18463:518:0;;-1:-1:-1;18463:518:0;18499:370;-1:-1:-1;;;;;18755:18:0;;;;;;:12;:18;;;;;;:25;;18776:4;;18755:25;:::i;:::-;18736:15;18746:4;18736:9;:15::i;:::-;:45;;;;:::i;:::-;18729:52;;18833:16;;18826:4;:23;;;;:::i;:::-;-1:-1:-1;;;;;18804:18:0;;;;;;:12;:18;;;;;:45;;:18;;;:45;;;;;:::i;18463:518::-;18925:4;-1:-1:-1;;;;;18913:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18909:57;;-1:-1:-1;18405:3:0;;;;:::i;:::-;;;;18368:624;;;;19009:23;19019:12;;19009:23;;;;1652:25:1;;1640:2;1625:18;;1506:177;19009:23:0;;;;;;;;-1:-1:-1;;19050:12:0;;;17729:1341;-1:-1:-1;;;17729:1341:0:o;23362:690::-;16933:6;:13;;-1:-1:-1;;16933:13:0;16942:4;16933:13;;;:6;23446:24:::1;23464:4;23446:9;:24::i;:::-;23432:38:::0;-1:-1:-1;23495:15:0::1;23509:1;23495:11:::0;:15:::1;:::i;:::-;23481:29;;23538:3;23524:11;:17;23521:39;;;23557:3;23543:17;;23521:39;23588:8;23574:11;:22;23571:49;;;23612:8;23598:22;;23571:49;23636:15:::0;;23633:389:::1;;23692:16;::::0;;23706:1:::1;23692:16:::0;;;;;::::1;::::0;;23668:21:::1;::::0;23692:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;23692:16:0::1;23668:40;;23741:4;23723;23728:1;23723:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;23723:23:0::1;;;-1:-1:-1::0;;;;;23723:23:0::1;;;::::0;::::1;23771:6;-1:-1:-1::0;;;;;23771:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23761:4;23766:1;23761:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23761:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;23799:211:::1;::::0;-1:-1:-1;;;23799:211:0;;:6:::1;:57:::0;;::::1;::::0;::::1;::::0;:211:::1;::::0;23875:11;;23905:1:::1;::::0;23925:4;;23956::::1;::::0;23980:15:::1;::::0;23799:211:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23653:369;23633:389;24034:10;:8;:10::i;:::-;-1:-1:-1::0;;16969:6:0;:14;;-1:-1:-1;;16969:14:0;;;23362:690::o;22039:1315::-;22165:4;22182:17;22211:16;;22202:6;:25;;;;:::i;:::-;22182:45;;22238:17;22270:11;22284:8;:6;:8::i;:::-;22308:14;;22270:22;;-1:-1:-1;22308:14:0;;22303:143;;22347:32;-1:-1:-1;;;;;;;;;;;22369:9:0;22347:7;:32::i;:::-;:65;;;;22383:29;-1:-1:-1;;;;;;;;;;;22405:6:0;22383:7;:29::i;:::-;22339:95;;;;-1:-1:-1;;;22339:95:0;;12100:2:1;22339:95:0;;;12082:21:1;12139:2;12119:18;;;12112:30;-1:-1:-1;;;12158:18:1;;;12151:47;12215:18;;22339:95:0;11898:341:1;22339:95:0;22460:8;;:12;22456:607;;22499:1;22493:3;:7;:34;;;;-1:-1:-1;;;;;;22504:23:0;;22522:4;22504:23;;22493:34;22489:280;;;22578:3;22560:15;22572:3;22560:9;:15;:::i;:::-;:21;;;;:::i;:::-;22548:33;-1:-1:-1;22603:11:0;;22600:154;;-1:-1:-1;;;;;22638:20:0;;;;;;:12;:20;;;;;:33;;22662:9;;22638:20;:33;;22662:9;;22638:33;:::i;:::-;;;;-1:-1:-1;;22715:4:0;22694:27;;;;:12;:27;;;;;:40;;22725:9;;22694:27;:40;;22725:9;;22694:40;:::i;:::-;;;;-1:-1:-1;;22600:154:0;22790:6;;;;22789:7;:28;;;;-1:-1:-1;;;;;;22800:17:0;;;;;;:6;:17;;;;;;;;22789:28;:43;;;;-1:-1:-1;22821:11:0;;;;;;;22789:43;:70;;;;-1:-1:-1;;;;;;22836:23:0;;22854:4;22836:23;;22789:70;22785:130;;;22880:19;22892:6;22880:11;:19::i;:::-;22936:28;-1:-1:-1;;;;;;;;;;;22957:6:0;22936:7;:28::i;:::-;22935:29;:65;;;;;22969:31;-1:-1:-1;;;;;;;;;;;22990:9:0;22969:7;:31::i;:::-;22968:32;22935:65;22931:121;;;23021:15;:13;:15::i;:::-;23100:19;23110:9;23100;:19;:::i;:::-;-1:-1:-1;;;;;23075:20:0;;;;;;:12;:20;;;;;:45;;:20;;;:45;;;;;:::i;:::-;;;;-1:-1:-1;23159:19:0;;-1:-1:-1;23169:9:0;23159;:19;:::i;:::-;-1:-1:-1;;;;;23131:23:0;;;;;;:12;:23;;;;;:48;;:23;;;:48;;;;;:::i;:::-;;;;;;;;23249:9;-1:-1:-1;;;;;23205:119:0;23228:6;-1:-1:-1;;;;;23205:119:0;;23297:16;;23284:9;23274;:19;;;;:::i;:::-;23273:40;;;;:::i;:::-;23205:119;;1652:25:1;;;1640:2;1625:18;23205:119:0;;;;;;;-1:-1:-1;23342:4:0;;22039:1315;-1:-1:-1;;;;;;22039:1315:0:o;13180:324::-;13257:4;13279:22;13287:4;13293:7;13279;:22::i;:::-;13274:223;;13318:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;13318:29:0;;;;;;;;;:36;;-1:-1:-1;;13318:36:0;13350:4;13318:36;;;13401:12;682:10;;602:98;13401:12;-1:-1:-1;;;;;13374:40:0;13392:7;-1:-1:-1;;;;;13374:40:0;13386:4;13374:40;;;;;;;;;;-1:-1:-1;13436:4:0;13429:11;;13274:223;-1:-1:-1;13480:5:0;13473:12;;13748:325;13826:4;13847:22;13855:4;13861:7;13847;:22::i;:::-;13843:223;;;13918:5;13886:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;13886:29:0;;;;;;;;;;:37;;-1:-1:-1;;13886:37:0;;;13943:40;682:10;;13886:12;;13943:40;;13918:5;13943:40;-1:-1:-1;14005:4:0;13998:11;;10344:201;10433:22;10441:4;10447:7;10433;:22::i;:::-;10428:110;;10479:47;;-1:-1:-1;;;10479:47:0;;-1:-1:-1;;;;;12436:32:1;;10479:47:0;;;12418:51:1;12485:18;;;12478:34;;;12391:18;;10479:47:0;12244:274:1;21841:190:0;21881:7;21930:2;21919:8;;21904:12;:23;;;;:::i;:::-;:28;21901:122;;;-1:-1:-1;21941:1:0;;21841:190::o;21901:122::-;21987:1;21976:8;;21961:12;:23;;;;:::i;:::-;:27;21958:65;;;-1:-1:-1;21997:1:0;;21841:190::o;21958:65::-;-1:-1:-1;22021:2:0;;21841:190::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:1:o;497:131::-;-1:-1:-1;;;;;572:31:1;;562:42;;552:70;;618:1;615;608:12;633:315;701:6;709;762:2;750:9;741:7;737:23;733:32;730:52;;;778:1;775;768:12;730:52;817:9;804:23;836:31;861:5;836:31;:::i;:::-;886:5;938:2;923:18;;;;910:32;;-1:-1:-1;;;633:315:1:o;953:548::-;1065:4;1094:2;1123;1112:9;1105:21;1155:6;1149:13;1198:6;1193:2;1182:9;1178:18;1171:34;1223:1;1233:140;1247:6;1244:1;1241:13;1233:140;;;1342:14;;;1338:23;;1332:30;1308:17;;;1327:2;1304:26;1297:66;1262:10;;1233:140;;;1237:3;1422:1;1417:2;1408:6;1397:9;1393:22;1389:31;1382:42;1492:2;1485;1481:7;1476:2;1468:6;1464:15;1460:29;1449:9;1445:45;1441:54;1433:62;;;;953:548;;;;:::o;1688:456::-;1765:6;1773;1781;1834:2;1822:9;1813:7;1809:23;1805:32;1802:52;;;1850:1;1847;1840:12;1802:52;1889:9;1876:23;1908:31;1933:5;1908:31;:::i;:::-;1958:5;-1:-1:-1;2015:2:1;2000:18;;1987:32;2028:33;1987:32;2028:33;:::i;:::-;1688:456;;2080:7;;-1:-1:-1;;;2134:2:1;2119:18;;;;2106:32;;1688:456::o;2149:180::-;2208:6;2261:2;2249:9;2240:7;2236:23;2232:32;2229:52;;;2277:1;2274;2267:12;2229:52;-1:-1:-1;2300:23:1;;2149:180;-1:-1:-1;2149:180:1:o;2516:160::-;2581:20;;2637:13;;2630:21;2620:32;;2610:60;;2666:1;2663;2656:12;2610:60;2516:160;;;:::o;2681:316::-;2755:6;2763;2771;2824:2;2812:9;2803:7;2799:23;2795:32;2792:52;;;2840:1;2837;2830:12;2792:52;2863:26;2879:9;2863:26;:::i;:::-;2853:36;2936:2;2921:18;;2908:32;;-1:-1:-1;2987:2:1;2972:18;;;2959:32;;2681:316;-1:-1:-1;;;2681:316:1:o;3002:315::-;3070:6;3078;3131:2;3119:9;3110:7;3106:23;3102:32;3099:52;;;3147:1;3144;3137:12;3099:52;3183:9;3170:23;3160:33;;3243:2;3232:9;3228:18;3215:32;3256:31;3281:5;3256:31;:::i;:::-;3306:5;3296:15;;;3002:315;;;;;:::o;3511:247::-;3570:6;3623:2;3611:9;3602:7;3598:23;3594:32;3591:52;;;3639:1;3636;3629:12;3591:52;3678:9;3665:23;3697:31;3722:5;3697:31;:::i;3763:316::-;3834:6;3842;3850;3903:2;3891:9;3882:7;3878:23;3874:32;3871:52;;;3919:1;3916;3909:12;3871:52;3955:9;3942:23;3932:33;;3984:35;4015:2;4004:9;4000:18;3984:35;:::i;:::-;3974:45;;4038:35;4069:2;4058:9;4054:18;4038:35;:::i;:::-;4028:45;;3763:316;;;;;:::o;4269:751::-;4370:6;4378;4386;4394;4447:2;4435:9;4426:7;4422:23;4418:32;4415:52;;;4463:1;4460;4453:12;4415:52;4499:9;4486:23;4476:33;;4560:2;4549:9;4545:18;4532:32;4583:18;4624:2;4616:6;4613:14;4610:34;;;4640:1;4637;4630:12;4610:34;4678:6;4667:9;4663:22;4653:32;;4723:7;4716:4;4712:2;4708:13;4704:27;4694:55;;4745:1;4742;4735:12;4694:55;4785:2;4772:16;4811:2;4803:6;4800:14;4797:34;;;4827:1;4824;4817:12;4797:34;4880:7;4875:2;4865:6;4862:1;4858:14;4854:2;4850:23;4846:32;4843:45;4840:65;;;4901:1;4898;4891:12;4840:65;4932:2;4928;4924:11;4914:21;;4954:6;4944:16;;;;;4979:35;5010:2;4999:9;4995:18;4979:35;:::i;:::-;4969:45;;4269:751;;;;;;;:::o;5233:388::-;5301:6;5309;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5417:9;5404:23;5436:31;5461:5;5436:31;:::i;:::-;5486:5;-1:-1:-1;5543:2:1;5528:18;;5515:32;5556:33;5515:32;5556:33;:::i;5626:127::-;5687:10;5682:3;5678:20;5675:1;5668:31;5718:4;5715:1;5708:15;5742:4;5739:1;5732:15;5758:168;5831:9;;;5862;;5879:15;;;5873:22;;5859:37;5849:71;;5900:18;;:::i;5931:128::-;5998:9;;;6019:11;;;6016:37;;;6033:18;;:::i;6064:125::-;6129:9;;;6150:10;;;6147:36;;;6163:18;;:::i;6194:127::-;6255:10;6250:3;6246:20;6243:1;6236:31;6286:4;6283:1;6276:15;6310:4;6307:1;6300:15;6326:120;6366:1;6392;6382:35;;6397:18;;:::i;:::-;-1:-1:-1;6431:9:1;;6326:120::o;6451:136::-;6486:3;-1:-1:-1;;;6507:22:1;;6504:48;;6532:18;;:::i;:::-;-1:-1:-1;6572:1:1;6568:13;;6451:136::o;6592:112::-;6624:1;6650;6640:35;;6655:18;;:::i;:::-;-1:-1:-1;6689:9:1;;6592:112::o;6709:380::-;6788:1;6784:12;;;;6831;;;6852:61;;6906:4;6898:6;6894:17;6884:27;;6852:61;6959:2;6951:6;6948:14;6928:18;6925:38;6922:161;;7005:10;7000:3;6996:20;6993:1;6986:31;7040:4;7037:1;7030:15;7068:4;7065:1;7058:15;6922:161;;6709:380;;;:::o;7094:422::-;7183:1;7226:5;7183:1;7240:270;7261:7;7251:8;7248:21;7240:270;;;7320:4;7316:1;7312:6;7308:17;7302:4;7299:27;7296:53;;;7329:18;;:::i;:::-;7379:7;7369:8;7365:22;7362:55;;;7399:16;;;;7362:55;7478:22;;;;7438:15;;;;7240:270;;;7244:3;7094:422;;;;;:::o;7521:806::-;7570:5;7600:8;7590:80;;-1:-1:-1;7641:1:1;7655:5;;7590:80;7689:4;7679:76;;-1:-1:-1;7726:1:1;7740:5;;7679:76;7771:4;7789:1;7784:59;;;;7857:1;7852:130;;;;7764:218;;7784:59;7814:1;7805:10;;7828:5;;;7852:130;7889:3;7879:8;7876:17;7873:43;;;7896:18;;:::i;:::-;-1:-1:-1;;7952:1:1;7938:16;;7967:5;;7764:218;;8066:2;8056:8;8053:16;8047:3;8041:4;8038:13;8034:36;8028:2;8018:8;8015:16;8010:2;8004:4;8001:12;7997:35;7994:77;7991:159;;;-1:-1:-1;8103:19:1;;;8135:5;;7991:159;8182:34;8207:8;8201:4;8182:34;:::i;:::-;8252:6;8248:1;8244:6;8240:19;8231:7;8228:32;8225:58;;;8263:18;;:::i;:::-;8301:20;;7521:806;-1:-1:-1;;;7521:806:1:o;8332:131::-;8392:5;8421:36;8448:8;8442:4;8421:36;:::i;8678:251::-;8748:6;8801:2;8789:9;8780:7;8776:23;8772:32;8769:52;;;8817:1;8814;8807:12;8769:52;8849:9;8843:16;8868:31;8893:5;8868:31;:::i;9855:306::-;9943:6;9951;9959;10012:2;10000:9;9991:7;9987:23;9983:32;9980:52;;;10028:1;10025;10018:12;9980:52;10057:9;10051:16;10041:26;;10107:2;10096:9;10092:18;10086:25;10076:35;;10151:2;10140:9;10136:18;10130:25;10120:35;;9855:306;;;;;:::o;10166:127::-;10227:10;10222:3;10218:20;10215:1;10208:31;10258:4;10255:1;10248:15;10282:4;10279:1;10272:15;10298:135;10337:3;10358:17;;;10355:43;;10378:18;;:::i;:::-;-1:-1:-1;10425:1:1;10414:13;;10298:135::o;10913:980::-;11175:4;11223:3;11212:9;11208:19;11254:6;11243:9;11236:25;11280:2;11318:6;11313:2;11302:9;11298:18;11291:34;11361:3;11356:2;11345:9;11341:18;11334:31;11385:6;11420;11414:13;11451:6;11443;11436:22;11489:3;11478:9;11474:19;11467:26;;11528:2;11520:6;11516:15;11502:29;;11549:1;11559:195;11573:6;11570:1;11567:13;11559:195;;;11638:13;;-1:-1:-1;;;;;11634:39:1;11622:52;;11729:15;;;;11694:12;;;;11670:1;11588:9;11559:195;;;-1:-1:-1;;;;;;;11810:32:1;;;;11805:2;11790:18;;11783:60;-1:-1:-1;;;11874:3:1;11859:19;11852:35;11771:3;10913:980;-1:-1:-1;;;10913:980:1:o

Swarm Source

ipfs://446b09c41c207392782c48cd5c19c76390d0f6010bfede07f524b0dd7991f81d
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.