ERC-20
Overview
Max Total Supply
50,000,000 INVEST
Holders
204
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000026819451 INVESTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
InvestAI
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
/* InvestAI AI Invest, be part of the next generation of defi $INVEST token fund Web: https://www.aicontrol.technology X: https://twitter.com/AIControlTech Telegram: https://t.me/XAI_Control Discord: https://discord.gg/C2h7GSvdzm YouTube: https://www.youtube.com/@AIControlTechnology */ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; import "./CF_Ownable.sol"; import "./CF_Common.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 InvestAI is CF_Ownable, CF_Common, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Whitelist, CF_MaxTx, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 { constructor() { _name = unicode"InvestAI"; _symbol = unicode"INVEST"; _decimals = 18; _totalSupply = 50000000000000000000000000; // 50,000,000 INVEST _transferOwnership(0x7ba33149136A20E1F3342B6C719d0A1102Abe856); _transferInitialSupply(0x7ba33149136A20E1F3342B6C719d0A1102Abe856, 100000); // 100% _setEarlyPenaltyTime(180); // 3min _setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0x7ba33149136A20E1F3342B6C719d0A1102Abe856); _setReflection(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); _swapEnabled = true; _setMinSwapPercent(50); // 0.05% of totalSupply _setMinTaxDistributionPercent(50); // 0.05% of totalSupply _setTaxBeneficiary(0, 0x7ba33149136A20E1F3342B6C719d0A1102Abe856, [ uint24(0), uint24(4990), uint24(4990) ], [ uint24(50000), uint24(50000), uint24(50000) ]); _initialWhitelist([ 0x7ba33149136A20E1F3342B6C719d0A1102Abe856 ]); _setMaxBalancePercent(2000); // 2% of totalSupply _domainSeparator = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this))); _initialized = true; } function _transfer(address from, address to, uint256 amount) internal virtual override { require(to != address(0xdEaD)); if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) { _autoSwap(false); _autoTaxDistribute(false); } 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; } 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); _setMinTaxDistributionPercent(_minTaxDistributionPercent); _setMinSwapPercent(_minSwapPercent); } 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 Taxable, bool DEXRouterV2) { return (_renounced.Whitelist, _renounced.MaxTx, _renounced.MaxBalance, _renounced.Taxable, _renounced.DEXRouterV2); } /// @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.23; abstract contract CF_Ownable { 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 { _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.23; import "./IDEXV2.sol"; import "./IERC20.sol"; abstract contract CF_Common { string internal constant _version = "1.0.0"; 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 _swapEnabled; 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 _minTaxDistributionPercent; uint24 internal _minSwapPercent; 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 _totalTaxCollected; uint256 internal _minTaxDistributionAmount; uint256 internal _amountForTaxDistribution; uint256 internal _amountSwappedForTaxDistribution; uint256 internal _minSwapAmount; uint256 internal _amountForLiquidity; uint256 internal _ethForTaxDistribution; uint256 internal _reflectionTokensForTaxDistribution; 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; DEXRouterV2 internal _dex; IERC20 internal _reflectionToken; 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 pragma solidity 0.8.23; import "./CF_Common.sol"; abstract contract CF_ERC20 is CF_Common { string internal _name; string internal _symbol; bytes32 internal _domainSeparator; bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); mapping(address => uint256) private _nonces; 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 permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, "Expired signature"); unchecked { bytes32 digest = keccak256(abi.encodePacked(hex"1901", _domainSeparator, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline)))); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Invalid signature"); } _approve(owner, spender, value); } function nonces(address owner) external view returns (uint256) { return _nonces[owner]; } function DOMAIN_SEPARATOR() external view returns (bytes32) { return _domainSeparator; } 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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; abstract contract CF_Recoverable is CF_Ownable, CF_Common { /// @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(_reflectionToken) == token ? _reflectionTokensForTaxDistribution : 0); require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance"); } IERC20(token).transfer(to, amount); } /// @notice Recovers a misplaced amount of native ETH sitting in the contract balance /// @dev Note that if the reflection token is ETH, amounts allocated for tax distribution and/or liquidity are reserved /// @param to Recipient /// @param amount Amount of ETH to be transferred function recoverETH(address payable to, uint256 amount) external onlyOwner { unchecked { uint256 balance = address(this).balance; uint256 allocated = address(_reflectionToken) == _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.23; 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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; abstract contract CF_Whitelist is CF_Ownable, CF_Common { 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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; abstract contract CF_MaxTx is CF_Ownable, CF_Common { 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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; abstract contract CF_MaxBalance is CF_Ownable, CF_Common { 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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; import "./CF_ERC20.sol"; abstract contract CF_Taxable is CF_Ownable, CF_Common, 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.exists && _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 and the min. threshold has been reached unless forced function autoTaxDistribute() external { require(!_swapping && !_distributing); _autoTaxDistribute(false); } /// @notice Triggers the tax 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. threshold amount function autoTaxDistribute(bool force) external onlyOwner { require(!_swapping && !_distributing); _autoTaxDistribute(force); } function _autoTaxDistribute(bool force) internal lockDistributing { if (!force) { if (address(_reflectionToken) == address(this) && (_amountForTaxDistribution == 0 || _balance[address(this)] < _amountForTaxDistribution || _amountForTaxDistribution < _minTaxDistributionAmount)) { return; } if (address(_reflectionToken) == _dex.WETH && (_ethForTaxDistribution == 0 || _ethForTaxDistribution < address(this).balance)) { return; } if (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && (_reflectionTokensForTaxDistribution == 0 || _reflectionTokensForTaxDistribution < _reflectionToken.balanceOf(address(this)))) { return; } } unchecked { uint256 distributed; for (uint8 i; i < 5; i++) { address account = _taxBeneficiary[i].account; uint256 unclaimed = _taxBeneficiary[i].unclaimed; if (unclaimed == 0 || account == address(0xdEaD) || account == _dex.pair) { continue; } uint256 _distributed = _distribute(account, unclaimed); if (_distributed > 0) { _taxBeneficiary[i].unclaimed -= _distributed; } distributed += _distributed; } _lastTaxDistribution = _timestamp(); emit TaxDistributed(distributed); } } function _distribute(address account, uint256 unclaimed) private returns (uint256) { if (address(_reflectionToken) == address(this)) { super._transfer(address(this), account, unclaimed); _amountForTaxDistribution -= unclaimed; } else { uint256 percent = (uint256(_denominator) * unclaimed * 100) / _amountSwappedForTaxDistribution; uint256 amount; if (address(_reflectionToken) == _dex.WETH) { amount = _percentage(_ethForTaxDistribution, percent); if (_ethForTaxDistribution < amount) { return 0; } (bool success, ) = payable(account).call{ value: amount, gas: 30000 }(""); if (!success) { return 0; } _ethForTaxDistribution -= amount; } else { amount = _percentage(_reflectionTokensForTaxDistribution, percent); if (_reflectionTokensForTaxDistribution < unclaimed) { return 0; } _reflectionToken.transfer(account, amount); _reflectionTokensForTaxDistribution -= amount; } _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 Returns the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution function getMinTaxDistributionPercent() external view returns (uint24) { return _minTaxDistributionPercent; } /// @notice Sets the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution /// @dev This percentage will be used only if no reflection token has been set /// @param percent Desired percentage, multiplied by denominator (0.001% to 1% of total supply) function setMinTaxDistributionPercent(uint24 percent) external onlyOwner { require(!_renounced.Taxable); require(percent >= 1 && percent <= 1000, "0.001% to 1%"); _setMinTaxDistributionPercent(percent); } function _setMinTaxDistributionPercent(uint24 percent) internal { _minTaxDistributionPercent = percent; _minTaxDistributionAmount = _percentage(_totalSupply, uint256(percent)); } /// @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.23; import "./CF_Ownable.sol"; import "./CF_Common.sol"; import "./CF_ERC20.sol"; abstract contract CF_DEXRouterV2 is CF_Ownable, CF_Common, CF_ERC20 { event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity); event SwappedTokensForETH(uint256 tokenAmount, uint256 ethAmount); event SwappedTokensForERC20(address token, uint256 token0Amount, uint256 token1Amount); event SetDEXRouter(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 setDEXRouter(address router, address receiver) external onlyOwner returns (address) { require(!_renounced.DEXRouterV2); return _setDEXRouter(router, receiver); } function _setDEXRouter(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 SetDEXRouter(router, _dex.pair, receiver); return _dex.pair; } /// @notice Returns the DEX router currently in use function getDEXRouter() external view returns (address) { return _dex.router; } /// @notice Returns the trading pair function getDEXPair() external view returns (address) { return _dex.pair; } /// @notice Returns address of the LP tokens receiver function getDEXReceiver() external view returns (address) { return _dex.receiver; } /// @notice Returns address of the reflection token function getReflectionToken() external view returns (address) { return address(_reflectionToken); } /// @notice Checks the status of the auto-swapping feature function isSwapEnabled() external view returns (bool) { return _swapEnabled; } /// @notice Checks whether the token can be traded through the assigned DEX function isTradingEnabled() external view returns (bool) { return _tradingEnabled > 0; } /// @notice Assign the excess token balance of the Smart-Contract to liquidity function liquifyExcess() external onlyOwner { require(_swapEnabled && !_swapping); unchecked { uint256 assigned = _amountForTaxDistribution + _amountForLiquidity; require(_balance[address(this)] > assigned); uint256 excess = _balance[address(this)] - assigned; _amountForLiquidity += excess; } _autoSwap(false); } /// @notice Swaps the assigned amount for liquidity and taxes to the corresponding token /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced function autoSwap() external { require(_swapEnabled && !_swapping && !_distributing); _autoSwap(false); } /// @notice Swaps the assigned amount for liquidity and taxes to the corresponding token /// @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. threshold amount function autoSwap(bool force) external onlyOwner { require(_swapEnabled && !_swapping && !_distributing); _autoSwap(force); } function _autoSwap(bool force) internal lockSwapping { if (!_swapEnabled) { return; } unchecked { if (force || ((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity / 2 >= _minSwapAmount && _balance[address(this)] >= (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + _amountForLiquidity)) { uint256 tokenAmountForLiquidity = _amountForLiquidity / 2; uint256 ethBalance = address(this).balance; address[] memory pathToSwapExactTokensForETH = new address[](2); pathToSwapExactTokensForETH[0] = address(this); pathToSwapExactTokensForETH[1] = _dex.WETH; _approve(address(this), _dex.router, (address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity); try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, 0, pathToSwapExactTokensForETH, address(this), block.timestamp + 1) { _lastSwap = _timestamp(); if (_amountForLiquidity > 0) { _amountForLiquidity /= 2; } uint256 ethAmount = address(this).balance - ethBalance; emit SwappedTokensForETH((address(_reflectionToken) == _dex.WETH ? _amountForTaxDistribution : 0) + tokenAmountForLiquidity, ethAmount); if (ethAmount > 0) { uint256 ethForLiquidity = ethAmount; if (address(_reflectionToken) == _dex.WETH) { ethForLiquidity = _percentage(ethAmount, tokenAmountForLiquidity >= _amountForTaxDistribution ? (100 * uint256(_denominator)) - ((uint256(_denominator) * _amountForTaxDistribution * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution)) : (uint256(_denominator) * tokenAmountForLiquidity * 100) / (tokenAmountForLiquidity + _amountForTaxDistribution)); _amountSwappedForTaxDistribution += _amountForTaxDistribution; _amountForTaxDistribution = 0; _ethForTaxDistribution += ethAmount - ethForLiquidity; } if (tokenAmountForLiquidity > 0 && ethForLiquidity > 0) { _approve(address(this), _dex.router, tokenAmountForLiquidity); try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidity }(address(this), tokenAmountForLiquidity, 0, 0, _dex.receiver, block.timestamp + 1) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { emit SwapAndLiquify(amountToken, amountETH, liquidity); _amountForLiquidity = 0; } catch { _approve(address(this), _dex.router, 0); } } } } catch { _approve(address(this), _dex.router, 0); } } if (force || (address(_reflectionToken) != address(this) && address(_reflectionToken) != _dex.WETH && _amountForTaxDistribution >= _minSwapAmount && _balance[address(this)] >= _amountForTaxDistribution)) { uint256 reflectionTokenBalance = _reflectionToken.balanceOf(address(this)); address[] memory pathToSwapExactTokensForERC20 = new address[](3); pathToSwapExactTokensForERC20[0] = address(this); pathToSwapExactTokensForERC20[1] = _dex.WETH; pathToSwapExactTokensForERC20[2] = address(_reflectionToken); _reflectionToken.approve(_dex.router, _amountForTaxDistribution); try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(_amountForTaxDistribution, 0, (pathToSwapExactTokensForERC20), address(this), block.timestamp + 1) { emit SwappedTokensForERC20(address(_reflectionToken), _amountForTaxDistribution, reflectionTokenBalance - _reflectionToken.balanceOf(address(this))); _amountSwappedForTaxDistribution += _amountForTaxDistribution; _amountForTaxDistribution = 0; _reflectionTokensForTaxDistribution += reflectionTokenBalance - _reflectionToken.balanceOf(address(this)); } catch { _reflectionToken.approve(_dex.router, 0); } } } } /// @notice Sets the desired ERC-20 reflection token /// @dev If other token than WETH is specified, the pair WETH-token must already exist /// @param token Address of the ERC-20 token function setReflection(address token) external onlyOwner { require(!_renounced.DEXRouterV2); _setReflection(token); } function _setReflection(address token) internal { require(token == address(0) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair"); _reflectionToken = IERC20(token == address(0) ? address(this) : token); } /// @notice Returns the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap function getMinSwapPercent() external view returns (uint24) { return _minSwapPercent; } /// @notice Sets the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap /// @param percent Desired percentage, multiplied by denominator (0.001% to 1% of total supply) function setMinSwapPercent(uint24 percent) external onlyOwner { require(!_renounced.DEXRouterV2); require(percent >= 1 && percent <= 1000, "0.001% to 1%"); _setMinSwapPercent(percent); } function _setMinSwapPercent(uint24 percent) internal { _minSwapPercent = percent; _minSwapAmount = _percentage(_totalSupply, uint256(percent)); } /// @notice Enables or disables the auto swap function /// @param status True to enable, False to disable function setSwapStatus(bool status) external onlyOwner { require(!_renounced.DEXRouterV2); require(!status || _dex.router != address(0), "No DEX"); _swapEnabled = status; } /// @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.23; 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.23; 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":"SetDEXRouter","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":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForETH","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":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"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":"bool","name":"force","type":"bool"}],"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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouter","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":"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":"getMinSwapPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinTaxDistributionPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReflectionToken","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","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":"liquifyExcess","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","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":"recoverETH","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":"Taxable","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","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":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouter","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":"uint24","name":"percent","type":"uint24"}],"name":"setMinSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinTaxDistributionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setReflection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapStatus","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":"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
60c060405234801562000010575f80fd5b50604080518082019091526008815267496e76657374414960c01b6020820152601b906200003f908262000fc1565b506040805180820190915260068152651253959154d560d21b6020820152601c906200006c908262000fc1565b50601260a0526a295be96e640669720000006009556200009a5f805160206200651583398151915262000299565b620000b75f8051602062006515833981519152620186a0620002e8565b620000c360b46200036d565b620000f1737a250d5630b4cf539739df2c5dacb4c659f2488d5f8051602062006515833981519152620003c8565b506200011173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620006b9565b6007805460088054603262ffffff199091168117909155600954620186a0910204601181905560ff62ffffff60e01b01199091166001601960e11b0117909155600e5560408051606080820183525f80835261137e6020808501829052848601919091528451928301855261c35080845290830181905293820193909352620001ab92915f80516020620065158339815191529162000861565b60408051602081019091525f80516020620065158339815191528152620001d29062000c6f565b620001df6107d062000cbb565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f601b6040516200021191906200108d565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f198184030181529190528051602090910120601d556001608052620011ba565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805115620002f5575f80fd5b5f6200030f6009548362ffffff1662000d4360201b60201c565b6001600160a01b0384165f818152600160205260408082208490555192935090917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620003609085815260200190565b60405180910390a3505050565b6008805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b5f6001600160a01b038316620003dc575f80fd5b6016546001600160a01b038481169116146200062d575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200045a919062001107565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200049a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004c0919062001107565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000511573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000537919062001107565b90506001600160a01b038116620005bd576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000594573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005ba919062001107565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b038381169116146200065f57601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b0381161580620006d857506001600160a01b03811630145b80620006f157506018546001600160a01b038281169116145b80620007e957506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000740573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000766919062001107565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620007b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007dd919062001107565b6001600160a01b031614155b620008255760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b038116156200083c57806200083e565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b60058460ff161062000871575f80fd5b6001600160a01b03831630148015906200089357506001600160a01b03831615155b6200089c575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead148015620008c95750805460ff165b8015620008d957505f8160030154115b156200091a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b60448201526064016200081c565b60018101805484516007805462ffffff60501b19811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c015162ffffff60681b1990971665ffffffffffff60501b19909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b015162ffffff60801b1989166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d5162ffffff60981b1990941665ffffffffffff60801b19909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b015162ffffff60b01b198216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b988990048816929091048716900301851690950262ffffff60c81b1990931665ffffffffffff60b01b199091161791909117908190556161a8929004161180159062000b0457506007546161a8600160681b90910462ffffff161180159062000ad457506007546161a8600160801b90910462ffffff1611155b801562000b0457506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000b3d5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b60448201526064016200081c565b600754620186a0600160981b90910462ffffff161180159062000b725750600754620186a0600160b01b90910462ffffff1611155b801562000b915750600754620186a0600160c81b90910462ffffff1611155b62000bd15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b60448201526064016200081c565b8054610100600160a81b0319166101006001600160a01b0386160217815562000c006001820184600362000e6e565b5062000c126002820183600362000e6e565b50805460ff1662000c2957805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000c60949392919062001179565b60405180910390a15050505050565b6080511562000c7c575f80fd5b5f5b600181101562000cb75762000cae82826001811062000ca15762000ca162001136565b6020020151600162000d4d565b60010162000c7e565b5050565b6007805462ffffff60381b191667010000000000000062ffffff84169081029190911790915562000ced575f62000cff565b600954620186a062ffffff8316909102045b600c5560805162000d405760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001620003bd565b50565b620186a091020490565b60155460ff161562000d5d575f80fd5b6001600160a01b0382161580159062000d8157506001600160a01b03821661dead14155b62000d8a575f80fd5b6016546001600160a01b0383811691161480159062000db757506017546001600160a01b03838116911614155b62000e105760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b60648201526084016200081c565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000efb579160200282015f5b8382111562000ec857835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000e84565b801562000ef95782816101000a81549062ffffff021916905560030160208160020104928301926001030262000ec8565b505b5062000f0992915062000f0d565b5090565b5b8082111562000f09575f815560010162000f0e565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000f4c57607f821691505b60208210810362000f6b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000fbc57805f5260205f20601f840160051c8101602085101562000f985750805b601f840160051c820191505b8181101562000fb9575f815560010162000fa4565b50505b505050565b81516001600160401b0381111562000fdd5762000fdd62000f23565b62000ff58162000fee845462000f37565b8462000f71565b602080601f8311600181146200102b575f8415620010135750858301515b5f19600386901b1c1916600185901b17855562001085565b5f85815260208120601f198616915b828110156200105b578886015182559484019460019091019084016200103a565b50858210156200107957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8083546200109c8162000f37565b60018281168015620010b75760018114620010cd57620010fb565b60ff1984168752821515830287019450620010fb565b875f526020805f205f5b85811015620010f25781548a820152908401908201620010d7565b50505082870194505b50929695505050505050565b5f6020828403121562001118575f80fd5b81516001600160a01b03811681146200112f575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b60038110156200117357815162ffffff168452602093840193909101906001016200114d565b50505050565b60ff851681526001600160a01b03841660208201526101008101620011a260408301856200114a565b620011b160a08301846200114a565b95945050505050565b60805160a05161532b620011ea5f395f818161063a015261134d01525f818161360c0152614716015261532b5ff3fe608060405260043610610456575f3560e01c80637700485111610239578063be5e49b211610130578063da88d01a116100b1578063f2fde38b11610083578063f4db96981161006b578063f4db969814610d27578063f59c370814610d44578063f7c3b38f14610d6357005b8063f2fde38b14610ccc578063f3dc4f4814610ceb57005b8063da88d01a14610c41578063dd62ed3e14610c60578063e2745ef214610ca4578063e92871f614610cb857005b8063d1ace71011610102578063d505accf116100ea578063d505accf14610bfa578063d8454a8214610c19578063d89135cd14610c2d57005b8063d1ace71014610b77578063d232c22014610b9657005b8063be5e49b214610b1c578063c77e006d14610b3b578063c78fe0d414610b4f578063cc1776d314610b6357005b80638da5cb5b116101ba5780639c5ef8d71161018c578063a4d8971a11610174578063a4d8971a14610abf578063a5596b4f14610ade578063a9059cbb14610afd57005b80639c5ef8d714610a8c578063a457c2d714610aa057005b80638da5cb5b14610a2957806395101f9014610a4557806395d89b4114610a6457806396ce079514610a7857005b80637ecebe001161020b5780638a8c523c116101f35780638a8c523c146109e25780638bf1acff146109f65780638d8350ca14610a0a57005b80637ecebe001461099a5780638324c3b9146109ce57005b8063770048511461092957806379cc67901461093d5780637b1ab0d21461095c5780637b1ad1d71461097b57005b80633644e5151161034d5780635117cdee116102ce5780636bdb5ad1116102a057806370a082311161028857806370a08231146108c1578063715018a6146108f557806375de14961461090957005b80636bdb5ad1146108815780636f05be97146108a057005b80635117cdee146107e757806354fd4d50146108045780635b90fe66146108315780635f6417581461086257005b80633af32abf1161031f5780633ed8a169116103075780633ed8a1691461079557806342966c68146107b45780634f7041a5146107d357005b80633af32abf1461073f5780633e0c06291461077657005b80633644e515146106d2578063370158ea146106e657806339137f8b1461070c578063395093511461072057005b806318160ddd116103d7578063313ce567116103a957806333d48a7d1161039157806333d48a7d14610683578063351a964d1461069c57806335ed71a8146106b357005b8063313ce56714610627578063326339671461066457005b806318160ddd146105ac578063186488a8146105ca57806323b872dd146105e95780632984207a1461060857005b806307e9652c11610428578063095ea7b311610410578063095ea7b3146105515780630ac769dc146105705780631171bda91461058d57005b806307e9652c14610503578063095233081461052057005b806301b38af51461045f5780630588b1a51461047e578063064a59d0146104b357806306fdde03146104e257005b3661045d57005b005b34801561046a575f80fd5b5061045d610479366004614c6f565b610d84565b348015610489575f80fd5b50600754600160e01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104be575f80fd5b50600854600160381b900463ffffffff1615155b60405190151581526020016104aa565b3480156104ed575f80fd5b506104f6610e1b565b6040516104aa9190614d31565b34801561050e575f80fd5b5060075462010000900460ff166104d2565b34801561052b575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104aa565b34801561055c575f80fd5b506104d261056b366004614d57565b610eab565b34801561057b575f80fd5b50601a546001600160a01b0316610539565b348015610598575f80fd5b5061045d6105a7366004614d81565b610ec1565b3480156105b7575f80fd5b506009545b6040519081526020016104aa565b3480156105d5575f80fd5b5061045d6105e4366004614e64565b61107c565b3480156105f4575f80fd5b506104d2610603366004614d81565b6110e6565b348015610613575f80fd5b5061045d610622366004614eba565b611107565b348015610632575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016104aa565b34801561066f575f80fd5b5061045d61067e366004614edd565b611185565b34801561068e575f80fd5b5060085462ffffff1661049a565b3480156106a7575f80fd5b5060075460ff166104d2565b3480156106be575f80fd5b5061045d6106cd366004614ef6565b61126a565b3480156106dd575f80fd5b50601d546105bc565b3480156106f1575f80fd5b506106fa61133f565b6040516104aa96959493929190614f11565b348015610717575f80fd5b5061045d6114c8565b34801561072b575f80fd5b506104d261073a366004614d57565b611547565b34801561074a575f80fd5b506104d2610759366004614f74565b6001600160a01b03165f9081526003602052604090205460ff1690565b348015610781575f80fd5b5061045d610790366004614d57565b61157b565b3480156107a0575f80fd5b5061045d6107af366004614edd565b6116a0565b3480156107bf575f80fd5b5061045d6107ce366004614f8f565b611775565b3480156107de575f80fd5b5061049a61177f565b3480156107f2575f80fd5b506017546001600160a01b0316610539565b34801561080f575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526104f6565b34801561083c575f80fd5b50600854600160781b900463ffffffff1660405163ffffffff90911681526020016104aa565b34801561086d575f80fd5b5061049a61087c366004614f74565b61178e565b34801561088c575f80fd5b5061045d61089b366004614edd565b611889565b3480156108ab575f80fd5b506108b4611966565b6040516104aa9190614fcd565b3480156108cc575f80fd5b506105bc6108db366004614f74565b6001600160a01b03165f9081526001602052604090205490565b348015610900575f80fd5b5061045d611af7565b348015610914575f80fd5b50600754600160381b900462ffffff1661049a565b348015610934575f80fd5b5061045d611b4a565b348015610948575f80fd5b5061045d610957366004614d57565b611b8b565b348015610967575f80fd5b5061053961097636600461504c565b611ba4565b348015610986575f80fd5b5061045d610995366004614f74565b611c15565b3480156109a5575f80fd5b506105bc6109b4366004614f74565b6001600160a01b03165f908152601e602052604090205490565b3480156109d9575f80fd5b5061045d611c7d565b3480156109ed575f80fd5b5061045d611d02565b348015610a01575f80fd5b5061049a611de2565b348015610a15575f80fd5b5061049a610a24366004614f74565b611de8565b348015610a34575f80fd5b505f546001600160a01b0316610539565b348015610a50575f80fd5b5061049a610a5f366004614f74565b611eb2565b348015610a6f575f80fd5b506104f6611f8e565b348015610a83575f80fd5b506103e861049a565b348015610a97575f80fd5b5061045d611f9d565b348015610aab575f80fd5b506104d2610aba366004614d57565b611fd0565b348015610aca575f80fd5b5061045d610ad9366004614ef6565b612050565b348015610ae9575f80fd5b5061045d610af8366004614ef6565b6120d9565b348015610b08575f80fd5b506104d2610b17366004614d57565b612153565b348015610b27575f80fd5b5061045d610b36366004614f74565b61215f565b348015610b46575f80fd5b5061045d6121de565b348015610b5a575f80fd5b5061045d612261565b348015610b6e575f80fd5b5061049a6122e8565b348015610b82575f80fd5b5061045d610b91366004614ef6565b6122f2565b348015610ba1575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925263010000008304821615156060820152640100000000909204161515608082015260a0016104aa565b348015610c05575f80fd5b5061045d610c14366004615083565b61236d565b348015610c24575f80fd5b50600d546105bc565b348015610c38575f80fd5b50600a546105bc565b348015610c4c575f80fd5b5061045d610c5b366004614edd565b61256d565b348015610c6b575f80fd5b506105bc610c7a36600461504c565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610caf575f80fd5b5061045d61263a565b348015610cc3575f80fd5b5061045d6126ec565b348015610cd7575f80fd5b5061045d610ce6366004614f74565b61276d565b348015610cf6575f80fd5b506104d2610d05366004614f74565b6001600160a01b03165f90815260046020526040902054610100900460ff1690565b348015610d32575f80fd5b506019546001600160a01b0316610539565b348015610d4f575f80fd5b5061045d610d5e3660046150ec565b6127d0565b348015610d6e575f80fd5b50600754640100000000900462ffffff1661049a565b5f546001600160a01b03163314610dd15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610e1457610e0c858583818110610df157610df1615118565b9050602002016020810190610e069190614f74565b8461281e565b600101610dd4565b5050505050565b6060601b8054610e2a9061512c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061512c565b8015610ea15780601f10610e7857610100808354040283529160200191610ea1565b820191905f5260205f20905b815481529060010190602001808311610e8457829003601f168201915b5050505050905090565b5f610eb7338484612939565b5060015b92915050565b5f546001600160a01b03163314610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f71919061515e565b90505f6001600160a01b0385163014610fa757601a546001600160a01b03868116911614610f9f575f610faf565b601454610faf565b601254600f54015b90508282821015610fc05781610fc2565b825b830310156110045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611052573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110769190615175565b50505050565b5f546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156110da575f80fd5b6110768484848461299a565b5f6110f2843384612e81565b6110fd848484612f03565b5060019392505050565b5f546001600160a01b0316331461114f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615611165575f80fd5b6102588163ffffffff161115611179575f80fd5b61118281613555565b50565b5f546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156111e3575f80fd5b60018162ffffff161015801561120057506103e88162ffffff1611155b61123b5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6007805462ffffff60e01b1916600160e01b62ffffff93909316928302179055600954620186a0910204600e55565b5f546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156112c9575f80fd5b8015806112e057506016546001600160a01b031615155b61132c5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610dc8565b6007805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600954604051806040016040528060058152602001640312e302e360dc1b8152508580546113ac9061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d89061512c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b505050505095508480546114369061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546114629061512c565b80156114ad5780601f10611484576101008083540402835291602001916114ad565b820191905f5260205f20905b81548152906001019060200180831161149057829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146115105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610eb791859085905b01612939565b5f546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601854601a5447915f916001600160a01b039081169116146115e5575f6115e9565b6013545b905082828210156115fa57816115fc565b825b8303101561163e5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611689576040519150601f19603f3d011682016040523d82523d5f602084013e61168e565b606091505b505090508061169b575f80fd5b505050565b5f546001600160a01b031633146116e85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60155462010000900460ff16156116fd575f80fd5b62ffffff81161580611728575060648162ffffff16101580156117285750620186a062ffffff821611155b611730575f80fd5b611739816135c1565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6111823382613664565b5f61178933611eb2565b905090565b6007545f9062010000900460ff16156117a857505f919050565b6001600160a01b0382163014806117d657506001600160a01b0382165f9081526003602052604090205460ff165b806117ee57506017546001600160a01b038381169116145b8061180657506016546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611856575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61186e57600754600160801b900462ffffff16610ebb565b600754600160c81b900462ffffff16610ebb565b5f92915050565b5f546001600160a01b031633146118d15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156118e8575f80fd5b60018162ffffff161015801561190557506103e88162ffffff1611155b6119405760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6008805462ffffff191662ffffff929092169182179055600954620186a0910204601155565b60408051600580825260c08201909252606091816020015b611986614b61565b81526020019060019003908161197e5790505090505f5b60058160ff161015611af3576040805160808101825260ff83165f81815260056020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116119fa579050505050918352505060ff83165f9081526005602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611a6e5750505092845250505060ff83165f8181526005602090815260409091206003015492019190915283518491908110611ae057611ae0615118565b602090810291909101015260010161199d565b5090565b5f546001600160a01b03163314611b3f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611b485f6136f8565b565b60075460ff168015611b645750600754610100900460ff16155b8015611b7a57506007546301000000900460ff16155b611b82575f80fd5b611b485f613747565b611b96823383612e81565b611ba08282613664565b5050565b5f80546001600160a01b03163314611bed5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c04575f80fd5b611c0e8383613fec565b9392505050565b5f546001600160a01b03163314611c5d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c74575f80fd5b611182816142cd565b5f546001600160a01b03163314611cc55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b03163314611d4a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611d61575f80fd5b600854600160381b900463ffffffff1615611dbe5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610dc8565b600880546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f611789335b5f6001600160a01b038216301480611e1757506001600160a01b0382165f9081526003602052604090205460ff165b80611e2f57506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611e7f575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611e9e576007546a0100000000000000000000900462ffffff16610ebb565b600754600160981b900462ffffff16610ebb565b6007545f9062010000900460ff1615611ecc57505f919050565b6001600160a01b038216301480611efa57506001600160a01b0382165f9081526003602052604090205460ff165b80611f1257506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611f62575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611f7a57600754600160681b900462ffffff16610ebb565b600754600160b01b900462ffffff16610ebb565b6060601c8054610e2a9061512c565b600754610100900460ff16158015611fbf57506007546301000000900460ff16155b611fc7575f80fd5b611b485f61447a565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156120435760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610dc8565b6110fd3385858403612939565b5f546001600160a01b031633146120985760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff1680156120b25750600754610100900460ff16155b80156120c857506007546301000000900460ff16155b6120d0575f80fd5b61118281613747565b5f546001600160a01b031633146121215760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615612137575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610eb7338484612f03565b5f546001600160a01b031633146121a75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156121bd575f80fd5b6001600160a01b03165f908152600460205260409020805461ff0019169055565b5f546001600160a01b031633146122265760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b031633146122a95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6117893361178e565b5f546001600160a01b0316331461233a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b600754610100900460ff1615801561235c57506007546301000000900460ff16155b612364575f80fd5b6111828161447a565b428410156123bd5760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610dc8565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156124d5573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061250b5750886001600160a01b0316816001600160a01b0316145b6125575760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610dc8565b5050612564878787612939565b50505050505050565b5f546001600160a01b031633146125b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554610100900460ff16156125c9575f80fd5b62ffffff811615806125f4575060648162ffffff16101580156125f45750620186a062ffffff821611155b6125fc575f80fd5b612605816146cd565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b5f546001600160a01b031633146126825760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff16801561269c5750600754610100900460ff16155b6126a4575f80fd5b601254600f54305f9081526001602052604090205491019081106126c6575f80fd5b305f908152600160205260408120546012805493909103909201909155611b4890613747565b5f546001600160a01b031633146127345760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b5f546001600160a01b031633146127b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6001600160a01b0381166127c7575f80fd5b611182816136f8565b5f546001600160a01b031633146128185760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611ba082825b60155460ff161561282d575f80fd5b6001600160a01b0382161580159061285057506001600160a01b03821661dead14155b612858575f80fd5b6016546001600160a01b0383811691161480159061288457506017546001600160a01b03838116911614155b6128db5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610dc8565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106129a9575f80fd5b6001600160a01b03831630148015906129ca57506001600160a01b03831615155b6129d2575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead1480156129fe5750805460ff165b8015612a0d57505f8160030154115b15612a5a5760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610dc8565b6001810180548451600780546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a89290041611801590612ce957506007546161a8600160681b90910462ffffff1611801590612cba57506007546161a8600160801b90910462ffffff1611155b8015612ce957506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b612d355760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610dc8565b600754620186a0600160981b90910462ffffff1611801590612d695750600754620186a0600160b01b90910462ffffff1611155b8015612d875750600754620186a0600160c81b90910462ffffff1611155b612dd35760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610dc8565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612e1760018201846003614b9c565b50612e2760028201836003614b9c565b50805460ff16612e3d57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612e729493929190615190565b60405180910390a15050505050565b6001600160a01b038381165f9081526002602090815260408083209386168352929052205481811015612ef65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610dc8565b6110768484848403612939565b61deac196001600160a01b03831601612f1a575f80fd5b6007546301000000900460ff16158015612f3c5750600754610100900460ff16155b8015612f6f57506017546001600160a01b03848116911614801590612f6f57506016546001600160a01b03848116911614155b15612f8657612f7d5f613747565b612f865f61447a565b5f81118015612fad57506001600160a01b0383165f9081526003602052604090205460ff16155b8015612fd157506001600160a01b0382165f9081526003602052604090205460ff16155b8015612fe657506001600160a01b0383163014155b8015612ffb57506001600160a01b0382163014155b801561301557506016546001600160a01b03838116911614155b1561354a576017546001600160a01b0384811691161480159061304657506017546001600160a01b03838116911614155b8061308f57506017546001600160a01b038481169116148061307557506017546001600160a01b038381169116145b801561308f5750600854600160381b900463ffffffff1615155b6130db5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610dc8565b600b5415806130ec5750600b548111155b6131385760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610dc8565b600c54158061314f57506001600160a01b03821630145b8061317e57506017546001600160a01b038381169116148061317e57506016546001600160a01b038381169116145b806131a45750600c546001600160a01b0383165f90815260016020526040902054820111155b6131f05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610dc8565b60075462010000900460ff1615801561321357506007546301000000900460ff16155b80156132275750600754610100900460ff16155b1561354a576017545f9081906001600160a01b038681169116148061325957506017546001600160a01b038581169116145b15613280576017546001600160a01b0386811691161461327a57600261327d565b60015b90505b5f8160ff166001146132925785613294565b845b60085490915063ffffffff428116600160781b83048216600160381b90930482169290920116108015906132e557506001600160a01b0381165f90815260046020526040902054610100900460ff16155b1561330f576001600160a01b0381165f908152600460205260409020805461ff0019166101001790555b5f5b60058160ff161015613531575f808460ff161161339c576001600160a01b0383165f90815260046020526040902054610100900460ff166133825760ff82165f908152600560205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613464565b60ff82165f90815260056020526040812060020190613362565b8360ff16600114613402576001600160a01b0383165f90815260046020526040902054610100900460ff166133e65760ff82165f9081526005602052604090206001016002613362565b60ff82165f908152600560205260409020600290810190613362565b6001600160a01b0383165f90815260046020526040902054610100900460ff166134425760ff82165f908152600560205260409020600190810190613362565b60ff82165f908152600560205260409020600201546301000000900462ffffff165b62ffffff169050805f036134785750613529565b620186a08682020461348b89308361476e565b60175460ff84165f908152600560205260409020546001600160a01b03918216610100909104909116036134c6576012805482019055613522565b60ff83165f9081526005602052604090205461deac196101009091046001600160a01b0316016134ff576134fa3082613664565b613522565b60ff83165f908152600560205260409020600301805482019055600f8054820190555b9490940193505b600101613311565b50821561354657600d80548401905592829003925b5050505b61169b83838361476e565b600880547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba919060200161176a565b6007805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556135f1575f613607565b6136076009548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000006111825760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200161176a565b61366e82826148ab565b60075461368790640100000000900462ffffff166146cd565b60075461369f90600160381b900462ffffff166135c1565b6007805462ffffff60e01b198116600160e01b9182900462ffffff1691820217909155600954620186a0910204600e556008805462ffffff811662ffffff199091168117909155600954620186a0910204601155611ba0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007805461ff001981166101001790915560ff1615613fde5780806137e6575060115460026012548161377c5761377c6151cd565b601854601a5492909104916001600160a01b0390811691161461379f575f6137a3565b600f545b01101580156137e65750601254601854601a546001600160a01b039081169116146137ce575f6137d2565b600f545b305f90815260016020526040902054910111155b15613bc8575f6002601254816137fe576137fe6151cd565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061383a5761383a615118565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061386b5761386b615118565b6001600160a01b039283166020918202929092010152601654601854601a546138ad933093811692889282169116146138a4575f611575565b600f5401612939565b601654601854601a546001600160a01b039283169263791ac94792879282169116146138d9575f6138dd565b600f545b015f8430426001016040518663ffffffff1660e01b81526004016139059594939291906151e1565b5f604051808303815f87803b15801561391c575f80fd5b505af192505050801561392d575060015b61394e576016546139499030906001600160a01b03165f612939565b613bc4565b600880546effffffff000000000000000000000019166b01000000000000000000000063ffffffff421602179055601254156139a057600260125f82825481613999576139996151cd565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b039182169116146139e7575f6139eb565b600f545b60408051929091018252602082018490520160405180910390a18015613bc257601854601a5482916001600160a01b03908116911603613a9c57613a7f82600f54871015613a5657600f548701620186a0880281613a4b57613a4b6151cd565b04620186a091020490565b600f5487810190620186a00281613a6f57613a6f6151cd565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f85118015613aaa57505f81115b15613bc057601654613ac79030906001600160a01b031687612939565b60165460195460405163f305d71960e01b8152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613b56575060408051601f3d908101601f19168201909252613b5391810190615252565b60015b613b7757601654613b729030906001600160a01b03165f612939565b613bc0565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080613c275750601a546001600160a01b03163014801590613bfb5750601854601a546001600160a01b03908116911614155b8015613c0b5750601154600f5410155b8015613c275750600f54305f9081526001602052604090205410155b15613fde57601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613c72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c96919061515e565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613ccf57613ccf615118565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613d0057613d00615118565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110613d3157613d31615118565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015613d92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613db69190615175565b50601654600f54604051635c11d79560e01b81526001600160a01b0390921691635c11d79591613df3915f908690309042600101906004016151e1565b5f604051808303815f87803b158015613e0a575f80fd5b505af1925050508015613e1b575060015b613e9a57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015613e70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e949190615175565b50613fdb565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015613f06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2a919061515e565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fce919061515e565b6014805491840390910190555b50505b506007805461ff0019169055565b5f6001600160a01b038316613fff575f80fd5b6016546001600160a01b03848116911614614242575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614055573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614079919061527d565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140dc919061527d565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801561412c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614150919061527d565b90506001600160a01b0381166141d2576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af11580156141ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cf919061527d565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461427357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806142eb57506001600160a01b03811630145b8061430357506018546001600160a01b038281169116145b806143f457506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015614350573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614374919061527d565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156143c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143e8919061527d565b6001600160a01b031614155b6144405760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610dc8565b6001600160a01b038116156144555780614457565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6007805463ff00000019166301000000179055806145b757601a546001600160a01b0316301480156144d35750600f5415806144c55750600f54305f90815260016020526040902054105b806144d35750600e54600f54105b6146bd57601854601a546001600160a01b03908116911614801561450257506013541580614502575047601354105b6146bd57601a546001600160a01b031630148015906145325750601854601a546001600160a01b03908116911614155b80156145b2575060145415806145b25750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614589573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ad919061515e565b601454105b6146bd575b5f805b60058160ff1610156146695760ff81165f90815260056020526040902080546003909101546101009091046001600160a01b03169080158061460657506001600160a01b03821661dead145b8061461e57506017546001600160a01b038381169116145b1561462a575050614661565b5f6146358383614976565b905080156146595760ff84165f908152600560205260409020600301805482900390555b939093019250505b6001016145ba565b506008805466ffffffff0000001916630100000063ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506007805463ff00000019169055565b6007805466ffffff00000000191664010000000062ffffff8416908102919091179091556146fb575f614711565b6147116009548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000006111825760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b6001600160a01b0383161580159061478e57506001600160a01b03821615155b6147da5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610dc8565b6001600160a01b0383165f908152600160205260409020548111156148335760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b8015614866576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161298d91815260200190565b6001600160a01b0382165f908152600160205260409020548111156149045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b6001600160a01b0382165f818152600160205260409081902080548490039055600980548490039055600a8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061496a9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036149b35761499730848461476e565b81600f5f8282546149a891906152ac565b90915550614b5b9050565b6010545f906149c4846103e86152bf565b6149cf9060646152bf565b6149d991906152d6565b601854601a549192505f916001600160a01b03918216911603614a985750601354620186a08282020490811115614a14575f92505050610ebb565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614a62576040519150601f19603f3d011682016040523d82523d5f602084013e614a67565b606091505b5050905080614a7b575f9350505050610ebb565b8160135f828254614a8c91906152ac565b90915550614b42915050565b50601454620186a08282020490841115614ab6575f92505050610ebb565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015614b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b2a9190615175565b508060145f828254614b3c91906152ac565b90915550505b8360105f828254614b5391906152ac565b909155505050505b50919050565b60405180608001604052805f6001600160a01b03168152602001614b83614c30565b8152602001614b90614c30565b81526020015f81525090565b600183019183908215614c24579160200282015f5b83821115614bf357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614bb1565b8015614c225782816101000a81549062ffffff0219169055600301602081600201049283019260010302614bf3565b505b50611af3929150614c4e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611af3575f8155600101614c4f565b8015158114611182575f80fd5b5f805f60408486031215614c81575f80fd5b833567ffffffffffffffff80821115614c98575f80fd5b818601915086601f830112614cab575f80fd5b813581811115614cb9575f80fd5b8760208260051b8501011115614ccd575f80fd5b60209283019550935050840135614ce381614c62565b809150509250925092565b5f81518084525f5b81811015614d1257602081850181015186830182015201614cf6565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611c0e6020830184614cee565b6001600160a01b0381168114611182575f80fd5b5f8060408385031215614d68575f80fd5b8235614d7381614d43565b946020939093013593505050565b5f805f60608486031215614d93575f80fd5b8335614d9e81614d43565b92506020840135614dae81614d43565b929592945050506040919091013590565b803560ff81168114614dcf575f80fd5b919050565b803562ffffff81168114614dcf575f80fd5b5f82601f830112614df5575f80fd5b6040516060810181811067ffffffffffffffff82111715614e2457634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115614e38575f80fd5b845b81811015614e5957614e4b81614dd4565b835260209283019201614e3a565b509195945050505050565b5f805f806101008587031215614e78575f80fd5b614e8185614dbf565b93506020850135614e9181614d43565b9250614ea08660408701614de6565b9150614eaf8660a08701614de6565b905092959194509250565b5f60208284031215614eca575f80fd5b813563ffffffff81168114611c0e575f80fd5b5f60208284031215614eed575f80fd5b611c0e82614dd4565b5f60208284031215614f06575f80fd5b8135611c0e81614c62565b60c081525f614f2360c0830189614cee565b8281036020840152614f358189614cee565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a0840152614f678185614cee565b9998505050505050505050565b5f60208284031215614f84575f80fd5b8135611c0e81614d43565b5f60208284031215614f9f575f80fd5b5035919050565b805f5b600381101561107657815162ffffff16845260209384019390910190600101614fa9565b602080825282518282018190525f919060409081850190868401855b8281101561503f5781516001600160a01b0381511685528681015161501088870182614fa6565b50858101516150226080870182614fa6565b506060015160e08501526101009093019290850190600101614fe9565b5091979650505050505050565b5f806040838503121561505d575f80fd5b823561506881614d43565b9150602083013561507881614d43565b809150509250929050565b5f805f805f805f60e0888a031215615099575f80fd5b87356150a481614d43565b965060208801356150b481614d43565b955060408801359450606088013593506150d060808901614dbf565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156150fd575f80fd5b823561510881614d43565b9150602083013561507881614c62565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061514057607f821691505b602082108103614b5b57634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561516e575f80fd5b5051919050565b5f60208284031215615185575f80fd5b8151611c0e81614c62565b60ff851681526001600160a01b038416602082015261010081016151b76040830185614fa6565b6151c460a0830184614fa6565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156152315784516001600160a01b03168352938301939183019160010161520c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615264575f80fd5b8351925060208401519150604084015190509250925092565b5f6020828403121561528d575f80fd5b8151611c0e81614d43565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ebb57610ebb615298565b8082028115828204841417610ebb57610ebb615298565b5f826152f057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220434678f03537ff0032b8deb3ae7d526cb363b3f599538213ca6f2a5c0fde092364736f6c634300081700330000000000000000000000007ba33149136a20e1f3342b6c719d0a1102abe856
Deployed Bytecode
0x608060405260043610610456575f3560e01c80637700485111610239578063be5e49b211610130578063da88d01a116100b1578063f2fde38b11610083578063f4db96981161006b578063f4db969814610d27578063f59c370814610d44578063f7c3b38f14610d6357005b8063f2fde38b14610ccc578063f3dc4f4814610ceb57005b8063da88d01a14610c41578063dd62ed3e14610c60578063e2745ef214610ca4578063e92871f614610cb857005b8063d1ace71011610102578063d505accf116100ea578063d505accf14610bfa578063d8454a8214610c19578063d89135cd14610c2d57005b8063d1ace71014610b77578063d232c22014610b9657005b8063be5e49b214610b1c578063c77e006d14610b3b578063c78fe0d414610b4f578063cc1776d314610b6357005b80638da5cb5b116101ba5780639c5ef8d71161018c578063a4d8971a11610174578063a4d8971a14610abf578063a5596b4f14610ade578063a9059cbb14610afd57005b80639c5ef8d714610a8c578063a457c2d714610aa057005b80638da5cb5b14610a2957806395101f9014610a4557806395d89b4114610a6457806396ce079514610a7857005b80637ecebe001161020b5780638a8c523c116101f35780638a8c523c146109e25780638bf1acff146109f65780638d8350ca14610a0a57005b80637ecebe001461099a5780638324c3b9146109ce57005b8063770048511461092957806379cc67901461093d5780637b1ab0d21461095c5780637b1ad1d71461097b57005b80633644e5151161034d5780635117cdee116102ce5780636bdb5ad1116102a057806370a082311161028857806370a08231146108c1578063715018a6146108f557806375de14961461090957005b80636bdb5ad1146108815780636f05be97146108a057005b80635117cdee146107e757806354fd4d50146108045780635b90fe66146108315780635f6417581461086257005b80633af32abf1161031f5780633ed8a169116103075780633ed8a1691461079557806342966c68146107b45780634f7041a5146107d357005b80633af32abf1461073f5780633e0c06291461077657005b80633644e515146106d2578063370158ea146106e657806339137f8b1461070c578063395093511461072057005b806318160ddd116103d7578063313ce567116103a957806333d48a7d1161039157806333d48a7d14610683578063351a964d1461069c57806335ed71a8146106b357005b8063313ce56714610627578063326339671461066457005b806318160ddd146105ac578063186488a8146105ca57806323b872dd146105e95780632984207a1461060857005b806307e9652c11610428578063095ea7b311610410578063095ea7b3146105515780630ac769dc146105705780631171bda91461058d57005b806307e9652c14610503578063095233081461052057005b806301b38af51461045f5780630588b1a51461047e578063064a59d0146104b357806306fdde03146104e257005b3661045d57005b005b34801561046a575f80fd5b5061045d610479366004614c6f565b610d84565b348015610489575f80fd5b50600754600160e01b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b3480156104be575f80fd5b50600854600160381b900463ffffffff1615155b60405190151581526020016104aa565b3480156104ed575f80fd5b506104f6610e1b565b6040516104aa9190614d31565b34801561050e575f80fd5b5060075462010000900460ff166104d2565b34801561052b575f80fd5b506016546001600160a01b03165b6040516001600160a01b0390911681526020016104aa565b34801561055c575f80fd5b506104d261056b366004614d57565b610eab565b34801561057b575f80fd5b50601a546001600160a01b0316610539565b348015610598575f80fd5b5061045d6105a7366004614d81565b610ec1565b3480156105b7575f80fd5b506009545b6040519081526020016104aa565b3480156105d5575f80fd5b5061045d6105e4366004614e64565b61107c565b3480156105f4575f80fd5b506104d2610603366004614d81565b6110e6565b348015610613575f80fd5b5061045d610622366004614eba565b611107565b348015610632575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016104aa565b34801561066f575f80fd5b5061045d61067e366004614edd565b611185565b34801561068e575f80fd5b5060085462ffffff1661049a565b3480156106a7575f80fd5b5060075460ff166104d2565b3480156106be575f80fd5b5061045d6106cd366004614ef6565b61126a565b3480156106dd575f80fd5b50601d546105bc565b3480156106f1575f80fd5b506106fa61133f565b6040516104aa96959493929190614f11565b348015610717575f80fd5b5061045d6114c8565b34801561072b575f80fd5b506104d261073a366004614d57565b611547565b34801561074a575f80fd5b506104d2610759366004614f74565b6001600160a01b03165f9081526003602052604090205460ff1690565b348015610781575f80fd5b5061045d610790366004614d57565b61157b565b3480156107a0575f80fd5b5061045d6107af366004614edd565b6116a0565b3480156107bf575f80fd5b5061045d6107ce366004614f8f565b611775565b3480156107de575f80fd5b5061049a61177f565b3480156107f2575f80fd5b506017546001600160a01b0316610539565b34801561080f575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526104f6565b34801561083c575f80fd5b50600854600160781b900463ffffffff1660405163ffffffff90911681526020016104aa565b34801561086d575f80fd5b5061049a61087c366004614f74565b61178e565b34801561088c575f80fd5b5061045d61089b366004614edd565b611889565b3480156108ab575f80fd5b506108b4611966565b6040516104aa9190614fcd565b3480156108cc575f80fd5b506105bc6108db366004614f74565b6001600160a01b03165f9081526001602052604090205490565b348015610900575f80fd5b5061045d611af7565b348015610914575f80fd5b50600754600160381b900462ffffff1661049a565b348015610934575f80fd5b5061045d611b4a565b348015610948575f80fd5b5061045d610957366004614d57565b611b8b565b348015610967575f80fd5b5061053961097636600461504c565b611ba4565b348015610986575f80fd5b5061045d610995366004614f74565b611c15565b3480156109a5575f80fd5b506105bc6109b4366004614f74565b6001600160a01b03165f908152601e602052604090205490565b3480156109d9575f80fd5b5061045d611c7d565b3480156109ed575f80fd5b5061045d611d02565b348015610a01575f80fd5b5061049a611de2565b348015610a15575f80fd5b5061049a610a24366004614f74565b611de8565b348015610a34575f80fd5b505f546001600160a01b0316610539565b348015610a50575f80fd5b5061049a610a5f366004614f74565b611eb2565b348015610a6f575f80fd5b506104f6611f8e565b348015610a83575f80fd5b506103e861049a565b348015610a97575f80fd5b5061045d611f9d565b348015610aab575f80fd5b506104d2610aba366004614d57565b611fd0565b348015610aca575f80fd5b5061045d610ad9366004614ef6565b612050565b348015610ae9575f80fd5b5061045d610af8366004614ef6565b6120d9565b348015610b08575f80fd5b506104d2610b17366004614d57565b612153565b348015610b27575f80fd5b5061045d610b36366004614f74565b61215f565b348015610b46575f80fd5b5061045d6121de565b348015610b5a575f80fd5b5061045d612261565b348015610b6e575f80fd5b5061049a6122e8565b348015610b82575f80fd5b5061045d610b91366004614ef6565b6122f2565b348015610ba1575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925263010000008304821615156060820152640100000000909204161515608082015260a0016104aa565b348015610c05575f80fd5b5061045d610c14366004615083565b61236d565b348015610c24575f80fd5b50600d546105bc565b348015610c38575f80fd5b50600a546105bc565b348015610c4c575f80fd5b5061045d610c5b366004614edd565b61256d565b348015610c6b575f80fd5b506105bc610c7a36600461504c565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b348015610caf575f80fd5b5061045d61263a565b348015610cc3575f80fd5b5061045d6126ec565b348015610cd7575f80fd5b5061045d610ce6366004614f74565b61276d565b348015610cf6575f80fd5b506104d2610d05366004614f74565b6001600160a01b03165f90815260046020526040902054610100900460ff1690565b348015610d32575f80fd5b506019546001600160a01b0316610539565b348015610d4f575f80fd5b5061045d610d5e3660046150ec565b6127d0565b348015610d6e575f80fd5b50600754640100000000900462ffffff1661049a565b5f546001600160a01b03163314610dd15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610e1457610e0c858583818110610df157610df1615118565b9050602002016020810190610e069190614f74565b8461281e565b600101610dd4565b5050505050565b6060601b8054610e2a9061512c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e569061512c565b8015610ea15780601f10610e7857610100808354040283529160200191610ea1565b820191905f5260205f20905b815481529060010190602001808311610e8457829003601f168201915b5050505050905090565b5f610eb7338484612939565b5060015b92915050565b5f546001600160a01b03163314610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610f4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f71919061515e565b90505f6001600160a01b0385163014610fa757601a546001600160a01b03868116911614610f9f575f610faf565b601454610faf565b601254600f54015b90508282821015610fc05781610fc2565b825b830310156110045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611052573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110769190615175565b50505050565b5f546001600160a01b031633146110c45760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156110da575f80fd5b6110768484848461299a565b5f6110f2843384612e81565b6110fd848484612f03565b5060019392505050565b5f546001600160a01b0316331461114f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615611165575f80fd5b6102588163ffffffff161115611179575f80fd5b61118281613555565b50565b5f546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156111e3575f80fd5b60018162ffffff161015801561120057506103e88162ffffff1611155b61123b5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6007805462ffffff60e01b1916600160e01b62ffffff93909316928302179055600954620186a0910204600e55565b5f546001600160a01b031633146112b25760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156112c9575f80fd5b8015806112e057506016546001600160a01b031615155b61132c5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610dc8565b6007805460ff1916911515919091179055565b6060805f805f6060601b601c7f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600954604051806040016040528060058152602001640312e302e360dc1b8152508580546113ac9061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546113d89061512c565b80156114235780601f106113fa57610100808354040283529160200191611423565b820191905f5260205f20905b81548152906001019060200180831161140657829003601f168201915b505050505095508480546114369061512c565b80601f01602080910402602001604051908101604052809291908181526020018280546114629061512c565b80156114ad5780601f10611484576101008083540402835291602001916114ad565b820191905f5260205f20905b81548152906001019060200180831161149057829003601f168201915b50505050509450955095509550955095509550909192939495565b5f546001600160a01b031633146115105760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526002602090815260408083206001600160a01b03871684529091528120549091610eb791859085905b01612939565b5f546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601854601a5447915f916001600160a01b039081169116146115e5575f6115e9565b6013545b905082828210156115fa57816115fc565b825b8303101561163e5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611689576040519150601f19603f3d011682016040523d82523d5f602084013e61168e565b606091505b505090508061169b575f80fd5b505050565b5f546001600160a01b031633146116e85760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60155462010000900460ff16156116fd575f80fd5b62ffffff81161580611728575060648162ffffff16101580156117285750620186a062ffffff821611155b611730575f80fd5b611739816135c1565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6111823382613664565b5f61178933611eb2565b905090565b6007545f9062010000900460ff16156117a857505f919050565b6001600160a01b0382163014806117d657506001600160a01b0382165f9081526003602052604090205460ff165b806117ee57506017546001600160a01b038381169116145b8061180657506016546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611856575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b61186e57600754600160801b900462ffffff16610ebb565b600754600160c81b900462ffffff16610ebb565b5f92915050565b5f546001600160a01b031633146118d15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff16156118e8575f80fd5b60018162ffffff161015801561190557506103e88162ffffff1611155b6119405760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610dc8565b6008805462ffffff191662ffffff929092169182179055600954620186a0910204601155565b60408051600580825260c08201909252606091816020015b611986614b61565b81526020019060019003908161197e5790505090505f5b60058160ff161015611af3576040805160808101825260ff83165f81815260056020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116119fa579050505050918352505060ff83165f9081526005602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611a6e5750505092845250505060ff83165f8181526005602090815260409091206003015492019190915283518491908110611ae057611ae0615118565b602090810291909101015260010161199d565b5090565b5f546001600160a01b03163314611b3f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611b485f6136f8565b565b60075460ff168015611b645750600754610100900460ff16155b8015611b7a57506007546301000000900460ff16155b611b82575f80fd5b611b485f613747565b611b96823383612e81565b611ba08282613664565b5050565b5f80546001600160a01b03163314611bed5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c04575f80fd5b611c0e8383613fec565b9392505050565b5f546001600160a01b03163314611c5d5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611c74575f80fd5b611182816142cd565b5f546001600160a01b03163314611cc55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b03163314611d4a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554640100000000900460ff1615611d61575f80fd5b600854600160381b900463ffffffff1615611dbe5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610dc8565b600880546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f611789335b5f6001600160a01b038216301480611e1757506001600160a01b0382165f9081526003602052604090205460ff165b80611e2f57506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611e7f575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611e9e576007546a0100000000000000000000900462ffffff16610ebb565b600754600160981b900462ffffff16610ebb565b6007545f9062010000900460ff1615611ecc57505f919050565b6001600160a01b038216301480611efa57506001600160a01b0382165f9081526003602052604090205460ff165b80611f1257506017546001600160a01b038381169116145b611882576001600160a01b0382165f90815260046020526040902054610100900460ff1680611f62575060085463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611f7a57600754600160681b900462ffffff16610ebb565b600754600160b01b900462ffffff16610ebb565b6060601c8054610e2a9061512c565b600754610100900460ff16158015611fbf57506007546301000000900460ff16155b611fc7575f80fd5b611b485f61447a565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156120435760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610dc8565b6110fd3385858403612939565b5f546001600160a01b031633146120985760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff1680156120b25750600754610100900460ff16155b80156120c857506007546301000000900460ff16155b6120d0575f80fd5b61118281613747565b5f546001600160a01b031633146121215760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff1615612137575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610eb7338484612f03565b5f546001600160a01b031633146121a75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015546301000000900460ff16156121bd575f80fd5b6001600160a01b03165f908152600460205260409020805461ff0019169055565b5f546001600160a01b031633146122265760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b5f546001600160a01b031633146122a95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6117893361178e565b5f546001600160a01b0316331461233a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b600754610100900460ff1615801561235c57506007546301000000900460ff16155b612364575f80fd5b6111828161447a565b428410156123bd5760405162461bcd60e51b815260206004820152601160248201527f45787069726564207369676e61747572650000000000000000000000000000006044820152606401610dc8565b601d546001600160a01b038881165f818152601e602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa1580156124d5573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381161580159061250b5750886001600160a01b0316816001600160a01b0316145b6125575760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610dc8565b5050612564878787612939565b50505050505050565b5f546001600160a01b031633146125b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b601554610100900460ff16156125c9575f80fd5b62ffffff811615806125f4575060648162ffffff16101580156125f45750620186a062ffffff821611155b6125fc575f80fd5b612605816146cd565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b5f546001600160a01b031633146126825760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b60075460ff16801561269c5750600754610100900460ff16155b6126a4575f80fd5b601254600f54305f9081526001602052604090205491019081106126c6575f80fd5b305f908152600160205260408120546012805493909103909201909155611b4890613747565b5f546001600160a01b031633146127345760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b5f546001600160a01b031633146127b55760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b6001600160a01b0381166127c7575f80fd5b611182816136f8565b5f546001600160a01b031633146128185760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610dc8565b611ba082825b60155460ff161561282d575f80fd5b6001600160a01b0382161580159061285057506001600160a01b03821661dead14155b612858575f80fd5b6016546001600160a01b0383811691161480159061288457506017546001600160a01b03838116911614155b6128db5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610dc8565b6001600160a01b0382165f81815260036020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff16106129a9575f80fd5b6001600160a01b03831630148015906129ca57506001600160a01b03831615155b6129d2575f80fd5b60ff84165f9081526005602052604090206001600160a01b03841661dead1480156129fe5750805460ff165b8015612a0d57505f8160030154115b15612a5a5760405162461bcd60e51b815260206004820152600f60248201527f556e636c61696d656420746178657300000000000000000000000000000000006044820152606401610dc8565b6001810180548451600780546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a89290041611801590612ce957506007546161a8600160681b90910462ffffff1611801590612cba57506007546161a8600160801b90910462ffffff1611155b8015612ce957506007546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b612d355760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610dc8565b600754620186a0600160981b90910462ffffff1611801590612d695750600754620186a0600160b01b90910462ffffff1611155b8015612d875750600754620186a0600160c81b90910462ffffff1611155b612dd35760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610dc8565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b03861602178155612e1760018201846003614b9c565b50612e2760028201836003614b9c565b50805460ff16612e3d57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612e729493929190615190565b60405180910390a15050505050565b6001600160a01b038381165f9081526002602090815260408083209386168352929052205481811015612ef65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610dc8565b6110768484848403612939565b61deac196001600160a01b03831601612f1a575f80fd5b6007546301000000900460ff16158015612f3c5750600754610100900460ff16155b8015612f6f57506017546001600160a01b03848116911614801590612f6f57506016546001600160a01b03848116911614155b15612f8657612f7d5f613747565b612f865f61447a565b5f81118015612fad57506001600160a01b0383165f9081526003602052604090205460ff16155b8015612fd157506001600160a01b0382165f9081526003602052604090205460ff16155b8015612fe657506001600160a01b0383163014155b8015612ffb57506001600160a01b0382163014155b801561301557506016546001600160a01b03838116911614155b1561354a576017546001600160a01b0384811691161480159061304657506017546001600160a01b03838116911614155b8061308f57506017546001600160a01b038481169116148061307557506017546001600160a01b038381169116145b801561308f5750600854600160381b900463ffffffff1615155b6130db5760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610dc8565b600b5415806130ec5750600b548111155b6131385760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610dc8565b600c54158061314f57506001600160a01b03821630145b8061317e57506017546001600160a01b038381169116148061317e57506016546001600160a01b038381169116145b806131a45750600c546001600160a01b0383165f90815260016020526040902054820111155b6131f05760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610dc8565b60075462010000900460ff1615801561321357506007546301000000900460ff16155b80156132275750600754610100900460ff16155b1561354a576017545f9081906001600160a01b038681169116148061325957506017546001600160a01b038581169116145b15613280576017546001600160a01b0386811691161461327a57600261327d565b60015b90505b5f8160ff166001146132925785613294565b845b60085490915063ffffffff428116600160781b83048216600160381b90930482169290920116108015906132e557506001600160a01b0381165f90815260046020526040902054610100900460ff16155b1561330f576001600160a01b0381165f908152600460205260409020805461ff0019166101001790555b5f5b60058160ff161015613531575f808460ff161161339c576001600160a01b0383165f90815260046020526040902054610100900460ff166133825760ff82165f908152600560205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613464565b60ff82165f90815260056020526040812060020190613362565b8360ff16600114613402576001600160a01b0383165f90815260046020526040902054610100900460ff166133e65760ff82165f9081526005602052604090206001016002613362565b60ff82165f908152600560205260409020600290810190613362565b6001600160a01b0383165f90815260046020526040902054610100900460ff166134425760ff82165f908152600560205260409020600190810190613362565b60ff82165f908152600560205260409020600201546301000000900462ffffff165b62ffffff169050805f036134785750613529565b620186a08682020461348b89308361476e565b60175460ff84165f908152600560205260409020546001600160a01b03918216610100909104909116036134c6576012805482019055613522565b60ff83165f9081526005602052604090205461deac196101009091046001600160a01b0316016134ff576134fa3082613664565b613522565b60ff83165f908152600560205260409020600301805482019055600f8054820190555b9490940193505b600101613311565b50821561354657600d80548401905592829003925b5050505b61169b83838361476e565b600880547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba919060200161176a565b6007805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556135f1575f613607565b6136076009548262ffffff16620186a091020490565b600c557f00000000000000000000000000000000000000000000000000000000000000016111825760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200161176a565b61366e82826148ab565b60075461368790640100000000900462ffffff166146cd565b60075461369f90600160381b900462ffffff166135c1565b6007805462ffffff60e01b198116600160e01b9182900462ffffff1691820217909155600954620186a0910204600e556008805462ffffff811662ffffff199091168117909155600954620186a0910204601155611ba0565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007805461ff001981166101001790915560ff1615613fde5780806137e6575060115460026012548161377c5761377c6151cd565b601854601a5492909104916001600160a01b0390811691161461379f575f6137a3565b600f545b01101580156137e65750601254601854601a546001600160a01b039081169116146137ce575f6137d2565b600f545b305f90815260016020526040902054910111155b15613bc8575f6002601254816137fe576137fe6151cd565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f8151811061383a5761383a615118565b6001600160a01b03928316602091820292909201015260185482519116908290600190811061386b5761386b615118565b6001600160a01b039283166020918202929092010152601654601854601a546138ad933093811692889282169116146138a4575f611575565b600f5401612939565b601654601854601a546001600160a01b039283169263791ac94792879282169116146138d9575f6138dd565b600f545b015f8430426001016040518663ffffffff1660e01b81526004016139059594939291906151e1565b5f604051808303815f87803b15801561391c575f80fd5b505af192505050801561392d575060015b61394e576016546139499030906001600160a01b03165f612939565b613bc4565b600880546effffffff000000000000000000000019166b01000000000000000000000063ffffffff421602179055601254156139a057600260125f82825481613999576139996151cd565b0490915550505b601854601a5447849003917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e149186916001600160a01b039182169116146139e7575f6139eb565b600f545b60408051929091018252602082018490520160405180910390a18015613bc257601854601a5482916001600160a01b03908116911603613a9c57613a7f82600f54871015613a5657600f548701620186a0880281613a4b57613a4b6151cd565b04620186a091020490565b600f5487810190620186a00281613a6f57613a6f6151cd565b04620186a003620186a091020490565b600f80546010805490910190555f90556013805482850301905590505b5f85118015613aaa57505f81115b15613bc057601654613ac79030906001600160a01b031687612939565b60165460195460405163f305d71960e01b8152306004820152602481018890525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613b56575060408051601f3d908101601f19168201909252613b5391810190615252565b60015b613b7757601654613b729030906001600160a01b03165f612939565b613bc0565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f601255505b505b505b5050505b8080613c275750601a546001600160a01b03163014801590613bfb5750601854601a546001600160a01b03908116911614155b8015613c0b5750601154600f5410155b8015613c275750600f54305f9081526001602052604090205410155b15613fde57601a546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015613c72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c96919061515e565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f81518110613ccf57613ccf615118565b6001600160a01b039283166020918202929092010152601854825191169082906001908110613d0057613d00615118565b6001600160a01b039283166020918202929092010152601a54825191169082906002908110613d3157613d31615118565b6001600160a01b039283166020918202929092010152601a54601654600f5460405163095ea7b360e01b81529184166004830152602482015291169063095ea7b3906044016020604051808303815f875af1158015613d92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613db69190615175565b50601654600f54604051635c11d79560e01b81526001600160a01b0390921691635c11d79591613df3915f908690309042600101906004016151e1565b5f604051808303815f87803b158015613e0a575f80fd5b505af1925050508015613e1b575060015b613e9a57601a5460165460405163095ea7b360e01b81526001600160a01b0391821660048201525f602482015291169063095ea7b3906044016020604051808303815f875af1158015613e70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e949190615175565b50613fdb565b601a54600f546040516370a0823160e01b81523060048201527f95725684d8aa29bbc5031270724c91e6e8bee7732f11ee91ed9b3d93929e99e5926001600160a01b0316919082906370a0823190602401602060405180830381865afa158015613f06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2a919061515e565b604080516001600160a01b039094168452602084019290925285039082015260600160405180910390a1600f80546010805490910190555f9055601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fce919061515e565b6014805491840390910190555b50505b506007805461ff0019169055565b5f6001600160a01b038316613fff575f80fd5b6016546001600160a01b03848116911614614242575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015614055573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614079919061527d565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140dc919061527d565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801561412c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614150919061527d565b90506001600160a01b0381166141d2576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af11580156141ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cf919061527d565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601680546001600160a01b03199081169094179055601780548416909417909355601880548316909117905560198054909116909117905550505b6019546001600160a01b0383811691161461427357601980546001600160a01b0319166001600160a01b0384161790555b6017546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a3506017546001600160a01b031692915050565b6001600160a01b03811615806142eb57506001600160a01b03811630145b8061430357506018546001600160a01b038281169116145b806143f457506016546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015614350573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614374919061527d565b60185460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156143c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143e8919061527d565b6001600160a01b031614155b6144405760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610dc8565b6001600160a01b038116156144555780614457565b305b601a80546001600160a01b0319166001600160a01b039290921691909117905550565b6007805463ff00000019166301000000179055806145b757601a546001600160a01b0316301480156144d35750600f5415806144c55750600f54305f90815260016020526040902054105b806144d35750600e54600f54105b6146bd57601854601a546001600160a01b03908116911614801561450257506013541580614502575047601354105b6146bd57601a546001600160a01b031630148015906145325750601854601a546001600160a01b03908116911614155b80156145b2575060145415806145b25750601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015614589573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ad919061515e565b601454105b6146bd575b5f805b60058160ff1610156146695760ff81165f90815260056020526040902080546003909101546101009091046001600160a01b03169080158061460657506001600160a01b03821661dead145b8061461e57506017546001600160a01b038381169116145b1561462a575050614661565b5f6146358383614976565b905080156146595760ff84165f908152600560205260409020600301805482900390555b939093019250505b6001016145ba565b506008805466ffffffff0000001916630100000063ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506007805463ff00000019169055565b6007805466ffffff00000000191664010000000062ffffff8416908102919091179091556146fb575f614711565b6147116009548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000016111825760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda1959060200161176a565b6001600160a01b0383161580159061478e57506001600160a01b03821615155b6147da5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610dc8565b6001600160a01b0383165f908152600160205260409020548111156148335760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b8015614866576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161298d91815260200190565b6001600160a01b0382165f908152600160205260409020548111156149045760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610dc8565b6001600160a01b0382165f818152600160205260409081902080548490039055600980548490039055600a8054840190555161dead91907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061496a9085815260200190565b60405180910390a35050565b601a545f90306001600160a01b03909116036149b35761499730848461476e565b81600f5f8282546149a891906152ac565b90915550614b5b9050565b6010545f906149c4846103e86152bf565b6149cf9060646152bf565b6149d991906152d6565b601854601a549192505f916001600160a01b03918216911603614a985750601354620186a08282020490811115614a14575f92505050610ebb565b5f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614a62576040519150601f19603f3d011682016040523d82523d5f602084013e614a67565b606091505b5050905080614a7b575f9350505050610ebb565b8160135f828254614a8c91906152ac565b90915550614b42915050565b50601454620186a08282020490841115614ab6575f92505050610ebb565b601a5460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015614b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b2a9190615175565b508060145f828254614b3c91906152ac565b90915550505b8360105f828254614b5391906152ac565b909155505050505b50919050565b60405180608001604052805f6001600160a01b03168152602001614b83614c30565b8152602001614b90614c30565b81526020015f81525090565b600183019183908215614c24579160200282015f5b83821115614bf357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614bb1565b8015614c225782816101000a81549062ffffff0219169055600301602081600201049283019260010302614bf3565b505b50611af3929150614c4e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611af3575f8155600101614c4f565b8015158114611182575f80fd5b5f805f60408486031215614c81575f80fd5b833567ffffffffffffffff80821115614c98575f80fd5b818601915086601f830112614cab575f80fd5b813581811115614cb9575f80fd5b8760208260051b8501011115614ccd575f80fd5b60209283019550935050840135614ce381614c62565b809150509250925092565b5f81518084525f5b81811015614d1257602081850181015186830182015201614cf6565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f611c0e6020830184614cee565b6001600160a01b0381168114611182575f80fd5b5f8060408385031215614d68575f80fd5b8235614d7381614d43565b946020939093013593505050565b5f805f60608486031215614d93575f80fd5b8335614d9e81614d43565b92506020840135614dae81614d43565b929592945050506040919091013590565b803560ff81168114614dcf575f80fd5b919050565b803562ffffff81168114614dcf575f80fd5b5f82601f830112614df5575f80fd5b6040516060810181811067ffffffffffffffff82111715614e2457634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115614e38575f80fd5b845b81811015614e5957614e4b81614dd4565b835260209283019201614e3a565b509195945050505050565b5f805f806101008587031215614e78575f80fd5b614e8185614dbf565b93506020850135614e9181614d43565b9250614ea08660408701614de6565b9150614eaf8660a08701614de6565b905092959194509250565b5f60208284031215614eca575f80fd5b813563ffffffff81168114611c0e575f80fd5b5f60208284031215614eed575f80fd5b611c0e82614dd4565b5f60208284031215614f06575f80fd5b8135611c0e81614c62565b60c081525f614f2360c0830189614cee565b8281036020840152614f358189614cee565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a0840152614f678185614cee565b9998505050505050505050565b5f60208284031215614f84575f80fd5b8135611c0e81614d43565b5f60208284031215614f9f575f80fd5b5035919050565b805f5b600381101561107657815162ffffff16845260209384019390910190600101614fa9565b602080825282518282018190525f919060409081850190868401855b8281101561503f5781516001600160a01b0381511685528681015161501088870182614fa6565b50858101516150226080870182614fa6565b506060015160e08501526101009093019290850190600101614fe9565b5091979650505050505050565b5f806040838503121561505d575f80fd5b823561506881614d43565b9150602083013561507881614d43565b809150509250929050565b5f805f805f805f60e0888a031215615099575f80fd5b87356150a481614d43565b965060208801356150b481614d43565b955060408801359450606088013593506150d060808901614dbf565b925060a0880135915060c0880135905092959891949750929550565b5f80604083850312156150fd575f80fd5b823561510881614d43565b9150602083013561507881614c62565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061514057607f821691505b602082108103614b5b57634e487b7160e01b5f52602260045260245ffd5b5f6020828403121561516e575f80fd5b5051919050565b5f60208284031215615185575f80fd5b8151611c0e81614c62565b60ff851681526001600160a01b038416602082015261010081016151b76040830185614fa6565b6151c460a0830184614fa6565b95945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156152315784516001600160a01b03168352938301939183019160010161520c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215615264575f80fd5b8351925060208401519150604084015190509250925092565b5f6020828403121561528d575f80fd5b8151611c0e81614d43565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ebb57610ebb615298565b8082028115828204841417610ebb57610ebb615298565b5f826152f057634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220434678f03537ff0032b8deb3ae7d526cb363b3f599538213ca6f2a5c0fde092364736f6c63430008170033
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.