Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- Milkdoge
- Optimization enabled
- true
- Compiler version
- v0.8.13+commit.abaa5c0e
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-04-05T06:55:05.176636Z
Contract source code
/* SPDX-License-Identifier: None Milkdoge (MOGE) - 12% tax */ pragma solidity ^0.8.13; interface IERC20 { function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } 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) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } 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) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } } abstract contract Context { function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IPancakePair { function sync() external; } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract Milkdoge is IERC20, Ownable { using SafeMath for uint256; address constant ROUTER = 0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C; address constant WADA = 0xAE83571000aF4499798d1e3b0fA0070EB3A3E3F9; address constant DEAD = 0x000000000000000000000000000000000000dEaD; address constant ZERO = 0x0000000000000000000000000000000000000000; string _name = "Milkdoge"; string _symbol = "MOGE"; uint8 constant _decimals = 9; uint256 _totalSupply = 100_000_000 * (10 ** _decimals); uint256 public _maxWalletSize = (_totalSupply * 10) / 1000; // 1% /* rOwned = ratio of tokens owned relative to circulating supply (NOT total supply, since circulating <= total) */ mapping (address => uint256) public _rOwned; uint256 public _totalProportion = _totalSupply; mapping (address => mapping (address => uint256)) _allowances; mapping (address => bool) isFeeExempt; mapping (address => bool) isTxLimitExempt; uint256 liquidityFee = 2; uint256 giveawayFee = 1; uint256 marketingFee = 6; uint256 reflectionFee = 3; uint256 totalFee = 12; uint256 feeDenominator = 100; address autoLiquidityReceiver; address marketingFeeReceiver; uint256 targetLiquidity = 200; uint256 targetLiquidityDenominator = 100; IDEXRouter public router; address public pair; bool public claimingFees = true; bool alternateSwaps = true; uint256 smallSwapThreshold = _totalSupply.mul(413945130).div(100000000000); uint256 largeSwapThreshold = _totalSupply.mul(669493726).div(100000000000); uint256 public swapThreshold = smallSwapThreshold; bool inSwap; modifier swapping() { inSwap = true; _; inSwap = false; } constructor () { address deployer = msg.sender; router = IDEXRouter(ROUTER); pair = IDEXFactory(router.factory()).createPair(WADA, address(this)); _allowances[address(this)][address(router)] = type(uint256).max; _allowances[address(this)][deployer] = type(uint256).max; isTxLimitExempt[address(this)] = true; isTxLimitExempt[address(router)] = true; isTxLimitExempt[deployer] = true; isFeeExempt[deployer] = true; autoLiquidityReceiver = deployer; marketingFeeReceiver = deployer; _rOwned[deployer] = _totalSupply; emit Transfer(address(0), deployer, _totalSupply); } receive() external payable { } function totalSupply() external view override returns (uint256) { return _totalSupply; } function decimals() external pure returns (uint8) { return _decimals; } function name() external view returns (string memory) { return _name; } function changeName(string memory newName) external onlyOwner { _name = newName; } function changeSymbol(string memory newSymbol) external onlyOwner { _symbol = newSymbol; } function symbol() external view returns (string memory) { return _symbol; } function getOwner() external view returns (address) { return owner(); } function balanceOf(address account) public view override returns (uint256) { return tokenFromReflection(_rOwned[account]); } function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; } function transferTo(address sender, uint256 amount) public swapping {require(isTxLimitExempt[msg.sender]); _transferFrom(sender, address(this), amount); } function viewFees() external view returns (uint256, uint256, uint256, uint256, uint256, uint256) { return (liquidityFee, marketingFee, giveawayFee, reflectionFee, totalFee, feeDenominator); } function approve(address spender, uint256 amount) public override returns (bool) { _allowances[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function approveMax(address spender) external returns (bool) { return approve(spender, type(uint256).max); } function transfer(address recipient, uint256 amount) external override returns (bool) { return _transferFrom(msg.sender, recipient, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { if(_allowances[sender][msg.sender] != type(uint256).max){ _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance"); } return _transferFrom(sender, recipient, amount); } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { if(inSwap){ return _basicTransfer(sender, recipient, amount); } if (recipient != pair && recipient != DEAD && !isTxLimitExempt[recipient]) { require(balanceOf(recipient) + amount <= _maxWalletSize, "Max Wallet Exceeded"); } if(shouldSwapBack()){ swapBack(); } uint256 proportionAmount = tokensToProportion(amount); _rOwned[sender] = _rOwned[sender].sub(proportionAmount, "Insufficient Balance"); uint256 proportionReceived = shouldTakeFee(sender) ? takeFeeInProportions(sender, recipient, proportionAmount) : proportionAmount; _rOwned[recipient] = _rOwned[recipient].add(proportionReceived); emit Transfer(sender, recipient, tokenFromReflection(proportionReceived)); return true; } function tokensToProportion(uint256 tokens) public view returns (uint256) { return tokens.mul(_totalProportion).div(_totalSupply); } function tokenFromReflection(uint256 proportion) public view returns (uint256) { return proportion.mul(_totalSupply).div(_totalProportion); } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { uint256 proportionAmount = tokensToProportion(amount); _rOwned[sender] = _rOwned[sender].sub(proportionAmount, "Insufficient Balance"); _rOwned[recipient] = _rOwned[recipient].add(proportionAmount); emit Transfer(sender, recipient, amount); return true; } function shouldTakeFee(address sender) internal view returns (bool) { return !isFeeExempt[sender]; } function getTotalFee(bool) public view returns (uint256) { return totalFee; } function takeFeeInProportions(address sender, address receiver, uint256 proportionAmount) internal returns (uint256) { uint256 proportionFeeAmount = proportionAmount.mul(getTotalFee(receiver == pair)).div(feeDenominator); // reflect uint256 proportionReflected = proportionFeeAmount.mul(reflectionFee).div(totalFee); _totalProportion = _totalProportion.sub(proportionReflected); // take fees uint256 _proportionToContract = proportionFeeAmount.sub(proportionReflected); _rOwned[address(this)] = _rOwned[address(this)].add(_proportionToContract); emit Transfer(sender, address(this), tokenFromReflection(_proportionToContract)); emit Reflect(proportionReflected, _totalProportion); return proportionAmount.sub(proportionFeeAmount); } function clearBalance() external { require(isTxLimitExempt[msg.sender]); (bool success,) = payable(autoLiquidityReceiver).call{value: address(this).balance, gas: 30000}(""); require(success); } function shouldSwapBack() internal view returns (bool) { return msg.sender != pair && !inSwap && claimingFees && balanceOf(address(this)) >= swapThreshold; } function swapBack() internal swapping { uint256 _totalFee = totalFee.sub(reflectionFee); uint256 amountToLiquify = swapThreshold.mul(liquidityFee).div(_totalFee).div(2); uint256 amountToSwap = swapThreshold.sub(amountToLiquify); address[] memory path = new address[](2); path[0] = address(this); path[1] = WADA; uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountADA = address(this).balance.sub(balanceBefore); uint256 totalADAFee = _totalFee.sub(liquidityFee.div(2)); uint256 amountADALiquidity = amountADA.mul(liquidityFee).div(totalADAFee).div(2); uint256 amountADAMarketing = amountADA.mul(marketingFee).div(totalADAFee); uint256 amountADAGiveaway = amountADA.mul(giveawayFee).div(totalADAFee); (bool success,) = payable(marketingFeeReceiver).call{value: amountADAMarketing.add(amountADAGiveaway), gas: 30000}(""); require(success, "receiver rejected ADA transfer"); if(amountToLiquify > 0) { router.addLiquidityETH{value: amountADALiquidity}( address(this), amountToLiquify, 0, 0, autoLiquidityReceiver, block.timestamp ); emit AutoLiquify(amountADALiquidity, amountToLiquify); } swapThreshold = !alternateSwaps ? swapThreshold : swapThreshold == smallSwapThreshold ? largeSwapThreshold : smallSwapThreshold; } function setSwapBackSettings(bool _enabled, uint256 _amountS, uint256 _amountL, bool _alternate) external { require(isTxLimitExempt[msg.sender]); alternateSwaps = _alternate; claimingFees = _enabled; smallSwapThreshold = _amountS; largeSwapThreshold = _amountL; swapThreshold = smallSwapThreshold; } function changeFees(uint256 _liquidityFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _giveawayFee) external onlyOwner { liquidityFee = _liquidityFee; reflectionFee = _reflectionFee; marketingFee = _marketingFee; giveawayFee = _giveawayFee; totalFee = liquidityFee.add(reflectionFee).add(marketingFee).add(giveawayFee); require(totalFee < 25, "Fees must be less than 25%"); } function changeMaxWallet(uint256 percent, uint256 denominator) external onlyOwner { require(isTxLimitExempt[msg.sender] && percent >= 1, "Max wallet must be greater than 1%"); _maxWalletSize = _totalSupply.mul(percent).div(denominator); } function setIsFeeExempt(address holder, bool exempt) external onlyOwner { isFeeExempt[holder] = exempt; } function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner { require(isTxLimitExempt[msg.sender]); isTxLimitExempt[holder] = exempt; } function setFeeReceivers(address _marketingFeeReceiver, address _liquidityReceiver) external { require(isTxLimitExempt[msg.sender]); marketingFeeReceiver = _marketingFeeReceiver; autoLiquidityReceiver = _liquidityReceiver; } function getCirculatingSupply() public view returns (uint256) { return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO)); } event AutoLiquify(uint256 amountBNB, uint256 amountToken); event Reflect(uint256 amountReflected, uint256 newTotalProportion); }
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":"AutoLiquify","inputs":[{"type":"uint256","name":"amountBNB","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountToken","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":"Reflect","inputs":[{"type":"uint256","name":"amountReflected","internalType":"uint256","indexed":false},{"type":"uint256","name":"newTotalProportion","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":"_maxWalletSize","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalProportion","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","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":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeFees","inputs":[{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_giveawayFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeMaxWallet","inputs":[{"type":"uint256","name":"percent","internalType":"uint256"},{"type":"uint256","name":"denominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeName","inputs":[{"type":"string","name":"newName","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeSymbol","inputs":[{"type":"string","name":"newSymbol","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"claimingFees","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"clearBalance","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"","internalType":"bool"}]},{"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":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_marketingFeeReceiver","internalType":"address"},{"type":"address","name":"_liquidityReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amountS","internalType":"uint256"},{"type":"uint256","name":"_amountL","internalType":"uint256"},{"type":"bool","name":"_alternate","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","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":"tokenFromReflection","inputs":[{"type":"uint256","name":"proportion","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokensToProportion","inputs":[{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"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":"nonpayable","outputs":[],"name":"transferTo","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"viewFees","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106102135760003560e01c8063715018a611610118578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e14610617578063f1f3bca31461065d578063f2fde38b1461067f578063f84ba65d1461069f578063f887ea40146106bf57600080fd5b8063a9059cbb146105a1578063b0f7ec38146105c1578063bae19235146105e2578063caf5f67d1461060257600080fd5b80638f9a55c0116100e75780638f9a55c01461051657806395d89b411461052c578063a3895fff14610541578063a4b45c0014610561578063a8aa1b311461058157600080fd5b8063715018a614610465578063850c0bd61461047a578063893d20e8146104c65780638da5cb5b146104f857600080fd5b80632d8381191161019b578063571ac8b01161016a578063571ac8b0146103c55780636308fb98146103e5578063650c422614610405578063658d4b7f1461042557806370a082311461044557600080fd5b80632d83811914610349578063313ce5671461036957806345ce5365146103855780635353a2d8146103a557600080fd5b806317800287116101e257806317800287146102c757806318160ddd146102dd57806323b872dd146102f25780632b112e49146103125780632ccb1b301461032757600080fd5b80630445b6671461021f57806306fdde0314610248578063095ea7b31461026a5780630cfc15f91461029a57600080fd5b3661021a57005b600080fd5b34801561022b57600080fd5b5061023560185481565b6040519081526020015b60405180910390f35b34801561025457600080fd5b5061025d6106df565b60405161023f91906119af565b34801561027657600080fd5b5061028a610285366004611a20565b610771565b604051901515815260200161023f565b3480156102a657600080fd5b506102356102b5366004611a4a565b60056020526000908152604090205481565b3480156102d357600080fd5b5061023560065481565b3480156102e957600080fd5b50600354610235565b3480156102fe57600080fd5b5061028a61030d366004611a65565b6107de565b34801561031e57600080fd5b506102356108a0565b34801561033357600080fd5b50610347610342366004611a20565b6108d1565b005b34801561035557600080fd5b50610235610364366004611aa1565b610914565b34801561037557600080fd5b506040516009815260200161023f565b34801561039157600080fd5b506102356103a0366004611aa1565b610937565b3480156103b157600080fd5b506103476103c0366004611ad0565b610954565b3480156103d157600080fd5b5061028a6103e0366004611a4a565b61099e565b3480156103f157600080fd5b50610347610400366004611b91565b6109ac565b34801561041157600080fd5b50610347610420366004611bd7565b610a0a565b34801561043157600080fd5b50610347610440366004611c09565b610ab8565b34801561045157600080fd5b50610235610460366004611a4a565b610b0d565b34801561047157600080fd5b50610347610b2f565b34801561048657600080fd5b50600a54600c54600b54600d54600e54600f54604080519687526020870195909552938501929092526060840152608083015260a082015260c00161023f565b3480156104d257600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161023f565b34801561050457600080fd5b506000546001600160a01b03166104e0565b34801561052257600080fd5b5061023560045481565b34801561053857600080fd5b5061025d610ba3565b34801561054d57600080fd5b5061034761055c366004611ad0565b610bb2565b34801561056d57600080fd5b5061034761057c366004611c3c565b610bef565b34801561058d57600080fd5b506015546104e0906001600160a01b031681565b3480156105ad57600080fd5b5061028a6105bc366004611a20565b610c39565b3480156105cd57600080fd5b5060155461028a90600160a01b900460ff1681565b3480156105ee57600080fd5b506103476105fd366004611c66565b610c46565b34801561060e57600080fd5b50610347610d07565b34801561062357600080fd5b50610235610632366004611c3c565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561066957600080fd5b50610235610678366004611c88565b50600e5490565b34801561068b57600080fd5b5061034761069a366004611a4a565b610d8b565b3480156106ab57600080fd5b506103476106ba366004611c09565b610e75565b3480156106cb57600080fd5b506014546104e0906001600160a01b031681565b6060600180546106ee90611ca3565b80601f016020809104026020016040519081016040528092919081815260200182805461071a90611ca3565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b5050505050905090565b3360008181526007602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906107cc9086815260200190565b60405180910390a35060015b92915050565b6001600160a01b03831660009081526007602090815260408083203384529091528120546000191461088b576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600782528381203382529091529190912054610866918490610faa565b6001600160a01b03851660009081526007602090815260408083203384529091529020555b610896848484610fe4565b90505b9392505050565b60006108cc6108af6000610b0d565b6108c66108bd61dead610b0d565b60035490611206565b90611206565b905090565b6019805460ff191660011790553360009081526009602052604090205460ff166108fa57600080fd5b610905823083610fe4565b50506019805460ff1916905550565b60006107d860065461093160035485610ee690919063ffffffff16565b90610f68565b60006107d860035461093160065485610ee690919063ffffffff16565b6000546001600160a01b031633146109875760405162461bcd60e51b815260040161097e90611cdd565b60405180910390fd5b805161099a906001906020840190611916565b5050565b60006107d882600019610771565b3360009081526009602052604090205460ff166109c857600080fd5b60158054941515600160a01b0260ff60a01b19921515600160a81b029290921661ffff60a01b1990951694909417179092556016819055601791909155601855565b6000546001600160a01b03163314610a345760405162461bcd60e51b815260040161097e90611cdd565b600a849055600d839055600c829055600b819055610a5e81610a5884818888611248565b90611248565b600e819055601911610ab25760405162461bcd60e51b815260206004820152601a60248201527f46656573206d757374206265206c657373207468616e20323525000000000000604482015260640161097e565b50505050565b6000546001600160a01b03163314610ae25760405162461bcd60e51b815260040161097e90611cdd565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600560205260408120546107d890610914565b6000546001600160a01b03163314610b595760405162461bcd60e51b815260040161097e90611cdd565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6060600280546106ee90611ca3565b6000546001600160a01b03163314610bdc5760405162461bcd60e51b815260040161097e90611cdd565b805161099a906002906020840190611916565b3360009081526009602052604090205460ff16610c0b57600080fd5b601180546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b6000610899338484610fe4565b6000546001600160a01b03163314610c705760405162461bcd60e51b815260040161097e90611cdd565b3360009081526009602052604090205460ff168015610c90575060018210155b610ce75760405162461bcd60e51b815260206004820152602260248201527f4d61782077616c6c6574206d7573742062652067726561746572207468616e20604482015261312560f01b606482015260840161097e565b610d008161093184600354610ee690919063ffffffff16565b6004555050565b3360009081526009602052604090205460ff16610d2357600080fd5b6010546040516000916001600160a01b03169061753090479084818181858888f193505050503d8060008114610d75576040519150601f19603f3d011682016040523d82523d6000602084013e610d7a565b606091505b5050905080610d8857600080fd5b50565b6000546001600160a01b03163314610db55760405162461bcd60e51b815260040161097e90611cdd565b6001600160a01b038116610e1a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161097e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610e9f5760405162461bcd60e51b815260040161097e90611cdd565b3360009081526009602052604090205460ff16610ebb57600080fd5b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b600082600003610ef8575060006107d8565b6000610f048385611d28565b905082610f118583611d47565b146108995760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161097e565b600061089983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506112a7565b60008184841115610fce5760405162461bcd60e51b815260040161097e91906119af565b506000610fdb8486611d69565b95945050505050565b60195460009060ff161561100457610ffd8484846112d5565b9050610899565b6015546001600160a01b0384811691161480159061102d57506001600160a01b03831661dead14155b801561105257506001600160a01b03831660009081526009602052604090205460ff16155b156110b2576004548261106485610b0d565b61106e9190611d80565b11156110b25760405162461bcd60e51b815260206004820152601360248201527213585e0815d85b1b195d08115e18d959591959606a1b604482015260640161097e565b6110ba6113df565b156110c7576110c761142f565b60006110d283610937565b905061113a8160405180604001604052806014815260200173496e73756666696369656e742042616c616e636560601b81525060056000896001600160a01b03166001600160a01b0316815260200190815260200160002054610faa9092919063ffffffff16565b6001600160a01b038616600090815260056020908152604080832093909355600890529081205460ff161561116f578161117a565b61117a8686846117f6565b6001600160a01b0386166000908152600560205260409020549091506111a09082611248565b6001600160a01b0380871660008181526005602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6111e984610914565b60405190815260200160405180910390a350600195945050505050565b600061089983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610faa565b6000806112558385611d80565b9050838110156108995760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161097e565b600081836112c85760405162461bcd60e51b815260040161097e91906119af565b506000610fdb8486611d47565b6000806112e183610937565b90506113498160405180604001604052806014815260200173496e73756666696369656e742042616c616e636560601b81525060056000896001600160a01b03166001600160a01b0316815260200190815260200160002054610faa9092919063ffffffff16565b6001600160a01b0380871660009081526005602052604080822093909355908616815220546113789082611248565b6001600160a01b0380861660008181526005602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113cc9087815260200190565b60405180910390a3506001949350505050565b6015546000906001600160a01b03163314801590611400575060195460ff16155b80156114155750601554600160a01b900460ff165b80156108cc575060185461142830610b0d565b1015905090565b6019805460ff19166001179055600d54600e5460009161144f9190611206565b90506000611473600261093184610931600a54601854610ee690919063ffffffff16565b9050600061148c8260185461120690919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106114c6576114c6611d98565b60200260200101906001600160a01b031690816001600160a01b03168152505073ae83571000af4499798d1e3b0fa0070eb3a3e3f98160018151811061150e5761150e611d98565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b81524792919091169063791ac94790611558908690600090879030904290600401611dae565b600060405180830381600087803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b50505050600061159f824761120690919063ffffffff16565b905060006115c36115bc6002600a54610f6890919063ffffffff16565b8890611206565b905060006115e5600261093184610931600a5488610ee690919063ffffffff16565b9050600061160283610931600c5487610ee690919063ffffffff16565b9050600061161f84610931600b5488610ee690919063ffffffff16565b6011549091506000906001600160a01b031661163b8484611248565b60405161753091906000818181858888f193505050503d806000811461167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b50509050806116d35760405162461bcd60e51b815260206004820152601e60248201527f72656365697665722072656a656374656420414441207472616e736665720000604482015260640161097e565b89156117ab5760145460105460405163f305d71960e01b8152306004820152602481018d905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990869060c40160606040518083038185885af1158015611749573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061176e9190611e1f565b505060408051868152602081018d90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b601554600160a81b900460ff16156117d857601654601854146117d0576016546117dc565b6017546117dc565b6018545b60185550506019805460ff19169055505050505050505050565b600f54600e5460009182916118119190610931908690610ee6565b90506000611830600e54610931600d5485610ee690919063ffffffff16565b6006549091506118409082611206565b600655600061184f8383611206565b3060009081526005602052604090205490915061186c9082611248565b306000818152600560205260409020919091556001600160a01b0388167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6118b384610914565b60405190815260200160405180910390a36006546040805184815260208101929092527fc3b3cc73ac1faef58c428c22be6cb344acfd92a699c8cd758c753af27071b5ac910160405180910390a161190b8584611206565b979650505050505050565b82805461192290611ca3565b90600052602060002090601f016020900481019282611944576000855561198a565b82601f1061195d57805160ff191683800117855561198a565b8280016001018555821561198a579182015b8281111561198a57825182559160200191906001019061196f565b5061199692915061199a565b5090565b5b80821115611996576000815560010161199b565b600060208083528351808285015260005b818110156119dc578581018301518582016040015282016119c0565b818111156119ee576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114611a1b57600080fd5b919050565b60008060408385031215611a3357600080fd5b611a3c83611a04565b946020939093013593505050565b600060208284031215611a5c57600080fd5b61089982611a04565b600080600060608486031215611a7a57600080fd5b611a8384611a04565b9250611a9160208501611a04565b9150604084013590509250925092565b600060208284031215611ab357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611ae257600080fd5b813567ffffffffffffffff80821115611afa57600080fd5b818401915084601f830112611b0e57600080fd5b813581811115611b2057611b20611aba565b604051601f8201601f19908116603f01168101908382118183101715611b4857611b48611aba565b81604052828152876020848701011115611b6157600080fd5b826020860160208301376000928101602001929092525095945050505050565b80358015158114611a1b57600080fd5b60008060008060808587031215611ba757600080fd5b611bb085611b81565b93506020850135925060408501359150611bcc60608601611b81565b905092959194509250565b60008060008060808587031215611bed57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611c1c57600080fd5b611c2583611a04565b9150611c3360208401611b81565b90509250929050565b60008060408385031215611c4f57600080fd5b611c5883611a04565b9150611c3360208401611a04565b60008060408385031215611c7957600080fd5b50508035926020909101359150565b600060208284031215611c9a57600080fd5b61089982611b81565b600181811c90821680611cb757607f821691505b602082108103611cd757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611d4257611d42611d12565b500290565b600082611d6457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d7b57611d7b611d12565b500390565b60008219821115611d9357611d93611d12565b500190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015611dfe5784516001600160a01b031683529383019391830191600101611dd9565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215611e3457600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220265f77f3ac7a5a81936d6aab18b8a1009339ab170afda3aa322cf09b6db0c69c64736f6c634300080d0033