Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- 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