Contract Address Details

0xBA5b8FaD9f3F1122dD6308be95de8F2fafD0ef69

Token
Egon Inu (ENU)
Creator
0xfb5e17–0e0951 at 0xa802ea–029687
Balance
34.640000000000000692 EGON
Tokens
Fetching tokens...
Transactions
336,522 Transactions
Transfers
50,333 Transfers
Gas Used
30,565,092,999
Last Balance Update
13494789
Contract name:
EgonInu




Optimization enabled
true
Compiler version
v0.8.18+commit.87f61d96




Optimization runs
200
EVM Version
default




Verified at
2024-03-07T13:44:32.548781Z

Constructor Arguments

000000000000000000000000735534fa255c096a4f16f6d820d8f0091b593beb

Arg [0] (address) : 0x735534fa255c096a4f16f6d820d8f0091b593beb

              

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

contract Ownable  {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

}


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


library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }


    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }


    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

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

}


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



interface IUniswapV2Pair {
    function factory() external view returns (address);
}


interface IUniswapV2Router01 {
    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);
}


interface IUniswapV2Router02 is IUniswapV2Router01 
{
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}


interface Treasury
{
   function addAddress(address account) external; 
   function sendDividensToHolders() external;
   function excludeFromReward(address addr, bool _enable) external;
}


