Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
79,404,157.916396112471701955 $ROGAN
Holders
126
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.132282349213065568 $ROGANValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ROGEN_ETH
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
/* ⠀⠀⠀⠀⢀⣠⣴⣶⣦⣤⣄⡀⠀⠀⠀⠀ ⠀⠀⢀⣼⣿⣿⣼⣿⣿⣿⣿⣿⣤⠀⠀⠀ ⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀ ⠀⣿⣿⣿⣾⣟⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀ ⢐⠟⠛⠿⢿⣯⣿⡿⠿⠿⣿⣿⣿⣿⡇⠀ ⢸⢷⣩⣁⡀⣽⣾⣎⣍⣹⣳⣽⣿⡟⣔⡁ ⠘⣾⣿⣿⡇⣿⣯⢿⣿⣟⣽⣿⣿⡇⣝⡑ ⠘⣿⣿⣿⡓⢿⠿⢯⡿⣿⣿⣿⣿⣧⡗⠀ ⠘⡟⣿⡿⠿⠴⠿⢿⢿⣎⡿⣿⢟⡅⠀⠀ ⠀⠐⠘⣿⣾⣭⣭⣷⣿⠟⣝⣵⠟⠀⠀⠀ ⠀⠀⠀⢻⣿⣿⣿⣿⡏⣾⡟⠃⠀⠀⠀⠀ ⠀⠀⠀⠀⠈⠩⠍⠉⠚⠉⠀⠀⠀⠀⠀⠀ JOE ROGAN - Meme Token Madness! (Concept by Bonedogg) */ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; import "./CF_ERC20.sol"; import "./CF_Recoverable.sol"; import "./CF_Burnable.sol"; import "./CF_Whitelist.sol"; import "./CF_MaxTx.sol"; import "./CF_MaxBalance.sol"; import "./CF_Taxable.sol"; import "./CF_DEXRouterV2.sol"; contract ROGEN_ETH is CF_Common, CF_Ownable, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Whitelist, CF_MaxTx, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 { constructor() { _name = unicode"Joe Rogan"; _symbol = unicode"$ROGAN"; _decimals = 18; _totalSupply = 100000000000000000000000000; // 100,000,000 $ROGAN _transferOwnership(0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe); _transferInitialSupply(0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe, 84000); // 84% _transferInitialSupply(0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41, 6000); // 6% _transferInitialSupply(0x1aDc4fbFe3B7B1c53b6e87Ec9ce902b188512849, 3300); // 3.3% _transferInitialSupply(0xD8f2DC01898b2A9D0A6d3fCc030C9468229c66e0, 3300); // 3.3% _transferInitialSupply(0xA060c07c326Db2bdc6Ce26C04efB24735C8eA8DB, 3400); // 3.4% _setDEXRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe); _setEarlyPenaltyTime(600); // 10min _setTaxToken(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); _setAutoSwapPercent(100, 500); // 0.1% -> 0.5% of total supply _autoSwapEnabled = true; _setTaxBeneficiary(0, 0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41, [ uint24(0), uint24(2000), uint24(2000) ], [ uint24(50000), uint24(50000), uint24(50000) ]); // Marketing _setTaxBeneficiary(1, 0x000000000000000000000000000000000000dEaD, [ uint24(0), uint24(1000), uint24(1000) ], [ uint24(0), uint24(0), uint24(0) ]); // Burn _setTaxBeneficiary(2, _dex.pair, [ uint24(0), uint24(1000), uint24(1000) ], [ uint24(0), uint24(0), uint24(0) ]); // LP _initialWhitelist([ 0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41 ]); _setMaxBalancePercent(2000); // 2% of total supply _initialized = true; } function _transfer(address from, address to, uint256 amount) internal virtual override { if (to == address(0xdEaD)) { _burn(from, amount); return; } if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) { _autoSwap(false); _autoTaxDistribute(); } if (amount > 0 && !_whitelisted[from] && !_whitelisted[to] && from != address(this) && to != address(this) && to != _dex.router) { require((from != _dex.pair && to != _dex.pair) || ((from == _dex.pair || to == _dex.pair) && _tradingEnabled > 0), "Trading disabled"); unchecked { require(_maxTxAmount == 0 || amount <= _maxTxAmount, "Exceeds maxTx"); require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance"); if (!_suspendTaxes && !_distributing && !_swapping) { uint256 appliedTax; uint8 taxType; if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; } address _account = taxType == 1 ? to : from; if (_tradingEnabled + _earlyPenaltyTime >= _timestamp() && !_holder[_account].penalty) { _holder[_account].penalty = true; } for (uint8 i; i < 5; i++) { uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? (_holder[_account].penalty ? _taxBeneficiary[i].penalty[1] : _taxBeneficiary[i].percent[1]) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[2] : _taxBeneficiary[i].percent[2])) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[0] : _taxBeneficiary[i].percent[0])); if (percent == 0) { continue; } uint256 taxAmount = _percentage(amount, percent); super._transfer(from, address(this), taxAmount); if (_taxBeneficiary[i].account == _dex.pair) { _amountForLiquidity += taxAmount; } else if (_taxBeneficiary[i].account == address(0xdEaD)) { _burn(address(this), taxAmount); } else { _taxBeneficiary[i].unclaimed += taxAmount; _amountForTaxDistribution += taxAmount; _totalTaxUnclaimed += taxAmount; } appliedTax += taxAmount; } if (appliedTax > 0) { _totalTaxCollected += appliedTax; amount -= appliedTax; } } } } super._transfer(from, to, amount); } function _burn(address account, uint256 amount) internal virtual override { super._burn(account, amount); _setMaxTxPercent(_maxTxPercent); _setMaxBalancePercent(_maxBalancePercent); _setAutoSwapPercent(_minAutoSwapPercent, _maxAutoSwapPercent); } function _transferInitialSupply(address account, uint24 percent) private { require(!_initialized); uint256 amount = _percentage(_totalSupply, uint256(percent)); _balance[account] = amount; emit Transfer(address(0), account, amount); } /// @notice Returns a list specifying the renounce status of each feature function renounced() external view returns (bool Whitelist, bool MaxTx, bool MaxBalance, bool DEXRouterV2, bool Taxable) { return (_renounced.Whitelist, _renounced.MaxTx, _renounced.MaxBalance, _renounced.DEXRouterV2, _renounced.Taxable); } /// @notice Returns basic information about this Smart-Contract function info() external view returns (string memory name, string memory symbol, uint8 decimals, address owner, uint256 totalSupply, string memory version) { return (_name, _symbol, _decimals, _owner, _totalSupply, _version); } receive() external payable { } fallback() external payable { } } /* ________ _ ______ __ / ____/ /_ ____ _(_)___ / ____/___ ______/ /_____ _______ __ / / / __ \/ __ `/ / __ \/ /_ / __ `/ ___/ __/ __ \/ ___/ / / / / /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / / / /_/ / \____/_/ /_/\__,_/_/_/ /_/_/ \__,_/\___/\__/\____/_/ \__, / /____/ Smart-Contract generated and deployed by ChainFactory Web: https://chainfactory.app/ X: https://x.com/ChainFactoryApp Telegram: https://t.me/ChainFactory Discord: https://discord.gg/fpjxD39v3k YouTube: https://youtube.com/@UpfrontDeFi By using this Smart-Contract generated and deployed by ChainFactory, you acknowledge and agree that ChainFactory shall not be liable for any damages arising from the use of this Smart-Contract, including but not limited to any damages resulting from any malicious or illegal use of the Smart-Contract by any third party or by the owner. The owner of the Smart-Contract generated by ChainFactory agrees not to misuse the Smart-Contract, including but not limited to: - Using the Smart-Contract to engage in any illegal or fraudulent activity, including but not limited to scams, theft, or money laundering. - Using the Smart-Contract in any manner that could cause harm to others, including but not limited to disrupting financial markets or causing financial loss to others. - Using the Smart-Contract to infringe upon the intellectual property rights of others, including but not limited to copyright, trademark, or patent infringement. The owner of the Smart-Contract generated by ChainFactory acknowledges that any misuse of the Smart-Contract may result in legal action, and agrees to indemnify and hold harmless ChainFactory from any and all claims, damages, or expenses arising from any such misuse. */
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./IDEXV2.sol"; import "./IERC20.sol"; abstract contract CF_Common { string internal constant _version = "1.0.1"; mapping(address => uint256) internal _balance; mapping(address => mapping(address => uint256)) internal _allowance; mapping(address => bool) internal _whitelisted; mapping(address => holderAccount) internal _holder; mapping(uint8 => taxBeneficiary) internal _taxBeneficiary; address[] internal _holders; bool internal _autoSwapEnabled; bool internal _swapping; bool internal _suspendTaxes; bool internal _distributing; bool internal immutable _initialized; uint8 internal immutable _decimals; uint24 internal constant _denominator = 1000; uint24 internal _maxTxPercent; uint24 internal _maxBalancePercent; uint24 internal _totalTxTax; uint24 internal _totalBuyTax; uint24 internal _totalSellTax; uint24 internal _totalPenaltyTxTax; uint24 internal _totalPenaltyBuyTax; uint24 internal _totalPenaltySellTax; uint24 internal _minAutoSwapPercent; uint24 internal _maxAutoSwapPercent; uint32 internal _lastTaxDistribution; uint32 internal _tradingEnabled; uint32 internal _lastSwap; uint32 internal _earlyPenaltyTime; uint256 internal _totalSupply; uint256 internal _totalBurned; uint256 internal _maxTxAmount; uint256 internal _maxBalanceAmount; uint256 internal _minAutoSwapAmount; uint256 internal _maxAutoSwapAmount; uint256 internal _amountForLiquidity; uint256 internal _totalTaxCollected; uint256 internal _totalTaxUnclaimed; uint256 internal _amountForTaxDistribution; uint256 internal _amountSwappedForTaxDistribution; uint256 internal _ethForTaxDistribution; uint256 internal _tokensForTaxDistribution; struct Renounced { bool Whitelist; bool MaxTx; bool MaxBalance; bool Taxable; bool DEXRouterV2; } struct holderAccount { bool exists; bool penalty; } struct taxBeneficiary { bool exists; address account; uint24[3] percent; // 0: tx, 1: buy, 2: sell uint24[3] penalty; uint256 unclaimed; } struct DEXRouterV2 { address router; address pair; address WETH; address receiver; } Renounced internal _renounced; IERC20 internal _taxToken; DEXRouterV2 internal _dex; function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) { unchecked { return (amount * bps) / (100 * uint256(_denominator)); } } function _timestamp() internal view returns (uint32) { unchecked { return uint32(block.timestamp % 2**32); } } function denominator() external pure returns (uint24) { return _denominator; } function version() external pure returns (string memory) { return _version; } }
// SPDX-License-Identifier: MIT import "./CF_Common.sol"; pragma solidity 0.8.24; abstract contract CF_Ownable is CF_Common { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); modifier onlyOwner() { require(_owner == msg.sender, "Unauthorized"); _; } function owner() external view returns (address) { return _owner; } function renounceOwnership() external onlyOwner { _renounced.Whitelist = true; _renounced.MaxTx = true; _renounced.MaxBalance = true; _renounced.Taxable = true; _renounced.DEXRouterV2 = true; _transferOwnership(address(0)); } function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0)); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; abstract contract CF_ERC20 is CF_Common { string internal _name; string internal _symbol; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function decimals() external view returns (uint8) { return _decimals; } function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balance[account]; } function allowance(address owner, address spender) public view returns (uint256) { return _allowance[owner][spender]; } function approve(address spender, uint256 amount) external returns (bool) { _approve(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) external returns (bool) { _transfer(msg.sender, to, amount); return true; } function transferFrom(address from, address to, uint256 amount) external returns (bool) { _spendAllowance(from, msg.sender, amount); _transfer(from, to, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { unchecked { _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue); } return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 currentAllowance = allowance(msg.sender, spender); require(currentAllowance >= subtractedValue, "Negative allowance"); unchecked { _approve(msg.sender, spender, currentAllowance - subtractedValue); } return true; } function _approve(address owner, address spender, uint256 amount) internal { _allowance[owner][spender] = amount; emit Approval(owner, spender, amount); } function _spendAllowance(address owner, address spender, uint256 amount) internal { uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= amount, "Insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0) && to != address(0), "Transfer from/to zero address"); require(_balance[from] >= amount, "Exceeds balance"); if (amount > 0) { unchecked { _balance[from] -= amount; _balance[to] += amount; } } emit Transfer(from, to, amount); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; abstract contract CF_Recoverable is CF_Common, CF_Ownable { /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance /// @dev Beware of scam tokens! /// @dev Note that if the token of this contract is specified, amounts allocated for tax distribution and liquidity are reserved /// @param token Address of the ERC-20 token /// @param to Recipient /// @param amount Amount to be transferred function recoverERC20(address token, address to, uint256 amount) external onlyOwner { unchecked { uint256 balance = IERC20(token).balanceOf(address(this)); uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_taxToken) == token ? _tokensForTaxDistribution : 0); require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance"); } IERC20(token).transfer(to, amount); } /// @notice Recovers a misplaced amount of native tokens sitting in the contract balance /// @dev Note that if the reflection token is the wrapped native, amounts allocated for tax distribution and/or liquidity are reserved /// @param to Recipient /// @param amount Amount of native tokens to be transferred function recoverNative(address payable to, uint256 amount) external onlyOwner { unchecked { uint256 balance = address(this).balance; uint256 allocated = address(_taxToken) == _dex.WETH ? _ethForTaxDistribution : 0; require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance"); } (bool success, ) = to.call{ value: amount }(""); require(success); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_ERC20.sol"; abstract contract CF_Burnable is CF_Common, CF_ERC20 { /// @notice Total amount of tokens burned so far function totalBurned() external view returns (uint256) { return _totalBurned; } function burn(uint256 amount) external { _burn(msg.sender, amount); } function burnFrom(address account, uint256 amount) external { _spendAllowance(account, msg.sender, amount); _burn(account, amount); } function _burn(address account, uint256 amount) internal virtual { require(_balance[account] >= amount, "Exceeds balance"); unchecked { _balance[account] -= amount; _totalSupply -= amount; _totalBurned += amount; } emit Transfer(account, address(0xdEaD), amount); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; abstract contract CF_Whitelist is CF_Common, CF_Ownable { event Whitelisted(address indexed account, bool status); event RenouncedWhitelist(); /// @notice Permanently renounce and prevent the owner from being able to update the whitelist /// @dev Existing entries will continue to be effective function renounceWhitelist() external onlyOwner { _renounced.Whitelist = true; emit RenouncedWhitelist(); } /// @notice Check if an address is whitelisted /// @param account Address to check function isWhitelisted(address account) external view returns (bool) { return _whitelisted[account]; } /// @notice Add or remove an address from the whitelist /// @param status True for adding, False for removing function whitelist(address account, bool status) public onlyOwner { _whitelist(account, status); } function _whitelist(address account, bool status) internal { require(!_renounced.Whitelist); require(account != address(0) && account != address(0xdEaD)); require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged"); _whitelisted[account] = status; emit Whitelisted(account, status); } /// @notice Add or remove multiple addresses from the whitelist /// @param status True for adding, False for removing function whitelist(address[] calldata accounts, bool status) external onlyOwner { unchecked { uint256 cnt = accounts.length; for (uint256 i; i < cnt; i++) { _whitelist(accounts[i], status); } } } function _initialWhitelist(address[1] memory accounts) internal { require(!_initialized); unchecked { for (uint256 i; i < 1; i++) { _whitelist(accounts[i], true); } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; abstract contract CF_MaxTx is CF_Common, CF_Ownable { event SetMaxTxPercent(uint24 percent); event RenouncedMaxTx(); /// @notice Permanently renounce and prevent the owner from being able to update the max. transferable amount /// @dev Existing settings will continue to be effective function renounceMaxTx() external onlyOwner { _renounced.MaxTx = true; emit RenouncedMaxTx(); } /// @notice Percentage of the max. transferable amount, depending on total supply function getMaxTxPercent() external view returns (uint24) { return _maxTxPercent; } /// @notice Set the max. percentage of a transferable amount, depending on total supply /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable) function setMaxTxPercent(uint24 percent) external onlyOwner { require(!_renounced.MaxTx); unchecked { require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator)); } _setMaxTxPercent(percent); emit SetMaxTxPercent(percent); } function _setMaxTxPercent(uint24 percent) internal { _maxTxPercent = percent; _maxTxAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0; if (!_initialized) { emit SetMaxTxPercent(percent); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; abstract contract CF_MaxBalance is CF_Common, CF_Ownable { event SetMaxBalancePercent(uint24 percent); event RenouncedMaxBalance(); /// @notice Permanently renounce and prevent the owner from being able to update the max. balance /// @dev Existing settings will continue to be effective function renounceMaxBalance() external onlyOwner { _renounced.MaxBalance = true; emit RenouncedMaxBalance(); } /// @notice Percentage of the max. balance per wallet, depending on total supply function getMaxBalancePercent() external view returns (uint24) { return _maxBalancePercent; } /// @notice Set the max. percentage of a wallet balance, depending on total supply /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable) function setMaxBalancePercent(uint24 percent) external onlyOwner { require(!_renounced.MaxBalance); unchecked { require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator)); } _setMaxBalancePercent(percent); emit SetMaxBalancePercent(percent); } function _setMaxBalancePercent(uint24 percent) internal { _maxBalancePercent = percent; _maxBalanceAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0; if (!_initialized) { emit SetMaxBalancePercent(percent); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; import "./CF_ERC20.sol"; abstract contract CF_Taxable is CF_Common, CF_Ownable, CF_ERC20 { event SetTaxBeneficiary(uint8 slot, address account, uint24[3] percent, uint24[3] penalty); event SetEarlyPenaltyTime(uint32 time); event TaxDistributed(uint256 amount); event RenouncedTaxable(); struct taxBeneficiaryView { address account; uint24[3] percent; uint24[3] penalty; uint256 unclaimed; } modifier lockDistributing { _distributing = true; _; _distributing = false; } /// @notice Permanently renounce and prevent the owner from being able to update the tax features /// @dev Existing settings will continue to be effective function renounceTaxable() external onlyOwner { _renounced.Taxable = true; emit RenouncedTaxable(); } /// @notice Total amount of taxes collected so far function totalTaxCollected() external view returns (uint256) { return _totalTaxCollected; } /// @notice Tax applied per transfer /// @dev Taking in consideration your wallet address function txTax() external view returns (uint24) { return txTax(msg.sender); } /// @notice Tax applied per transfer /// @param from Sender address function txTax(address from) public view returns (uint24) { unchecked { return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyTxTax : _totalTxTax); } } /// @notice Tax applied for buying /// @dev Taking in consideration your wallet address function buyTax() external view returns (uint24) { return buyTax(msg.sender); } /// @notice Tax applied for buying /// @param from Buyer's address function buyTax(address from) public view returns (uint24) { if (_suspendTaxes) { return 0; } unchecked { return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyBuyTax : _totalBuyTax); } } /// @notice Tax applied for selling /// @dev Taking in consideration your wallet address function sellTax() external view returns (uint24) { return sellTax(msg.sender); } /// @notice Tax applied for selling /// @param to Seller's address function sellTax(address to) public view returns (uint24) { if (_suspendTaxes) { return 0; } unchecked { return to == address(this) || _whitelisted[to] || to == _dex.pair || to == _dex.router ? 0 : (_holder[to].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltySellTax : _totalSellTax); } } /// @notice List of all tax beneficiaries and their assigned percentage, according to type of transfer /// @custom:return `list[].account` Beneficiary address /// @custom:return `list[].percent[3]` Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator /// @custom:return `list[].penalty[3]` Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) { list = new taxBeneficiaryView[](5); unchecked { for (uint8 i; i < 5; i++) { list[i] = taxBeneficiaryView(_taxBeneficiary[i].account, _taxBeneficiary[i].percent, _taxBeneficiary[i].penalty, _taxBeneficiary[i].unclaimed); } } } /// @notice Sets a tax beneficiary /// @dev Maximum of 5 wallets can be assigned /// @param slot Slot number (0 to 4) /// @param account Beneficiary address /// @param percent[3] Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator /// @param penalty[3] Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) external onlyOwner { require(!_renounced.Taxable); _setTaxBeneficiary(slot, account, percent, penalty); } function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) internal { require(slot < 5); require(account != address(this) && account != address(0)); taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot]; if (account == address(0xdEaD) && _taxBeneficiary.unclaimed > 0) { revert("Unclaimed taxes"); } unchecked { _totalTxTax += percent[0] - _taxBeneficiary.percent[0]; _totalBuyTax += percent[1] - _taxBeneficiary.percent[1]; _totalSellTax += percent[2] - _taxBeneficiary.percent[2]; _totalPenaltyTxTax += penalty[0] - _taxBeneficiary.penalty[0]; _totalPenaltyBuyTax += penalty[1] - _taxBeneficiary.penalty[1]; _totalPenaltySellTax += penalty[2] - _taxBeneficiary.penalty[2]; require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax"); require(_totalPenaltyTxTax <= 100 * _denominator && _totalPenaltyBuyTax <= 100 * _denominator && _totalPenaltySellTax <= 100 * _denominator, "Invalid Penalty"); } _taxBeneficiary.account = account; _taxBeneficiary.percent = percent; _taxBeneficiary.penalty = penalty; if (!_taxBeneficiary.exists) { _taxBeneficiary.exists = true; } emit SetTaxBeneficiary(slot, account, percent, penalty); } /// @notice Triggers the tax distribution /// @dev Will only be executed if there is no ongoing swap or tax distribution function autoTaxDistribute() external { require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized"); require(!_swapping && !_distributing); _autoTaxDistribute(); } function _autoTaxDistribute() internal lockDistributing { if (_totalTaxUnclaimed == 0) { return; } unchecked { uint256 distributedTaxes; for (uint8 i; i < 5; i++) { address account = _taxBeneficiary[i].account; if (_taxBeneficiary[i].unclaimed == 0 || account == address(0xdEaD) || account == _dex.pair) { continue; } uint256 unclaimed = _percentage(address(_taxToken) == address(this) ? _amountForTaxDistribution : _amountSwappedForTaxDistribution, (100 * uint256(_denominator) * _taxBeneficiary[i].unclaimed) / _totalTaxUnclaimed); uint256 _distributedTaxes = _distribute(account, unclaimed); if (_distributedTaxes > 0) { _taxBeneficiary[i].unclaimed -= _distributedTaxes; distributedTaxes += _distributedTaxes; } } _lastTaxDistribution = _timestamp(); if (distributedTaxes > 0) { _totalTaxUnclaimed -= distributedTaxes; } emit TaxDistributed(distributedTaxes); } } function _distribute(address account, uint256 unclaimed) private returns (uint256) { if (unclaimed == 0) { return 0; } unchecked { if (address(_taxToken) == address(this)) { if (_maxBalanceAmount > 0 && _balance[account] + unclaimed > _maxBalanceAmount && !_whitelisted[account]) { unclaimed = _maxBalanceAmount > _balance[account] ? _maxBalanceAmount - _balance[account] : 0; if (unclaimed == 0) { return 0; } } super._transfer(address(this), account, unclaimed); _amountForTaxDistribution -= unclaimed; } else { uint256 percent = (100 * uint256(_denominator) * unclaimed) / _amountSwappedForTaxDistribution; uint256 amount; if (address(_taxToken) == _dex.WETH) { amount = _percentage(_ethForTaxDistribution, percent); (bool success, ) = payable(account).call{ value: amount, gas: 30000 }(""); if (!success) { return 0; } _ethForTaxDistribution -= amount; } else { amount = _percentage(_tokensForTaxDistribution, percent); try _taxToken.transfer(account, amount) { _tokensForTaxDistribution -= amount; } catch { return 0; } } _amountSwappedForTaxDistribution -= unclaimed; } } return unclaimed; } /// @notice Suspend or reinstate tax collection /// @dev Also applies to early penalties /// @param status True to suspend, False to reinstate existent taxes function suspendTaxes(bool status) external onlyOwner { require(!_renounced.Taxable); _suspendTaxes = status; } /// @notice Checks if tax collection is currently suspended function taxesSuspended() external view returns (bool) { return _suspendTaxes; } /// @notice Removes the penalty status of a wallet /// @param account Address to depenalize function removePenalty(address account) external onlyOwner { require(!_renounced.Taxable); _holder[account].penalty = false; } /// @notice Check if a wallet is penalized due to an early transaction /// @param account Address to check function isPenalized(address account) external view returns (bool) { return _holder[account].penalty; } /// @notice Returns the period of time during which early buyers will be penalized from the time trading was enabled function getEarlyPenaltyTime() external view returns (uint32) { return _earlyPenaltyTime; } /// @notice Defines the period of time during which early buyers will be penalized from the time trading was enabled /// @dev Must be less or equal to 1 hour /// @param time Time, in seconds function setEarlyPenaltyTime(uint32 time) external onlyOwner { require(!_renounced.Taxable); require(time <= 600); _setEarlyPenaltyTime(time); } function _setEarlyPenaltyTime(uint32 time) internal { _earlyPenaltyTime = time; emit SetEarlyPenaltyTime(time); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; import "./CF_Common.sol"; import "./CF_Ownable.sol"; import "./CF_ERC20.sol"; abstract contract CF_DEXRouterV2 is CF_Common, CF_Ownable, CF_ERC20 { event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity); event SwappedTokensForNative(uint256 tokenAmount, uint256 ethAmount); event SwappedTokensForTokens(address token, uint256 token0Amount, uint256 token1Amount); event SetDEXRouterV2(address indexed router, address indexed pair, address receiver); event RenouncedDEXRouterV2(); modifier lockSwapping { _swapping = true; _; _swapping = false; } /// @notice Permanently renounce and prevent the owner from being able to update the DEX features /// @dev Existing settings will continue to be effective function renounceDEXRouterV2() external onlyOwner { _renounced.DEXRouterV2 = true; emit RenouncedDEXRouterV2(); } /// @notice Sets the DEX router and where to receive the LP tokens /// @param router Address of the DEX router /// @param receiver Address of the LP tokens receiver function setDEXRouterV2(address router, address receiver) external onlyOwner returns (address) { require(!_renounced.DEXRouterV2); return _setDEXRouterV2(router, receiver); } function _setDEXRouterV2(address router, address receiver) internal returns (address) { require(router != address(0)); if (_dex.router != router) { IDEXRouterV2 _router = IDEXRouterV2(router); IDEXFactoryV2 factory = IDEXFactoryV2(_router.factory()); address WETH = _router.WETH(); address pair = factory.getPair(address(this), WETH); if (pair == address(0)) { pair = factory.createPair(address(this), WETH); } _dex = DEXRouterV2(router, pair, WETH, receiver); } if (receiver != _dex.receiver) { _dex.receiver = receiver; } emit SetDEXRouterV2(router, _dex.pair, receiver); return _dex.pair; } /// @notice Returns the DEX router currently in use function getDEXRouterV2() external view returns (address) { return _dex.router; } /// @notice Returns the trading pair function getDEXPairV2() external view returns (address) { return _dex.pair; } /// @notice Returns address of the LP tokens receiver function getLPTokensReceiver() external view returns (address) { return _dex.receiver; } /// @notice Checks whether the token can be traded through the assigned DEX function isTradingEnabled() external view returns (bool) { return _tradingEnabled > 0; } /// @notice Checks the status of the auto-swapping feature function isAutoSwapEnabled() external view returns (bool) { return _autoSwapEnabled; } /// @notice Returns the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance function getAutoSwapPercent() external view returns (uint24 min, uint24 max) { return (_minAutoSwapPercent, _maxAutoSwapPercent); } /// @notice Sets the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance /// @param min Desired min. percentage to trigger the auto-swap, multiplied by denominator (0.001% to 1% of total supply) /// @param max Desired max. percentage to limit the auto-swap, multiplied by denominator (0.001% to 1% of total supply) function setAutoSwapPercent(uint24 min, uint24 max) external onlyOwner { require(!_renounced.DEXRouterV2); require(min >= 1 && min <= 1000, "0.001% to 1%"); require(max >= min && max <= 1000, "0.001% to 1%"); _setAutoSwapPercent(min, max); } function _setAutoSwapPercent(uint24 min, uint24 max) internal { _minAutoSwapPercent = min; _maxAutoSwapPercent = max; _minAutoSwapAmount = _percentage(_totalSupply, uint256(min)); _maxAutoSwapAmount = _percentage(_totalSupply, uint256(max)); } /// @notice Enables or disables the auto-swap function /// @param status True to enable, False to disable function enableAutoSwap(bool status) external onlyOwner { require(!_renounced.DEXRouterV2); require(!status || _dex.router != address(0), "No DEX"); _autoSwapEnabled = status; } /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached function autoSwap() external { require(_autoSwapEnabled && !_swapping && !_distributing); _autoSwap(false); } /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced /// @param force Ignore the min. and max. threshold amount function autoSwap(bool force) external { require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized"); require((force || _autoSwapEnabled) && !_swapping && !_distributing); _autoSwap(force); } function _autoSwap(bool force) internal lockSwapping { if (!force && !_autoSwapEnabled) { return; } unchecked { uint256 amountForLiquidityToSwap = _amountForLiquidity > 0 ? _amountForLiquidity / 2 : 0; uint256 amountForTaxDistributionToSwap = (address(_taxToken) == _dex.WETH ? _amountForTaxDistribution : 0); uint256 amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap; if (!force && amountToSwap > _maxAutoSwapAmount) { amountForLiquidityToSwap = amountForLiquidityToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap) : 0; amountForTaxDistributionToSwap = amountForTaxDistributionToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap) : 0; amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap; } if ((force || amountToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountToSwap + amountForLiquidityToSwap) { uint256 ethBalance = address(this).balance; address[] memory pathToSwapExactTokensForETH = new address[](2); pathToSwapExactTokensForETH[0] = address(this); pathToSwapExactTokensForETH[1] = _dex.WETH; _approve(address(this), _dex.router, amountToSwap); try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap, 0, pathToSwapExactTokensForETH, address(this), block.timestamp) { if (_amountForLiquidity > 0) { _amountForLiquidity -= amountForLiquidityToSwap; } uint256 ethAmount = address(this).balance - ethBalance; emit SwappedTokensForNative(amountToSwap, ethAmount); if (ethAmount > 0) { uint256 ethForLiquidity = _percentage(ethAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap); if (address(_taxToken) == _dex.WETH) { _ethForTaxDistribution += _percentage(ethAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap); _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap; _amountForTaxDistribution -= amountForTaxDistributionToSwap; } if (amountForLiquidityToSwap > 0 && ethForLiquidity > 0) { _approve(address(this), _dex.router, amountForLiquidityToSwap); try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidity }(address(this), amountForLiquidityToSwap, 0, 0, _dex.receiver, block.timestamp) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { emit SwapAndLiquify(amountToken, amountETH, liquidity); _amountForLiquidity -= amountForLiquidityToSwap; } catch { _approve(address(this), _dex.router, 0); } } } } catch { _approve(address(this), _dex.router, 0); } } if (address(_taxToken) != address(this) && address(_taxToken) != _dex.WETH) { amountForTaxDistributionToSwap = _amountForTaxDistribution; if (!force && amountForTaxDistributionToSwap > _maxAutoSwapAmount) { amountForTaxDistributionToSwap = _maxAutoSwapAmount; } if ((force || amountForTaxDistributionToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountForTaxDistributionToSwap) { uint256 tokenAmount = _swapTokensForTokens(_taxToken, amountForTaxDistributionToSwap); if (tokenAmount > 0) { _tokensForTaxDistribution += tokenAmount; _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap; _amountForTaxDistribution -= amountForTaxDistributionToSwap; } } } } _lastSwap = _timestamp(); } function _swapTokensForTokens(IERC20 token, uint256 amount) private returns (uint256 tokenAmount) { uint256 tokenBalance = token.balanceOf(address(this)); address[] memory pathToSwapExactTokensForTokens = new address[](3); pathToSwapExactTokensForTokens[0] = address(this); pathToSwapExactTokensForTokens[1] = _dex.WETH; pathToSwapExactTokensForTokens[2] = address(token); _approve(address(this), _dex.router, amount); try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, pathToSwapExactTokensForTokens, address(this), block.timestamp) { tokenAmount = token.balanceOf(address(this)) - tokenBalance; emit SwappedTokensForTokens(address(token), amount, tokenAmount); } catch { _approve(address(this), _dex.router, 0); } } /// @notice Returns the token for tax distribution function getTaxToken() external view returns (address) { return address(_taxToken); } /// @notice Sets the desired ERC-20 token for taxes /// @dev If other token than wrapped native is specified, the pair wrapped native-token must already exist /// @param token Address of the ERC-20 token function setTaxToken(address token) external onlyOwner { require(!_renounced.DEXRouterV2); if (address(_taxToken) != token && _amountSwappedForTaxDistribution > 0) { revert("Unclaimed taxes"); } _setTaxToken(token); } function _setTaxToken(address token) internal { require((!_initialized && token == address(0)) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair"); _taxToken = IERC20(token == address(0) ? address(this) : token); } /// @notice Enables the trading capability via the DEX set up /// @dev Once enabled, it cannot be reverted function enableTrading() external onlyOwner { require(!_renounced.DEXRouterV2); require(_tradingEnabled == 0, "Already enabled"); _tradingEnabled = _timestamp(); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; interface IDEXRouterV2 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external; } interface IDEXFactoryV2 { function createPair(address tokenA, address tokenB) external returns (address pair); function getPair(address tokenA, address tokenB) external returns (address pair); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.24; interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); }
{ "evmVersion": "shanghai", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "optimizer": { "enabled": true, "runs": 800 } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxTx","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SetDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"}],"name":"SetEarlyPenaltyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxBalancePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"denominator","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"enableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAutoSwapPercent","outputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXPairV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarlyPenaltyTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPTokensReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutoSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"internalType":"struct CF_Taxable.taxBeneficiaryView[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"MaxTx","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"name":"setAutoSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"time","type":"uint32"}],"name":"setEarlyPenaltyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxBalancePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"slot","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"setTaxBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setTaxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"suspendTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801562000010575f80fd5b506040805180820190915260098152682537b2902937b3b0b760b91b6020820152601c906200004090826200108c565b50604080518082019091526006815265122927a3a0a760d11b6020820152601d906200006d90826200108c565b50601260a0526a52b7d2dcc80cd2e4000000600855620000a173afe5c603a3dd5b44855fc2f6294075b4410a37fe62000309565b620000c473afe5c603a3dd5b44855fc2f6294075b4410a37fe620148206200035a565b620000e67304d4277ebc0eb8a200b1a969d3c1fb43e5449a416117706200035a565b62000108731adc4fbfe3b7b1c53b6e87ec9ce902b188512849610ce46200035a565b6200012a73d8f2dc01898b2a9d0a6d3fcc030c9468229c66e0610ce46200035a565b6200014c73a060c07c326db2bdc6ce26c04efb24735c8ea8db610d486200035a565b62000180737a250d5630b4cf539739df2c5dacb4c659f2488d73afe5c603a3dd5b44855fc2f6294075b4410a37fe620003d7565b506200018e610258620006c8565b620001ad73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc262000723565b620001bc60646101f4620008d8565b6006805460ff1916600117905560408051606080820183525f8083526107d06020808501829052848601919091528451928301855261c350808452908301819052938201939093526200022692917304d4277ebc0eb8a200b1a969d3c1fb43e5449a41916200093a565b60408051606080820183525f8083526103e8602080850182905284860191909152845192830185528183528201819052928101929092526200026f9160019161dead916200093a565b60185460408051606080820183525f8083526103e860208085018290528486019190915284519283018552818352820181905292810192909252620002c4926002926001600160a01b0390911691906200093a565b60408051602081019091527304d4277ebc0eb8a200b1a969d3c1fb43e5449a418152620002f19062000d3a565b620002fe6107d062000d86565b60016080526200120b565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6080511562000367575f80fd5b5f620003816008548362ffffff1662000e0e60201b60201c565b6001600160a01b0384165f8181526020818152604080832085905551848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b038316620003eb575f80fd5b6017546001600160a01b038481169116146200063c575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000443573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000469919062001158565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004a9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004cf919062001158565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000520573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000546919062001158565b90506001600160a01b038116620005cc576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015620005a3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005c9919062001158565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b038381169116146200066e57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b6080511580156200073b57506001600160a01b038116155b806200074f57506001600160a01b03811630145b806200076857506019546001600160a01b038281169116145b806200086057506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015620007b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007dd919062001158565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156200082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000854919062001158565b6001600160a01b031614155b6200089c5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b03811615620008b35780620008b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546200092091620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b60058460ff16106200094a575f80fd5b6001600160a01b03831630148015906200096c57506001600160a01b03831615155b62000975575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead148015620009a457505f8160030154115b15620009e55760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b604482015260640162000893565b60018101805484516006805462ffffff60501b19811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c015162ffffff60681b1990971665ffffffffffff60501b19909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b015162ffffff60801b1989166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d5162ffffff60981b1990941665ffffffffffff60801b19909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b015162ffffff60b01b198216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b988990048816929091048716900301851690950262ffffff60c81b1990931665ffffffffffff60b01b199091161791909117908190556161a8929004161180159062000bcf57506006546161a8600160681b90910462ffffff161180159062000b9f57506006546161a8600160801b90910462ffffff1611155b801562000bcf57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000c085760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000893565b600654620186a0600160981b90910462ffffff161180159062000c3d5750600654620186a0600160b01b90910462ffffff1611155b801562000c5c5750600654620186a0600160c81b90910462ffffff1611155b62000c9c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b604482015260640162000893565b8054610100600160a81b0319166101006001600160a01b0386160217815562000ccb6001820184600362000f39565b5062000cdd6002820183600362000f39565b50805460ff1662000cf457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000d2b9493929190620011ca565b60405180910390a15050505050565b6080511562000d47575f80fd5b5f5b600181101562000d825762000d7982826001811062000d6c5762000d6c62001187565b6020020151600162000e18565b60010162000d49565b5050565b6006805462ffffff60381b191667010000000000000062ffffff84169081029190911790915562000db8575f62000dca565b600854620186a062ffffff8316909102045b600b5560805162000e0b5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200162000718565b50565b620186a091020490565b60155460ff161562000e28575f80fd5b6001600160a01b0382161580159062000e4c57506001600160a01b03821661dead14155b62000e55575f80fd5b6017546001600160a01b0383811691161480159062000e8257506018546001600160a01b03838116911614155b62000edb5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000893565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000fc6579160200282015f5b8382111562000f9357835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000f4f565b801562000fc45782816101000a81549062ffffff021916905560030160208160020104928301926001030262000f93565b505b5062000fd492915062000fd8565b5090565b5b8082111562000fd4575f815560010162000fd9565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200101757607f821691505b6020821081036200103657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200108757805f5260205f20601f840160051c81016020851015620010635750805b601f840160051c820191505b8181101562001084575f81556001016200106f565b50505b505050565b81516001600160401b03811115620010a857620010a862000fee565b620010c081620010b9845462001002565b846200103c565b602080601f831160018114620010f6575f8415620010de5750858301515b5f19600386901b1c1916600185901b17855562001150565b5f85815260208120601f198616915b82811015620011265788860151825594840194600190910190840162001105565b50858210156200114457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562001169575f80fd5b81516001600160a01b038116811462001180575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b6003811015620011c457815162ffffff168452602093840193909101906001016200119e565b50505050565b60ff851681526001600160a01b03841660208201526101008101620011f360408301856200119b565b6200120260a08301846200119b565b95945050505050565b60805160a051614d4b620012425f395f8181610533015261110d01525f81816131d9015281816133030152613eed0152614d4b5ff3fe6080604052600436106103ae575f3560e01c806377004851116101f1578063be5e49b211610118578063da88d01a116100b1578063f2fde38b11610083578063f59c37081161006b578063f59c370814610bc7578063f7c3b38f14610be6578063f7de0e5714610c0757005b8063f2fde38b14610b6c578063f3dc4f4814610b8b57005b8063da88d01a14610ad6578063dd62ed3e14610af5578063e92871f614610b39578063f2cda82e14610b4d57005b8063cc1776d3116100ea578063cc1776d314610a36578063d232c22014610a4a578063d8454a8214610aae578063d89135cd14610ac257005b8063be5e49b2146109d2578063c2921583146109f1578063c77e006d14610a0e578063c78fe0d414610a2257005b806395d89b411161018a578063a4d8971a1161015c578063a4d8971a14610958578063a5596b4f14610977578063a9059cbb14610996578063b81a0145146109b557005b806395d89b41146108fd57806396ce0795146109115780639c5ef8d714610925578063a457c2d71461093957005b80638bf1acff116101c35780638bf1acff1461088e5780638d8350ca146108a25780638da5cb5b146108c157806395101f90146108de57005b8063770048511461083357806379cc6790146108475780638324c3b9146108665780638a8c523c1461087a57005b80633af32abf116102d55780635a0d4f881161026e5780636f05be97116102405780636f05be97146107aa57806370a08231146107cb578063715018a6146107ff57806375de14961461081357005b80635a0d4f881461070a5780635b90fe661461073b5780635f6417581461076c57806368a5d4141461078b57005b8063487d1ce5116102a7578063487d1ce51461067f5780634b7d9db41461069e5780634f7041a5146106b557806354fd4d50146106dd57005b80633af32abf146105eb5780633ed8a1691461062257806342966c681461064157806344b691ff1461066057005b806323b872dd1161034757806332acf3de1161031957806332acf3de1461055d578063370158ea1461059257806339137f8b146105b857806339509351146105cc57005b806323b872dd146104c35780632623e975146104e25780632984207a14610501578063313ce5671461052057005b8063095ea7b311610380578063095ea7b3146104485780631171bda91461046757806318160ddd14610486578063186488a8146104a457005b806301b38af5146103b7578063064a59d0146103d657806306fdde031461040a57806307e9652c1461042b57005b366103b557005b005b3480156103c2575f80fd5b506103b56103d136600461470e565b610c24565b3480156103e1575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610415575f80fd5b5061041e610cbc565b60405161040191906147d0565b348015610436575f80fd5b5060065462010000900460ff166103f5565b348015610453575f80fd5b506103f56104623660046147f6565b610d4c565b348015610472575f80fd5b506103b5610481366004614820565b610d62565b348015610491575f80fd5b506008545b604051908152602001610401565b3480156104af575f80fd5b506103b56104be3660046148f3565b610f1e565b3480156104ce575f80fd5b506103f56104dd366004614820565b610f89565b3480156104ed575f80fd5b506103b56104fc366004614950565b610faa565b34801561050c575f80fd5b506103b561051b36600461496b565b611080565b34801561052b575f80fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610401565b348015610568575f80fd5b5060065460075460408051600160e01b90930462ffffff9081168452909116602083015201610401565b34801561059d575f80fd5b506105a66110ff565b6040516104019695949392919061498e565b3480156105c3575f80fd5b506103b561128a565b3480156105d7575f80fd5b506103f56105e63660046147f6565b61130a565b3480156105f6575f80fd5b506103f56106053660046149f1565b6001600160a01b03165f9081526002602052604090205460ff1690565b34801561062d575f80fd5b506103b561063c366004614a0c565b61133c565b34801561064c575f80fd5b506103b561065b366004614a25565b611412565b34801561066b575f80fd5b506103b561067a366004614a3c565b61141c565b34801561068a575f80fd5b506103b56106993660046149f1565b61153e565b3480156106a9575f80fd5b5060065460ff166103f5565b3480156106c0575f80fd5b506106c9611605565b60405162ffffff9091168152602001610401565b3480156106e8575f80fd5b50604080518082019091526005815264312e302e3160d81b602082015261041e565b348015610715575f80fd5b506016546001600160a01b03165b6040516001600160a01b039091168152602001610401565b348015610746575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff9091168152602001610401565b348015610777575f80fd5b506106c96107863660046149f1565b611614565b348015610796575f80fd5b506107236107a5366004614a6d565b61170f565b3480156107b5575f80fd5b506107be611782565b6040516104019190614acb565b3480156107d6575f80fd5b506104966107e53660046149f1565b6001600160a01b03165f9081526020819052604090205490565b34801561080a575f80fd5b506103b5611913565b34801561081e575f80fd5b50600654600160381b900462ffffff166106c9565b34801561083e575f80fd5b506103b561197c565b348015610852575f80fd5b506103b56108613660046147f6565b6119bd565b348015610871575f80fd5b506103b56119d2565b348015610885575f80fd5b506103b5611a58565b348015610899575f80fd5b506106c9611b39565b3480156108ad575f80fd5b506106c96108bc3660046149f1565b611b3f565b3480156108cc575f80fd5b50601b546001600160a01b0316610723565b3480156108e9575f80fd5b506106c96108f83660046149f1565b611c09565b348015610908575f80fd5b5061041e611ce5565b34801561091c575f80fd5b506103e86106c9565b348015610930575f80fd5b506103b5611cf4565b348015610944575f80fd5b506103f56109533660046147f6565b611d88565b348015610963575f80fd5b506103b5610972366004614950565b611e08565b348015610982575f80fd5b506103b5610991366004614950565b611eb3565b3480156109a1575f80fd5b506103f56109b03660046147f6565b611f2e565b3480156109c0575f80fd5b50601a546001600160a01b0316610723565b3480156109dd575f80fd5b506103b56109ec3660046149f1565b611f3a565b3480156109fc575f80fd5b506018546001600160a01b0316610723565b348015610a19575f80fd5b506103b5611fba565b348015610a2d575f80fd5b506103b561203e565b348015610a41575f80fd5b506106c96120c6565b348015610a55575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925264010000000083048216151560608201526301000000909204161515608082015260a001610401565b348015610ab9575f80fd5b50600f54610496565b348015610acd575f80fd5b50600954610496565b348015610ae1575f80fd5b506103b5610af0366004614a0c565b6120d0565b348015610b00575f80fd5b50610496610b0f366004614a6d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b44575f80fd5b506103b561219e565b348015610b58575f80fd5b506103b5610b673660046147f6565b612220565b348015610b77575f80fd5b506103b5610b863660046149f1565b612346565b348015610b96575f80fd5b506103f5610ba53660046149f1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bd2575f80fd5b506103b5610be1366004614b4a565b6123aa565b348015610bf1575f80fd5b50600654640100000000900462ffffff166106c9565b348015610c12575f80fd5b506017546001600160a01b0316610723565b601b546001600160a01b03163314610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610cb557610cad858583818110610c9257610c92614b76565b9050602002016020810190610ca791906149f1565b846123f9565b600101610c75565b5050505050565b6060601c8054610ccb90614b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf790614b8a565b8015610d425780601f10610d1957610100808354040283529160200191610d42565b820191905f5260205f20905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b5f610d58338484612514565b5060015b92915050565b601b546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190614bbc565b90505f6001600160a01b0385163014610e49576016546001600160a01b03868116911614610e41575f610e51565b601454610e51565b600e54601154015b90508282821015610e625781610e64565b825b83031015610ea65760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190614bd3565b50505050565b601b546001600160a01b03163314610f675760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615610f7d575f80fd5b610f1884848484612575565b5f610f95843384612a41565b610fa0848484612ac3565b5060019392505050565b601b546001600160a01b03163314610ff35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561100a575f80fd5b80158061102157506017546001600160a01b031615155b61106d5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610c69565b6006805460ff1916911515919091179055565b601b546001600160a01b031633146110c95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff16156110df575f80fd5b6102588163ffffffff1611156110f3575f80fd5b6110fc81613122565b50565b6060805f805f6060601c601d7f0000000000000000000000000000000000000000000000000000000000000000601b5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461116e90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461119a90614b8a565b80156111e55780601f106111bc576101008083540402835291602001916111e5565b820191905f5260205f20905b8154815290600101906020018083116111c857829003601f168201915b505050505095508480546111f890614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461122490614b8a565b801561126f5780601f106112465761010080835404028352916020019161126f565b820191905f5260205f20905b81548152906001019060200180831161125257829003601f168201915b50505050509450955095509550955095509550909192939495565b601b546001600160a01b031633146112d35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d589185908501612514565b601b546001600160a01b031633146113855760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60155462010000900460ff161561139a575f80fd5b62ffffff811615806113c5575060648162ffffff16101580156113c55750620186a062ffffff821611155b6113cd575f80fd5b6113d68161318e565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6110fc3382613231565b601b546001600160a01b031633146114655760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561147c575f80fd5b60018262ffffff161015801561149957506103e88262ffffff1611155b6114d45760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b8162ffffff168162ffffff16101580156114f557506103e88162ffffff1611155b6115305760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b61153a8282613287565b5050565b601b546001600160a01b031633146115875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561159e575f80fd5b6016546001600160a01b038281169116148015906115bd57505f601254115b156115fc5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6110fc81613301565b5f61160f33611c09565b905090565b6006545f9062010000900460ff161561162e57505f919050565b6001600160a01b03821630148061165c57506001600160a01b0382165f9081526002602052604090205460ff165b8061167457506018546001600160a01b038381169116145b8061168c57506017546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff16806116dc575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6116f457600654600160801b900462ffffff16610d5c565b600654600160c81b900462ffffff16610d5c565b5f92915050565b601b545f906001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611771575f80fd5b61177b83836134d8565b9392505050565b60408051600580825260c08201909252606091816020015b6117a2614600565b81526020019060019003908161179a5790505090505f5b60058160ff16101561190f576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611816579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161188a5750505092845250505060ff83165f81815260046020908152604090912060030154920191909152835184919081106118fc576118fc614b76565b60209081029190910101526001016117b9565b5090565b601b546001600160a01b0316331461195c5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ffffffffff191664010101010117905561197a5f6137b9565b565b60065460ff1680156119965750600654610100900460ff16155b80156119ac57506006546301000000900460ff16155b6119b4575f80fd5b61197a5f61380a565b6119c8823383612a41565b61153a8282613231565b601b546001600160a01b03163314611a1b5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601b546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611ab8575f80fd5b600754600160381b900463ffffffff1615611b155760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610c69565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61160f335b5f6001600160a01b038216301480611b6e57506001600160a01b0382165f9081526002602052604090205460ff165b80611b8657506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611bd6575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611bf5576006546a0100000000000000000000900462ffffff16610d5c565b600654600160981b900462ffffff16610d5c565b6006545f9062010000900460ff1615611c2357505f919050565b6001600160a01b038216301480611c5157506001600160a01b0382165f9081526002602052604090205460ff165b80611c6957506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611cb9575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611cd157600654600160681b900462ffffff16610d5c565b600654600160b01b900462ffffff16610d5c565b6060601d8054610ccb90614b8a565b601b546001600160a01b0316331480611d1b5750335f9081526002602052604090205460ff165b611d565760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b600654610100900460ff16158015611d7857506006546301000000900460ff16155b611d80575f80fd5b61197a613d16565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611dfb5760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610c69565b610fa03385858403612514565b601b546001600160a01b0316331480611e2f5750335f9081526002602052604090205460ff165b611e6a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b8080611e78575060065460ff165b8015611e8c5750600654610100900460ff16155b8015611ea257506006546301000000900460ff16155b611eaa575f80fd5b6110fc8161380a565b601b546001600160a01b03163314611efc5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f12575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d58338484612ac3565b601b546001600160a01b03163314611f835760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f99575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601b546001600160a01b031633146120035760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601b546001600160a01b031633146120875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61160f33611614565b601b546001600160a01b031633146121195760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554610100900460ff161561212d575f80fd5b62ffffff81161580612158575060648162ffffff16101580156121585750620186a062ffffff821611155b612160575f80fd5b61216981613ea4565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b601b546001600160a01b031633146121e75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601b546001600160a01b031633146122695760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60195460165447915f916001600160a01b0390811691161461228b575f61228f565b6013545b905082828210156122a057816122a2565b825b830310156122e45760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461232f576040519150601f19603f3d011682016040523d82523d5f602084013e612334565b606091505b5050905080612341575f80fd5b505050565b601b546001600160a01b0316331461238f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6001600160a01b0381166123a1575f80fd5b6110fc816137b9565b601b546001600160a01b031633146123f35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b61153a82825b60155460ff1615612408575f80fd5b6001600160a01b0382161580159061242b57506001600160a01b03821661dead14155b612433575f80fd5b6017546001600160a01b0383811691161480159061245f57506018546001600160a01b03838116911614155b6124b65760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c69565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612584575f80fd5b6001600160a01b03831630148015906125a557506001600160a01b03831615155b6125ad575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead1480156125db57505f8160030154115b1561261a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6001810180548451600680546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a892900416118015906128a957506006546161a8600160681b90910462ffffff161180159061287a57506006546161a8600160801b90910462ffffff1611155b80156128a957506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6128f55760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610c69565b600654620186a0600160981b90910462ffffff16118015906129295750600654620186a0600160b01b90910462ffffff1611155b80156129475750600654620186a0600160c81b90910462ffffff1611155b6129935760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610c69565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038616021781556129d76001820184600361463b565b506129e76002820183600361463b565b50805460ff166129fd57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612a329493929190614bee565b60405180910390a15050505050565b6001600160a01b038381165f9081526001602090815260408083209386168352929052205481811015612ab65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610c69565b610f188484848403612514565b61deac196001600160a01b03831601612ae0576123418382613231565b6006546301000000900460ff16158015612b025750600654610100900460ff16155b8015612b3557506018546001600160a01b03848116911614801590612b3557506017546001600160a01b03848116911614155b15612b4b57612b435f61380a565b612b4b613d16565b5f81118015612b7257506001600160a01b0383165f9081526002602052604090205460ff16155b8015612b9657506001600160a01b0382165f9081526002602052604090205460ff16155b8015612bab57506001600160a01b0383163014155b8015612bc057506001600160a01b0382163014155b8015612bda57506017546001600160a01b03838116911614155b15613117576018546001600160a01b03848116911614801590612c0b57506018546001600160a01b03838116911614155b80612c5457506018546001600160a01b0384811691161480612c3a57506018546001600160a01b038381169116145b8015612c545750600754600160381b900463ffffffff1615155b612ca05760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610c69565b600a541580612cb15750600a548111155b612cfd5760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610c69565b600b541580612d1457506001600160a01b03821630145b80612d4357506018546001600160a01b0383811691161480612d4357506017546001600160a01b038381169116145b80612d695750600b546001600160a01b0383165f90815260208190526040902054820111155b612db55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610c69565b60065462010000900460ff16158015612dd857506006546301000000900460ff16155b8015612dec5750600654610100900460ff16155b15613117576018545f9081906001600160a01b0386811691161480612e1e57506018546001600160a01b038581169116145b15612e45576018546001600160a01b03868116911614612e3f576002612e42565b60015b90505b5f8160ff16600114612e575785612e59565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612eaa57506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612ed4576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff1610156130fe575f808460ff1611612f61576001600160a01b0383165f90815260036020526040902054610100900460ff16612f475760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613029565b60ff82165f90815260046020526040812060020190612f27565b8360ff16600114612fc7576001600160a01b0383165f90815260036020526040902054610100900460ff16612fab5760ff82165f9081526004602052604090206001016002612f27565b60ff82165f908152600460205260409020600290810190612f27565b6001600160a01b0383165f90815260036020526040902054610100900460ff166130075760ff82165f908152600460205260409020600190810190612f27565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f0361303d57506130f6565b620186a086820204613050893083613f45565b60185460ff84165f908152600460205260409020546001600160a01b039182166101009091049091160361308b57600e8054820190556130ef565b60ff83165f9081526004602052604090205461deac196101009091046001600160a01b0316016130c4576130bf3082613231565b6130ef565b60ff83165f908152600460205260409020600301805482019055601180548201905560108054820190555b9490940193505b600101612ed6565b50821561311357600f80548401905592829003925b5050505b612341838383613f45565b600780547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611407565b6006805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556131be575f6131d4565b6131d46008548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000006110fc5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611407565b61323b8282614082565b60065461325490640100000000900462ffffff16613ea4565b60065461326c90600160381b900462ffffff1661318e565b60065460075461153a9162ffffff600160e01b909104811691165b600680547fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546132e791620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b7f000000000000000000000000000000000000000000000000000000000000000015801561333657506001600160a01b038116155b8061334957506001600160a01b03811630145b8061336157506019546001600160a01b038281169116145b8061345257506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156133ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d29190614c2b565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614c2b565b6001600160a01b031614155b61349e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610c69565b6001600160a01b038116156134b357806134b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166134eb575f80fd5b6017546001600160a01b0384811691161461372e575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135659190614c2b565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c89190614c2b565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015613618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363c9190614c2b565b90506001600160a01b0381166136be576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bb9190614c2b565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b0383811691161461375f57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff0019166101001790558015801561382a575060065460ff16155b613d08575f80600e541161383e575f613852565b6002600e548161385057613850614c46565b045b6019546016549192505f916001600160a01b03908116911614613875575f613879565b6011545b90508181018315801561388d5750600d5481115b156138f6575f831161389f575f6138c5565b600d546138c59082620186a08602816138ba576138ba614c46565b04620186a091020490565b92505f82116138d4575f6138ef565b600d546138ef9082620186a08502816138ba576138ba614c46565b9150508181015b83806139045750600c548110155b80156139205750305f9081526020819052604090205481840111155b15613c1e5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061395c5761395c614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061398d5761398d614b76565b6001600160a01b0392831660209182029290920101526017546139b39130911685612514565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906139eb9086905f90869030904290600401614c5a565b5f604051808303815f87803b158015613a02575f80fd5b505af1925050508015613a13575060015b613a3457601754613a2f9030906001600160a01b03165f612514565b613c1b565b600e5415613a4657600e805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613c19575f613aa38286620186a08a02816138ba576138ba614c46565b6019546016549192506001600160a01b03908116911603613af157613ad68286620186a08902816138ba576138ba614c46565b60138054909101905560128054870190556011805487900390555b5f87118015613aff57505f81115b15613c1757601754613b1c9030906001600160a01b031689612514565b601754601a5460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613ba8575060408051601f3d908101601f19168201909252613ba591810190614ccb565b60015b613bc957601754613bc49030906001600160a01b03165f612514565b613c17565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600e80548990039055505b505b505b50505b6016546001600160a01b03163014801590613c4a57506019546016546001600160a01b03908116911614155b15613cd757601154915083158015613c635750600d5482115b15613c6e57600d5491505b8380613c7c5750600c548210155b8015613c965750305f908152602081905260409020548211155b15613cd7576016545f90613cb3906001600160a01b031684614145565b90508015613cd557601480548201905560128054840190556011805484900390555b505b505050613ce763ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff0000001916630100000017905560105415613e95575f805b60058160ff161015613e315760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b0316901580613d7f57506001600160a01b03811661dead145b80613d9757506018546001600160a01b038281169116145b15613da25750613e29565b6016545f90613df0906001600160a01b03163014613dc257601254613dc6565b6011545b60105460ff86165f90815260046020526040902060030154620186a002816138ba576138ba614c46565b90505f613dfd83836143bc565b90508015613e255760ff84165f90815260046020526040902060030180548290039055938401935b5050505b600101613d34565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613e60576010805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff00000000191664010000000062ffffff841690810291909117909155613ed2575f613ee8565b613ee86008548262ffffff16620186a091020490565b600a557f00000000000000000000000000000000000000000000000000000000000000006110fc5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b6001600160a01b03831615801590613f6557506001600160a01b03821615155b613fb15760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c69565b6001600160a01b0383165f9081526020819052604090205481111561400a5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b801561403d576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161256891815260200190565b6001600160a01b0382165f908152602081905260409020548111156140db5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b6001600160a01b0382165f8181526020818152604091829020805485900390556008805485900390556009805485019055905183815261dead92917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561418b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141af9190614bbc565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f815181106141e8576141e8614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061421957614219614b76565b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061424d5761424d614b76565b6001600160a01b0392831660209182029290920101526017546142739130911686612514565b601754604051635c11d79560e01b81526001600160a01b0390911690635c11d795906142ab9087905f90869030904290600401614c5a565b5f604051808303815f87803b1580156142c2575f80fd5b505af19250505080156142d3575060015b6142f4576017546142ef9030906001600160a01b03165f612514565b6143b4565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015614338573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435c9190614bbc565b6143669190614cf6565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f036143cb57505f610d5c565b601654306001600160a01b039091160361449f575f600b5411801561440a5750600b546001600160a01b0384165f908152602081905260409020548301115b801561442e57506001600160a01b0383165f9081526002602052604090205460ff16155b15614486576001600160a01b0383165f90815260208190526040902054600b5411614459575f614476565b6001600160a01b0383165f90815260208190526040902054600b54035b9150815f0361448657505f610d5c565b614491308484613f45565b6011805483900390556145fa565b6012545f90620186a08402816144b7576144b7614c46565b6019546016549290910492505f916001600160a01b0391821691160361455a57601354620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614532576040519150601f19603f3d011682016040523d82523d5f602084013e614537565b606091505b505090508061454b575f9350505050610d5c565b506013805482900390556145ee565b601454620186a09083020460165460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af19250505080156145d5575060408051601f3d908101601f191682019092526145d291810190614bd3565b60015b6145e3575f92505050610d5c565b506014805482900390555b50506012805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016146226146cf565b815260200161462f6146cf565b81526020015f81525090565b6001830191839082156146c3579160200282015f5b8382111561469257835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614650565b80156146c15782816101000a81549062ffffff0219169055600301602081600201049283019260010302614692565b505b5061190f9291506146ed565b60405180606001604052806003906020820280368337509192915050565b5b8082111561190f575f81556001016146ee565b80151581146110fc575f80fd5b5f805f60408486031215614720575f80fd5b833567ffffffffffffffff80821115614737575f80fd5b818601915086601f83011261474a575f80fd5b813581811115614758575f80fd5b8760208260051b850101111561476c575f80fd5b6020928301955093505084013561478281614701565b809150509250925092565b5f81518084525f5b818110156147b157602081850181015186830182015201614795565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61177b602083018461478d565b6001600160a01b03811681146110fc575f80fd5b5f8060408385031215614807575f80fd5b8235614812816147e2565b946020939093013593505050565b5f805f60608486031215614832575f80fd5b833561483d816147e2565b9250602084013561484d816147e2565b929592945050506040919091013590565b803562ffffff81168114614870575f80fd5b919050565b5f82601f830112614884575f80fd5b6040516060810181811067ffffffffffffffff821117156148b357634e487b7160e01b5f52604160045260245ffd5b6040528060608401858111156148c7575f80fd5b845b818110156148e8576148da8161485e565b8352602092830192016148c9565b509195945050505050565b5f805f806101008587031215614907575f80fd5b843560ff81168114614917575f80fd5b93506020850135614927816147e2565b92506149368660408701614875565b91506149458660a08701614875565b905092959194509250565b5f60208284031215614960575f80fd5b813561177b81614701565b5f6020828403121561497b575f80fd5b813563ffffffff8116811461177b575f80fd5b60c081525f6149a060c083018961478d565b82810360208401526149b2818961478d565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526149e4818561478d565b9998505050505050505050565b5f60208284031215614a01575f80fd5b813561177b816147e2565b5f60208284031215614a1c575f80fd5b61177b8261485e565b5f60208284031215614a35575f80fd5b5035919050565b5f8060408385031215614a4d575f80fd5b614a568361485e565b9150614a646020840161485e565b90509250929050565b5f8060408385031215614a7e575f80fd5b8235614a89816147e2565b91506020830135614a99816147e2565b809150509250929050565b805f5b6003811015610f1857815162ffffff16845260209384019390910190600101614aa7565b602080825282518282018190525f919060409081850190868401855b82811015614b3d5781516001600160a01b03815116855286810151614b0e88870182614aa4565b5085810151614b206080870182614aa4565b506060015160e08501526101009093019290850190600101614ae7565b5091979650505050505050565b5f8060408385031215614b5b575f80fd5b8235614b66816147e2565b91506020830135614a9981614701565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680614b9e57607f821691505b6020821081036145fa57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614bcc575f80fd5b5051919050565b5f60208284031215614be3575f80fd5b815161177b81614701565b60ff851681526001600160a01b03841660208201526101008101614c156040830185614aa4565b614c2260a0830184614aa4565b95945050505050565b5f60208284031215614c3b575f80fd5b815161177b816147e2565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614caa5784516001600160a01b031683529383019391830191600101614c85565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215614cdd575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d5c57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220e7865815a727d03ce34afaca24fe767934c4bf1b06e2161fb0af379a6da2b26764736f6c63430008180033
Deployed Bytecode
0x6080604052600436106103ae575f3560e01c806377004851116101f1578063be5e49b211610118578063da88d01a116100b1578063f2fde38b11610083578063f59c37081161006b578063f59c370814610bc7578063f7c3b38f14610be6578063f7de0e5714610c0757005b8063f2fde38b14610b6c578063f3dc4f4814610b8b57005b8063da88d01a14610ad6578063dd62ed3e14610af5578063e92871f614610b39578063f2cda82e14610b4d57005b8063cc1776d3116100ea578063cc1776d314610a36578063d232c22014610a4a578063d8454a8214610aae578063d89135cd14610ac257005b8063be5e49b2146109d2578063c2921583146109f1578063c77e006d14610a0e578063c78fe0d414610a2257005b806395d89b411161018a578063a4d8971a1161015c578063a4d8971a14610958578063a5596b4f14610977578063a9059cbb14610996578063b81a0145146109b557005b806395d89b41146108fd57806396ce0795146109115780639c5ef8d714610925578063a457c2d71461093957005b80638bf1acff116101c35780638bf1acff1461088e5780638d8350ca146108a25780638da5cb5b146108c157806395101f90146108de57005b8063770048511461083357806379cc6790146108475780638324c3b9146108665780638a8c523c1461087a57005b80633af32abf116102d55780635a0d4f881161026e5780636f05be97116102405780636f05be97146107aa57806370a08231146107cb578063715018a6146107ff57806375de14961461081357005b80635a0d4f881461070a5780635b90fe661461073b5780635f6417581461076c57806368a5d4141461078b57005b8063487d1ce5116102a7578063487d1ce51461067f5780634b7d9db41461069e5780634f7041a5146106b557806354fd4d50146106dd57005b80633af32abf146105eb5780633ed8a1691461062257806342966c681461064157806344b691ff1461066057005b806323b872dd1161034757806332acf3de1161031957806332acf3de1461055d578063370158ea1461059257806339137f8b146105b857806339509351146105cc57005b806323b872dd146104c35780632623e975146104e25780632984207a14610501578063313ce5671461052057005b8063095ea7b311610380578063095ea7b3146104485780631171bda91461046757806318160ddd14610486578063186488a8146104a457005b806301b38af5146103b7578063064a59d0146103d657806306fdde031461040a57806307e9652c1461042b57005b366103b557005b005b3480156103c2575f80fd5b506103b56103d136600461470e565b610c24565b3480156103e1575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610415575f80fd5b5061041e610cbc565b60405161040191906147d0565b348015610436575f80fd5b5060065462010000900460ff166103f5565b348015610453575f80fd5b506103f56104623660046147f6565b610d4c565b348015610472575f80fd5b506103b5610481366004614820565b610d62565b348015610491575f80fd5b506008545b604051908152602001610401565b3480156104af575f80fd5b506103b56104be3660046148f3565b610f1e565b3480156104ce575f80fd5b506103f56104dd366004614820565b610f89565b3480156104ed575f80fd5b506103b56104fc366004614950565b610faa565b34801561050c575f80fd5b506103b561051b36600461496b565b611080565b34801561052b575f80fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000012168152602001610401565b348015610568575f80fd5b5060065460075460408051600160e01b90930462ffffff9081168452909116602083015201610401565b34801561059d575f80fd5b506105a66110ff565b6040516104019695949392919061498e565b3480156105c3575f80fd5b506103b561128a565b3480156105d7575f80fd5b506103f56105e63660046147f6565b61130a565b3480156105f6575f80fd5b506103f56106053660046149f1565b6001600160a01b03165f9081526002602052604090205460ff1690565b34801561062d575f80fd5b506103b561063c366004614a0c565b61133c565b34801561064c575f80fd5b506103b561065b366004614a25565b611412565b34801561066b575f80fd5b506103b561067a366004614a3c565b61141c565b34801561068a575f80fd5b506103b56106993660046149f1565b61153e565b3480156106a9575f80fd5b5060065460ff166103f5565b3480156106c0575f80fd5b506106c9611605565b60405162ffffff9091168152602001610401565b3480156106e8575f80fd5b50604080518082019091526005815264312e302e3160d81b602082015261041e565b348015610715575f80fd5b506016546001600160a01b03165b6040516001600160a01b039091168152602001610401565b348015610746575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff9091168152602001610401565b348015610777575f80fd5b506106c96107863660046149f1565b611614565b348015610796575f80fd5b506107236107a5366004614a6d565b61170f565b3480156107b5575f80fd5b506107be611782565b6040516104019190614acb565b3480156107d6575f80fd5b506104966107e53660046149f1565b6001600160a01b03165f9081526020819052604090205490565b34801561080a575f80fd5b506103b5611913565b34801561081e575f80fd5b50600654600160381b900462ffffff166106c9565b34801561083e575f80fd5b506103b561197c565b348015610852575f80fd5b506103b56108613660046147f6565b6119bd565b348015610871575f80fd5b506103b56119d2565b348015610885575f80fd5b506103b5611a58565b348015610899575f80fd5b506106c9611b39565b3480156108ad575f80fd5b506106c96108bc3660046149f1565b611b3f565b3480156108cc575f80fd5b50601b546001600160a01b0316610723565b3480156108e9575f80fd5b506106c96108f83660046149f1565b611c09565b348015610908575f80fd5b5061041e611ce5565b34801561091c575f80fd5b506103e86106c9565b348015610930575f80fd5b506103b5611cf4565b348015610944575f80fd5b506103f56109533660046147f6565b611d88565b348015610963575f80fd5b506103b5610972366004614950565b611e08565b348015610982575f80fd5b506103b5610991366004614950565b611eb3565b3480156109a1575f80fd5b506103f56109b03660046147f6565b611f2e565b3480156109c0575f80fd5b50601a546001600160a01b0316610723565b3480156109dd575f80fd5b506103b56109ec3660046149f1565b611f3a565b3480156109fc575f80fd5b506018546001600160a01b0316610723565b348015610a19575f80fd5b506103b5611fba565b348015610a2d575f80fd5b506103b561203e565b348015610a41575f80fd5b506106c96120c6565b348015610a55575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925264010000000083048216151560608201526301000000909204161515608082015260a001610401565b348015610ab9575f80fd5b50600f54610496565b348015610acd575f80fd5b50600954610496565b348015610ae1575f80fd5b506103b5610af0366004614a0c565b6120d0565b348015610b00575f80fd5b50610496610b0f366004614a6d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b44575f80fd5b506103b561219e565b348015610b58575f80fd5b506103b5610b673660046147f6565b612220565b348015610b77575f80fd5b506103b5610b863660046149f1565b612346565b348015610b96575f80fd5b506103f5610ba53660046149f1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bd2575f80fd5b506103b5610be1366004614b4a565b6123aa565b348015610bf1575f80fd5b50600654640100000000900462ffffff166106c9565b348015610c12575f80fd5b506017546001600160a01b0316610723565b601b546001600160a01b03163314610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610cb557610cad858583818110610c9257610c92614b76565b9050602002016020810190610ca791906149f1565b846123f9565b600101610c75565b5050505050565b6060601c8054610ccb90614b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf790614b8a565b8015610d425780601f10610d1957610100808354040283529160200191610d42565b820191905f5260205f20905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b5f610d58338484612514565b5060015b92915050565b601b546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190614bbc565b90505f6001600160a01b0385163014610e49576016546001600160a01b03868116911614610e41575f610e51565b601454610e51565b600e54601154015b90508282821015610e625781610e64565b825b83031015610ea65760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190614bd3565b50505050565b601b546001600160a01b03163314610f675760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615610f7d575f80fd5b610f1884848484612575565b5f610f95843384612a41565b610fa0848484612ac3565b5060019392505050565b601b546001600160a01b03163314610ff35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561100a575f80fd5b80158061102157506017546001600160a01b031615155b61106d5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610c69565b6006805460ff1916911515919091179055565b601b546001600160a01b031633146110c95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff16156110df575f80fd5b6102588163ffffffff1611156110f3575f80fd5b6110fc81613122565b50565b6060805f805f6060601c601d7f0000000000000000000000000000000000000000000000000000000000000012601b5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461116e90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461119a90614b8a565b80156111e55780601f106111bc576101008083540402835291602001916111e5565b820191905f5260205f20905b8154815290600101906020018083116111c857829003601f168201915b505050505095508480546111f890614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461122490614b8a565b801561126f5780601f106112465761010080835404028352916020019161126f565b820191905f5260205f20905b81548152906001019060200180831161125257829003601f168201915b50505050509450955095509550955095509550909192939495565b601b546001600160a01b031633146112d35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d589185908501612514565b601b546001600160a01b031633146113855760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60155462010000900460ff161561139a575f80fd5b62ffffff811615806113c5575060648162ffffff16101580156113c55750620186a062ffffff821611155b6113cd575f80fd5b6113d68161318e565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6110fc3382613231565b601b546001600160a01b031633146114655760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561147c575f80fd5b60018262ffffff161015801561149957506103e88262ffffff1611155b6114d45760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b8162ffffff168162ffffff16101580156114f557506103e88162ffffff1611155b6115305760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b61153a8282613287565b5050565b601b546001600160a01b031633146115875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561159e575f80fd5b6016546001600160a01b038281169116148015906115bd57505f601254115b156115fc5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6110fc81613301565b5f61160f33611c09565b905090565b6006545f9062010000900460ff161561162e57505f919050565b6001600160a01b03821630148061165c57506001600160a01b0382165f9081526002602052604090205460ff165b8061167457506018546001600160a01b038381169116145b8061168c57506017546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff16806116dc575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6116f457600654600160801b900462ffffff16610d5c565b600654600160c81b900462ffffff16610d5c565b5f92915050565b601b545f906001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611771575f80fd5b61177b83836134d8565b9392505050565b60408051600580825260c08201909252606091816020015b6117a2614600565b81526020019060019003908161179a5790505090505f5b60058160ff16101561190f576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611816579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161188a5750505092845250505060ff83165f81815260046020908152604090912060030154920191909152835184919081106118fc576118fc614b76565b60209081029190910101526001016117b9565b5090565b601b546001600160a01b0316331461195c5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ffffffffff191664010101010117905561197a5f6137b9565b565b60065460ff1680156119965750600654610100900460ff16155b80156119ac57506006546301000000900460ff16155b6119b4575f80fd5b61197a5f61380a565b6119c8823383612a41565b61153a8282613231565b601b546001600160a01b03163314611a1b5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601b546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611ab8575f80fd5b600754600160381b900463ffffffff1615611b155760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610c69565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61160f335b5f6001600160a01b038216301480611b6e57506001600160a01b0382165f9081526002602052604090205460ff165b80611b8657506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611bd6575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611bf5576006546a0100000000000000000000900462ffffff16610d5c565b600654600160981b900462ffffff16610d5c565b6006545f9062010000900460ff1615611c2357505f919050565b6001600160a01b038216301480611c5157506001600160a01b0382165f9081526002602052604090205460ff165b80611c6957506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611cb9575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611cd157600654600160681b900462ffffff16610d5c565b600654600160b01b900462ffffff16610d5c565b6060601d8054610ccb90614b8a565b601b546001600160a01b0316331480611d1b5750335f9081526002602052604090205460ff165b611d565760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b600654610100900460ff16158015611d7857506006546301000000900460ff16155b611d80575f80fd5b61197a613d16565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611dfb5760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610c69565b610fa03385858403612514565b601b546001600160a01b0316331480611e2f5750335f9081526002602052604090205460ff165b611e6a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b8080611e78575060065460ff165b8015611e8c5750600654610100900460ff16155b8015611ea257506006546301000000900460ff16155b611eaa575f80fd5b6110fc8161380a565b601b546001600160a01b03163314611efc5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f12575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d58338484612ac3565b601b546001600160a01b03163314611f835760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f99575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601b546001600160a01b031633146120035760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601b546001600160a01b031633146120875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61160f33611614565b601b546001600160a01b031633146121195760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554610100900460ff161561212d575f80fd5b62ffffff81161580612158575060648162ffffff16101580156121585750620186a062ffffff821611155b612160575f80fd5b61216981613ea4565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b601b546001600160a01b031633146121e75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601b546001600160a01b031633146122695760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60195460165447915f916001600160a01b0390811691161461228b575f61228f565b6013545b905082828210156122a057816122a2565b825b830310156122e45760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461232f576040519150601f19603f3d011682016040523d82523d5f602084013e612334565b606091505b5050905080612341575f80fd5b505050565b601b546001600160a01b0316331461238f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6001600160a01b0381166123a1575f80fd5b6110fc816137b9565b601b546001600160a01b031633146123f35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b61153a82825b60155460ff1615612408575f80fd5b6001600160a01b0382161580159061242b57506001600160a01b03821661dead14155b612433575f80fd5b6017546001600160a01b0383811691161480159061245f57506018546001600160a01b03838116911614155b6124b65760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c69565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612584575f80fd5b6001600160a01b03831630148015906125a557506001600160a01b03831615155b6125ad575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead1480156125db57505f8160030154115b1561261a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6001810180548451600680546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a892900416118015906128a957506006546161a8600160681b90910462ffffff161180159061287a57506006546161a8600160801b90910462ffffff1611155b80156128a957506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6128f55760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610c69565b600654620186a0600160981b90910462ffffff16118015906129295750600654620186a0600160b01b90910462ffffff1611155b80156129475750600654620186a0600160c81b90910462ffffff1611155b6129935760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610c69565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038616021781556129d76001820184600361463b565b506129e76002820183600361463b565b50805460ff166129fd57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612a329493929190614bee565b60405180910390a15050505050565b6001600160a01b038381165f9081526001602090815260408083209386168352929052205481811015612ab65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610c69565b610f188484848403612514565b61deac196001600160a01b03831601612ae0576123418382613231565b6006546301000000900460ff16158015612b025750600654610100900460ff16155b8015612b3557506018546001600160a01b03848116911614801590612b3557506017546001600160a01b03848116911614155b15612b4b57612b435f61380a565b612b4b613d16565b5f81118015612b7257506001600160a01b0383165f9081526002602052604090205460ff16155b8015612b9657506001600160a01b0382165f9081526002602052604090205460ff16155b8015612bab57506001600160a01b0383163014155b8015612bc057506001600160a01b0382163014155b8015612bda57506017546001600160a01b03838116911614155b15613117576018546001600160a01b03848116911614801590612c0b57506018546001600160a01b03838116911614155b80612c5457506018546001600160a01b0384811691161480612c3a57506018546001600160a01b038381169116145b8015612c545750600754600160381b900463ffffffff1615155b612ca05760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610c69565b600a541580612cb15750600a548111155b612cfd5760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610c69565b600b541580612d1457506001600160a01b03821630145b80612d4357506018546001600160a01b0383811691161480612d4357506017546001600160a01b038381169116145b80612d695750600b546001600160a01b0383165f90815260208190526040902054820111155b612db55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610c69565b60065462010000900460ff16158015612dd857506006546301000000900460ff16155b8015612dec5750600654610100900460ff16155b15613117576018545f9081906001600160a01b0386811691161480612e1e57506018546001600160a01b038581169116145b15612e45576018546001600160a01b03868116911614612e3f576002612e42565b60015b90505b5f8160ff16600114612e575785612e59565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612eaa57506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612ed4576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff1610156130fe575f808460ff1611612f61576001600160a01b0383165f90815260036020526040902054610100900460ff16612f475760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613029565b60ff82165f90815260046020526040812060020190612f27565b8360ff16600114612fc7576001600160a01b0383165f90815260036020526040902054610100900460ff16612fab5760ff82165f9081526004602052604090206001016002612f27565b60ff82165f908152600460205260409020600290810190612f27565b6001600160a01b0383165f90815260036020526040902054610100900460ff166130075760ff82165f908152600460205260409020600190810190612f27565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f0361303d57506130f6565b620186a086820204613050893083613f45565b60185460ff84165f908152600460205260409020546001600160a01b039182166101009091049091160361308b57600e8054820190556130ef565b60ff83165f9081526004602052604090205461deac196101009091046001600160a01b0316016130c4576130bf3082613231565b6130ef565b60ff83165f908152600460205260409020600301805482019055601180548201905560108054820190555b9490940193505b600101612ed6565b50821561311357600f80548401905592829003925b5050505b612341838383613f45565b600780547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611407565b6006805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556131be575f6131d4565b6131d46008548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000016110fc5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611407565b61323b8282614082565b60065461325490640100000000900462ffffff16613ea4565b60065461326c90600160381b900462ffffff1661318e565b60065460075461153a9162ffffff600160e01b909104811691165b600680547fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546132e791620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b7f000000000000000000000000000000000000000000000000000000000000000115801561333657506001600160a01b038116155b8061334957506001600160a01b03811630145b8061336157506019546001600160a01b038281169116145b8061345257506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156133ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d29190614c2b565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614c2b565b6001600160a01b031614155b61349e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610c69565b6001600160a01b038116156134b357806134b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166134eb575f80fd5b6017546001600160a01b0384811691161461372e575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135659190614c2b565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c89190614c2b565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015613618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363c9190614c2b565b90506001600160a01b0381166136be576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bb9190614c2b565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b0383811691161461375f57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff0019166101001790558015801561382a575060065460ff16155b613d08575f80600e541161383e575f613852565b6002600e548161385057613850614c46565b045b6019546016549192505f916001600160a01b03908116911614613875575f613879565b6011545b90508181018315801561388d5750600d5481115b156138f6575f831161389f575f6138c5565b600d546138c59082620186a08602816138ba576138ba614c46565b04620186a091020490565b92505f82116138d4575f6138ef565b600d546138ef9082620186a08502816138ba576138ba614c46565b9150508181015b83806139045750600c548110155b80156139205750305f9081526020819052604090205481840111155b15613c1e5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061395c5761395c614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061398d5761398d614b76565b6001600160a01b0392831660209182029290920101526017546139b39130911685612514565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906139eb9086905f90869030904290600401614c5a565b5f604051808303815f87803b158015613a02575f80fd5b505af1925050508015613a13575060015b613a3457601754613a2f9030906001600160a01b03165f612514565b613c1b565b600e5415613a4657600e805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613c19575f613aa38286620186a08a02816138ba576138ba614c46565b6019546016549192506001600160a01b03908116911603613af157613ad68286620186a08902816138ba576138ba614c46565b60138054909101905560128054870190556011805487900390555b5f87118015613aff57505f81115b15613c1757601754613b1c9030906001600160a01b031689612514565b601754601a5460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613ba8575060408051601f3d908101601f19168201909252613ba591810190614ccb565b60015b613bc957601754613bc49030906001600160a01b03165f612514565b613c17565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600e80548990039055505b505b505b50505b6016546001600160a01b03163014801590613c4a57506019546016546001600160a01b03908116911614155b15613cd757601154915083158015613c635750600d5482115b15613c6e57600d5491505b8380613c7c5750600c548210155b8015613c965750305f908152602081905260409020548211155b15613cd7576016545f90613cb3906001600160a01b031684614145565b90508015613cd557601480548201905560128054840190556011805484900390555b505b505050613ce763ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff0000001916630100000017905560105415613e95575f805b60058160ff161015613e315760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b0316901580613d7f57506001600160a01b03811661dead145b80613d9757506018546001600160a01b038281169116145b15613da25750613e29565b6016545f90613df0906001600160a01b03163014613dc257601254613dc6565b6011545b60105460ff86165f90815260046020526040902060030154620186a002816138ba576138ba614c46565b90505f613dfd83836143bc565b90508015613e255760ff84165f90815260046020526040902060030180548290039055938401935b5050505b600101613d34565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613e60576010805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff00000000191664010000000062ffffff841690810291909117909155613ed2575f613ee8565b613ee86008548262ffffff16620186a091020490565b600a557f00000000000000000000000000000000000000000000000000000000000000016110fc5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b6001600160a01b03831615801590613f6557506001600160a01b03821615155b613fb15760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c69565b6001600160a01b0383165f9081526020819052604090205481111561400a5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b801561403d576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161256891815260200190565b6001600160a01b0382165f908152602081905260409020548111156140db5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b6001600160a01b0382165f8181526020818152604091829020805485900390556008805485900390556009805485019055905183815261dead92917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561418b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141af9190614bbc565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f815181106141e8576141e8614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061421957614219614b76565b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061424d5761424d614b76565b6001600160a01b0392831660209182029290920101526017546142739130911686612514565b601754604051635c11d79560e01b81526001600160a01b0390911690635c11d795906142ab9087905f90869030904290600401614c5a565b5f604051808303815f87803b1580156142c2575f80fd5b505af19250505080156142d3575060015b6142f4576017546142ef9030906001600160a01b03165f612514565b6143b4565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015614338573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435c9190614bbc565b6143669190614cf6565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f036143cb57505f610d5c565b601654306001600160a01b039091160361449f575f600b5411801561440a5750600b546001600160a01b0384165f908152602081905260409020548301115b801561442e57506001600160a01b0383165f9081526002602052604090205460ff16155b15614486576001600160a01b0383165f90815260208190526040902054600b5411614459575f614476565b6001600160a01b0383165f90815260208190526040902054600b54035b9150815f0361448657505f610d5c565b614491308484613f45565b6011805483900390556145fa565b6012545f90620186a08402816144b7576144b7614c46565b6019546016549290910492505f916001600160a01b0391821691160361455a57601354620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614532576040519150601f19603f3d011682016040523d82523d5f602084013e614537565b606091505b505090508061454b575f9350505050610d5c565b506013805482900390556145ee565b601454620186a09083020460165460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af19250505080156145d5575060408051601f3d908101601f191682019092526145d291810190614bd3565b60015b6145e3575f92505050610d5c565b506014805482900390555b50506012805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016146226146cf565b815260200161462f6146cf565b81526020015f81525090565b6001830191839082156146c3579160200282015f5b8382111561469257835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614650565b80156146c15782816101000a81549062ffffff0219169055600301602081600201049283019260010302614692565b505b5061190f9291506146ed565b60405180606001604052806003906020820280368337509192915050565b5b8082111561190f575f81556001016146ee565b80151581146110fc575f80fd5b5f805f60408486031215614720575f80fd5b833567ffffffffffffffff80821115614737575f80fd5b818601915086601f83011261474a575f80fd5b813581811115614758575f80fd5b8760208260051b850101111561476c575f80fd5b6020928301955093505084013561478281614701565b809150509250925092565b5f81518084525f5b818110156147b157602081850181015186830182015201614795565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61177b602083018461478d565b6001600160a01b03811681146110fc575f80fd5b5f8060408385031215614807575f80fd5b8235614812816147e2565b946020939093013593505050565b5f805f60608486031215614832575f80fd5b833561483d816147e2565b9250602084013561484d816147e2565b929592945050506040919091013590565b803562ffffff81168114614870575f80fd5b919050565b5f82601f830112614884575f80fd5b6040516060810181811067ffffffffffffffff821117156148b357634e487b7160e01b5f52604160045260245ffd5b6040528060608401858111156148c7575f80fd5b845b818110156148e8576148da8161485e565b8352602092830192016148c9565b509195945050505050565b5f805f806101008587031215614907575f80fd5b843560ff81168114614917575f80fd5b93506020850135614927816147e2565b92506149368660408701614875565b91506149458660a08701614875565b905092959194509250565b5f60208284031215614960575f80fd5b813561177b81614701565b5f6020828403121561497b575f80fd5b813563ffffffff8116811461177b575f80fd5b60c081525f6149a060c083018961478d565b82810360208401526149b2818961478d565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526149e4818561478d565b9998505050505050505050565b5f60208284031215614a01575f80fd5b813561177b816147e2565b5f60208284031215614a1c575f80fd5b61177b8261485e565b5f60208284031215614a35575f80fd5b5035919050565b5f8060408385031215614a4d575f80fd5b614a568361485e565b9150614a646020840161485e565b90509250929050565b5f8060408385031215614a7e575f80fd5b8235614a89816147e2565b91506020830135614a99816147e2565b809150509250929050565b805f5b6003811015610f1857815162ffffff16845260209384019390910190600101614aa7565b602080825282518282018190525f919060409081850190868401855b82811015614b3d5781516001600160a01b03815116855286810151614b0e88870182614aa4565b5085810151614b206080870182614aa4565b506060015160e08501526101009093019290850190600101614ae7565b5091979650505050505050565b5f8060408385031215614b5b575f80fd5b8235614b66816147e2565b91506020830135614a9981614701565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680614b9e57607f821691505b6020821081036145fa57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614bcc575f80fd5b5051919050565b5f60208284031215614be3575f80fd5b815161177b81614701565b60ff851681526001600160a01b03841660208201526101008101614c156040830185614aa4565b614c2260a0830184614aa4565b95945050505050565b5f60208284031215614c3b575f80fd5b815161177b816147e2565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614caa5784516001600160a01b031683529383019391830191600101614c85565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215614cdd575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d5c57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220e7865815a727d03ce34afaca24fe767934c4bf1b06e2161fb0af379a6da2b26764736f6c63430008180033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.