contract EgonInu is IERC20, Ownable 
{
      using SafeMath for uint256;
      event SwapTokensForETH(uint256 amountIn, address[] path);
      event SwapAndLiquifyEnabledUpdated(bool enabled);
      event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);

      bool inSwapAndLiquify;
      bool public swapAndLiquifyEnabled = true;
   
      modifier lockTheSwap {
         inSwapAndLiquify = true;
         _;
         inSwapAndLiquify = false;
      }
    
      mapping (address => uint256) private _balances;
      mapping (address => mapping (address => uint256)) private _allowances;
      mapping (address => bool) private _isExcludedFromFee;
      uint256 private _totalSupply;
      string private _name;
      string private _symbol;
      uint8 private _decimals;
      
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    uint256 public _maxTxAmount;
    uint256 public minimumTokensBeforeSwap;
    address payable public marketingAddress; 
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    uint256 public EGONRewardsFee;
    uint256 public liquidityFee;
    uint256 public marketingFee;
    uint256 public burnFee;
    uint256 public totalFees;
    uint256 public extraFeeOnSell;
    Treasury private treasury;
    
    // 0x4a78C165ACeB8f043b56C46661758B66740785E0
    constructor(address _treasury) 
    { 
      
      _name = "Egon Inu";
      _symbol = "ENU";
      _decimals = 9;

      EGONRewardsFee = 4;
      liquidityFee = 1;
      marketingFee = 3;
      burnFee = 2;

      totalFees = EGONRewardsFee.add(liquidityFee).add(marketingFee).add(burnFee);

      _mint(owner(), 542000000000 * (10**9));

      IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0xc634160137e8F3C2A7Cc02e2637acD53E1C24b5e);
      uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
      .createPair(address(this), _uniswapV2Router.WETH());
      uniswapV2Router = _uniswapV2Router;  

      _maxTxAmount = totalSupply().div(100).mul(1); 
      minimumTokensBeforeSwap = totalSupply().div(1000_00); 
      marketingAddress = payable(0x03f63BE17b0dE46c154383d970Ac9826BFfFD9b0);
      treasury = Treasury(_treasury);
      _isExcludedFromFee[owner()] = true;
      _isExcludedFromFee[address(this)] = true;
      _isExcludedFromFee[marketingAddress] = true;
    }


    function isExcludedFromFee(address account) external view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }


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


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


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


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


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


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


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


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


    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transferTokens(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }


    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }


    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }


    function setFee(uint256 _egonRewardFee, uint256 _liquidityFee, uint256 _marketingFee, uint256 _burnFee) public onlyOwner 
    {
        EGONRewardsFee = _egonRewardFee;
        liquidityFee = _liquidityFee;
        marketingFee = _marketingFee;
        burnFee = _burnFee;
        totalFees = EGONRewardsFee.add(liquidityFee).add(marketingFee).add(burnFee);
        require(totalFees<15, "Too High Fee");
    }


    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap 
    {
        uint256 totalFee = totalFees-burnFee;
        uint256 halfLiquidityTokens = contractTokenBalance.mul(liquidityFee).div(totalFee).div(2);
        uint256 swapableTokens =  contractTokenBalance.sub(halfLiquidityTokens);
        swapTokensForEth(swapableTokens); 
        uint256 newBalance = address(this).balance;
        uint256 marketingShare = newBalance.mul(marketingFee).div(totalFee);
        marketingAddress.transfer(marketingShare);
        uint256 liquidityShare = newBalance.mul(liquidityFee).div(totalFee);
        addLiquidity(halfLiquidityTokens, liquidityShare);
        payable(address(treasury)).transfer(newBalance.sub(marketingShare).sub(liquidityShare));
    }


    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }



    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, 
            0,
            owner(),
            block.timestamp
        );
    }


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

         if(from != owner() && to != owner()) 
         {
            require(amount <= _maxTxAmount, "Exceeds Max Tx Amount");
         }

        treasury.addAddress(to);
        
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (!inSwapAndLiquify && swapAndLiquifyEnabled && from != uniswapV2Pair && from != owner() && balanceOf(uniswapV2Pair)>0) 
        {
            if (overMinimumTokenBalance) 
            {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapAndLiquify(contractTokenBalance);
            }
        }
        
        if(from != uniswapV2Pair)
        {
            treasury.sendDividensToHolders();
        }

        if(!_isExcludedFromFee[from] && !_isExcludedFromFee[to])
        {
            uint256 _feeTokens = amount.mul(totalFees.sub(burnFee)).div(100);
            _transfer(from, address(this), _feeTokens);

            uint256 _burnTokens = amount.mul(burnFee).div(100);
            _transfer(from, deadWallet, _burnTokens);

            amount = amount.sub(_feeTokens).sub(_burnTokens);
        }

        _transfer(from, to, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual 
    {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);

    }


    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }


    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }


    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    function setMinimumTokensBeforeSwap(uint256 _minimumTokensBeforeSwap) external onlyOwner() 
    {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner 
    {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function setMarketingAddress(address _marketingAddress) external onlyOwner() 
    {
        marketingAddress = payable(_marketingAddress);
    }

    receive() external payable {}


    function getTreasuryAddress() public view returns (address)
    {
        return address(treasury);
    }

    function excludeFromReward(address addr, bool _enable) external onlyOwner
    {
        treasury.excludeFromReward(addr, _enable);
    }

    function setMaxTxnLimit(uint256 maxTxAmount) external onlyOwner
    {
        _maxTxAmount = maxTxAmount;
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_treasury","internalType":"address"}]},{"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":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquifyEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensForETH","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256","indexed":false},{"type":"address[]","name":"path","internalType":"address[]","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":"EGONRewardsFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"deadWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"bool","name":"_enable","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"extraFeeOnSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getTreasuryAddress","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"marketingAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minimumTokensBeforeSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFee","inputs":[{"type":"uint256","name":"_egonRewardFee","internalType":"uint256"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_burnFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketingAddress","inputs":[{"type":"address","name":"_marketingAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxnLimit","inputs":[{"type":"uint256","name":"maxTxAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinimumTokensBeforeSwap","inputs":[{"type":"uint256","name":"_minimumTokensBeforeSwap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","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":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapV2Router","inputs":[]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x60806040526004361061021e5760003560e01c80637d1db4a511610123578063a5ece941116100ab578063dd62ed3e1161006f578063dd62ed3e1461064f578063e002460414610695578063ea2f0b37146106b3578063f2fde38b146106d3578063fce589d8146106f357600080fd5b8063a5ece941146105b9578063a9059cbb146105d9578063aee50b1e146105f9578063c49b9a8014610619578063d2d7ad831461063957600080fd5b806395d89b41116100f257806395d89b411461052e57806398118cb4146105435780639b6a275014610559578063a2a957bb14610579578063a457c2d71461059957600080fd5b80637d1db4a5146104ba57806385141a77146104d05780638da5cb5b146104f0578063906e9dd01461050e57600080fd5b806339509351116101a65780635342acb4116101755780635342acb41461040a57806369cf17d4146104435780636b67c4df1461045957806370a082311461046f578063715018a6146104a557600080fd5b80633950935114610384578063437823ec146103a457806349bd5a5e146103c45780634a74bb02146103e957600080fd5b806318160ddd116101ed57806318160ddd146102f557806323b872dd1461030a578063313ce5671461032a57806333ccc7ee1461034c57806335c6f9bc1461036257600080fd5b806306fdde031461022a578063095ea7b31461025557806313114a9d146102855780631694505e146102a957600080fd5b3661022557005b600080fd5b34801561023657600080fd5b5061023f610709565b60405161024c91906118c8565b60405180910390f35b34801561026157600080fd5b5061027561027036600461192e565b61079b565b604051901515815260200161024c565b34801561029157600080fd5b5061029b60105481565b60405190815260200161024c565b3480156102b557600080fd5b506102dd7f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e81565b6040516001600160a01b03909116815260200161024c565b34801561030157600080fd5b5060045461029b565b34801561031657600080fd5b5061027561032536600461195a565b6107b2565b34801561033657600080fd5b5060075460405160ff909116815260200161024c565b34801561035857600080fd5b5061029b600c5481565b34801561036e57600080fd5b5061038261037d3660046119b0565b61081b565b005b34801561039057600080fd5b5061027561039f36600461192e565b6108b9565b3480156103b057600080fd5b506103826103bf3660046119e5565b6108ef565b3480156103d057600080fd5b506007546102dd9061010090046001600160a01b031681565b3480156103f557600080fd5b5060005461027590600160a81b900460ff1681565b34801561041657600080fd5b506102756104253660046119e5565b6001600160a01b031660009081526003602052604090205460ff1690565b34801561044f57600080fd5b5061029b60115481565b34801561046557600080fd5b5061029b600e5481565b34801561047b57600080fd5b5061029b61048a3660046119e5565b6001600160a01b031660009081526001602052604090205490565b3480156104b157600080fd5b5061038261093d565b3480156104c657600080fd5b5061029b60085481565b3480156104dc57600080fd5b50600b546102dd906001600160a01b031681565b3480156104fc57600080fd5b506000546001600160a01b03166102dd565b34801561051a57600080fd5b506103826105293660046119e5565b6109b1565b34801561053a57600080fd5b5061023f6109fd565b34801561054f57600080fd5b5061029b600d5481565b34801561056557600080fd5b50610382610574366004611a02565b610a0c565b34801561058557600080fd5b50610382610594366004611a1b565b610a3b565b3480156105a557600080fd5b506102756105b436600461192e565b610ad8565b3480156105c557600080fd5b50600a546102dd906001600160a01b031681565b3480156105e557600080fd5b506102756105f436600461192e565b610b27565b34801561060557600080fd5b50610382610614366004611a02565b610b34565b34801561062557600080fd5b50610382610634366004611a4d565b610b63565b34801561064557600080fd5b5061029b60095481565b34801561065b57600080fd5b5061029b61066a366004611a68565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156106a157600080fd5b506012546001600160a01b03166102dd565b3480156106bf57600080fd5b506103826106ce3660046119e5565b610be5565b3480156106df57600080fd5b506103826106ee3660046119e5565b610c30565b3480156106ff57600080fd5b5061029b600f5481565b60606005805461071890611aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461074490611aa1565b80156107915780601f1061076657610100808354040283529160200191610791565b820191906000526020600020905b81548152906001019060200180831161077457829003601f168201915b5050505050905090565b60006107a8338484610e5d565b5060015b92915050565b60006107bf848484610f82565b610811843361080c85604051806060016040528060288152602001611ca6602891396001600160a01b038a166000908152600260209081526040808320338452909152902054919061127a565b610e5d565b5060019392505050565b6000546001600160a01b0316331461084e5760405162461bcd60e51b815260040161084590611adb565b60405180910390fd5b601254604051630d71be6f60e21b81526001600160a01b0384811660048301528315156024830152909116906335c6f9bc90604401600060405180830381600087803b15801561089d57600080fd5b505af11580156108b1573d6000803e3d6000fd5b505050505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916107a891859061080c9086610d1a565b6000546001600160a01b031633146109195760405162461bcd60e51b815260040161084590611adb565b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000546001600160a01b031633146109675760405162461bcd60e51b815260040161084590611adb565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146109db5760405162461bcd60e51b815260040161084590611adb565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606006805461071890611aa1565b6000546001600160a01b03163314610a365760405162461bcd60e51b815260040161084590611adb565b600855565b6000546001600160a01b03163314610a655760405162461bcd60e51b815260040161084590611adb565b600c849055600d839055600e829055600f819055610a8f81610a8984818888610d1a565b90610d1a565b6010819055600f11610ad25760405162461bcd60e51b815260206004820152600c60248201526b546f6f20486967682046656560a01b6044820152606401610845565b50505050565b60006107a8338461080c85604051806060016040528060258152602001611cce602591393360009081526002602090815260408083206001600160a01b038d168452909152902054919061127a565b60006107a8338484610f82565b6000546001600160a01b03163314610b5e5760405162461bcd60e51b815260040161084590611adb565b600955565b6000546001600160a01b03163314610b8d5760405162461bcd60e51b815260040161084590611adb565b60008054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610bda90831515815260200190565b60405180910390a150565b6000546001600160a01b03163314610c0f5760405162461bcd60e51b815260040161084590611adb565b6001600160a01b03166000908152600360205260409020805460ff19169055565b6000546001600160a01b03163314610c5a5760405162461bcd60e51b815260040161084590611adb565b6001600160a01b038116610cbf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610845565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080610d278385611b26565b905083811015610d795760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610845565b9392505050565b6000808211610dd15760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610845565b610d798284611b39565b600082600003610ded575060006107ac565b6000610df98385611b5b565b905082610e068583611b39565b14610d795760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610845565b6001600160a01b038316610ebf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610845565b6001600160a01b038216610f205760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610845565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03848116911614801590610fae57506000546001600160a01b03838116911614155b15610ffd57600854811115610ffd5760405162461bcd60e51b8152602060048201526015602482015274115e18d959591cc813585e08151e08105b5bdd5b9d605a1b6044820152606401610845565b601254604051630e3ab68760e21b81526001600160a01b038481166004830152909116906338eada1c90602401600060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b5050306000908152600160205260408120546009549154909350908310159150600160a01b900460ff161580156110985750600054600160a81b900460ff165b80156110b757506007546001600160a01b038681166101009092041614155b80156110d157506000546001600160a01b03868116911614155b80156110fa575060075461010090046001600160a01b0316600090815260016020526040812054115b15611113578015611113576009549150611113826112b1565b6007546001600160a01b03868116610100909204161461119657601260009054906101000a90046001600160a01b03166001600160a01b031663db11b8bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050505b6001600160a01b03851660009081526003602052604090205460ff161580156111d857506001600160a01b03841660009081526003602052604090205460ff16155b1561126857600061120b60646112056111fe600f546010546113ee90919063ffffffff16565b8790610ddb565b90610d80565b905061121886308361144a565b60006112346064611205600f5488610ddb90919063ffffffff16565b600b5490915061124f9088906001600160a01b03168361144a565b6112638161125d87856113ee565b906113ee565b945050505b61127385858561144a565b5050505050565b6000818484111561129e5760405162461bcd60e51b815260040161084591906118c8565b506112a98385611b72565b949350505050565b6000805460ff60a01b1916600160a01b178155600f546010546112d49190611b72565b905060006112f6600261120584611205600d5488610ddb90919063ffffffff16565b9050600061130484836113ee565b905061130f816115d0565b6000479050600061132f85611205600e5485610ddb90919063ffffffff16565b600a546040519192506001600160a01b03169082156108fc029083906000818181858888f1935050505015801561136a573d6000803e3d6000fd5b50600061138686611205600d5486610ddb90919063ffffffff16565b905061139285826117c9565b6012546001600160a01b03166108fc6113af8361125d87876113ee565b6040518115909202916000818181858888f193505050501580156113d7573d6000803e3d6000fd5b50506000805460ff60a01b19169055505050505050565b6000828211156114405760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610845565b610d798284611b72565b6001600160a01b0383166114ae5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610845565b6001600160a01b0382166115105760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610845565b61154d81604051806060016040528060268152602001611c80602691396001600160a01b038616600090815260016020526040902054919061127a565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461157c9082610d1a565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f759085815260200190565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061160557611605611b85565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a79190611b9b565b816001815181106116ba576116ba611b85565b60200260200101906001600160a01b031690816001600160a01b031681525050611705307f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e84610e5d565b60405163791ac94760e01b81526001600160a01b037f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e169063791ac9479061175a908590600090869030904290600401611bfc565b600060405180830381600087803b15801561177457600080fd5b505af1158015611788573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a782826040516117bd929190611c38565b60405180910390a15050565b6117f4307f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e84610e5d565b7f000000000000000000000000c634160137e8f3c2a7cc02e2637acd53e1c24b5e6001600160a01b031663f305d71982308560008061183b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156118a3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112739190611c51565b600060208083528351808285015260005b818110156118f5578581018301518582016040015282016118d9565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461192b57600080fd5b50565b6000806040838503121561194157600080fd5b823561194c81611916565b946020939093013593505050565b60008060006060848603121561196f57600080fd5b833561197a81611916565b9250602084013561198a81611916565b929592945050506040919091013590565b803580151581146119ab57600080fd5b919050565b600080604083850312156119c357600080fd5b82356119ce81611916565b91506119dc6020840161199b565b90509250929050565b6000602082840312156119f757600080fd5b8135610d7981611916565b600060208284031215611a1457600080fd5b5035919050565b60008060008060808587031215611a3157600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215611a5f57600080fd5b610d798261199b565b60008060408385031215611a7b57600080fd5b8235611a8681611916565b91506020830135611a9681611916565b809150509250929050565b600181811c90821680611ab557607f821691505b602082108103611ad557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156107ac576107ac611b10565b600082611b5657634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176107ac576107ac611b10565b818103818111156107ac576107ac611b10565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611bad57600080fd5b8151610d7981611916565b600081518084526020808501945080840160005b83811015611bf15781516001600160a01b031687529582019590820190600101611bcc565b509495945050505050565b85815284602082015260a060408201526000611c1b60a0830186611bb8565b6001600160a01b0394909416606083015250608001529392505050565b8281526040602082015260006112a96040830184611bb8565b600080600060608486031215611c6657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220da3dc6c9417f44f4152aacb9445753d2b28ea1a5d2c966339320e92e201c484264736f6c63430008120033