ERC-20
Source Code
Overview
Max Total Supply
55,000,000 MEGA
Holders
7
Transfers
-
0
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
ChainFactory_ERC20
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
/*
MEGAToken
Become a holder of MEGAToken. Official currency of the future MEGA Wallet.
Web: https://megatoken.tech/
X: https://twitter.com/MEGATokenApp
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";
import "./CF_Pausable.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";
import "./CF_HolderList.sol";
contract ChainFactory_ERC20 is CF_Ownable, CF_Common, CF_ERC20, CF_Pausable, CF_Taxable, CF_DEXRouterV2, CF_HolderList {
constructor() {
_name = unicode"MEGAToken";
_symbol = unicode"MEGA";
_decimals = 18;
_totalSupply = 55000000000000000000000000; // 55,000,000 MEGA
_transferOwnership(0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00);
_transferInitialSupply(0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00, 100000); // 100%
_setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00);
_swapEnabled = true;
_setMinSwapPercent(500); // 0.5% of totalSupply
_setMinTaxDistributionPercent(500); // 0.5% of totalSupply
_setTaxBeneficiary(0, 0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00, [ uint24(500), uint24(1000), uint24(10000) ]);
_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;
_holder[address(this)].exists = true;
_holders.push(address(this));
}
function _transfer(address from, address to, uint256 amount) internal virtual override {
require(!_paused, "Paused");
if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
_autoSwap(false);
_autoTaxDistribute(false);
}
if (amount > 0 && from != _owner && to != _owner && 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 {
if (!_suspendTaxes && !_distributing && !_swapping) {
uint256 appliedTax;
uint8 taxType;
if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; }
for (uint8 i; i < 5; i++) {
uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? _taxBeneficiary[i].percent[1] : _taxBeneficiary[i].percent[2]) : _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 {
_taxBeneficiary[i].unclaimed += taxAmount;
_amountForTaxDistribution += taxAmount;
}
appliedTax += taxAmount;
}
if (appliedTax > 0) {
_totalTaxCollected += appliedTax;
amount -= appliedTax;
}
}
}
}
super._transfer(from, to, amount);
if (amount > 0 && !_holder[to].exists) {
_holder[to].exists = true;
_holders.push(to);
}
}
function _transferInitialSupply(address account, uint24 percent) private {
require(!_initialized);
uint256 amount = _percentage(_totalSupply, uint256(percent));
_balance[account] = amount;
_holder[account].exists = true;
_holders.push(account);
emit Transfer(address(0), account, amount);
}
/// @notice Returns a list specifying the renounce status of each feature
function renounced() external view returns (bool Pausable, bool Taxable, bool DEXRouterV2) {
return (_renounced.Pausable, _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";
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 => holderAccount) internal _holder;
mapping(uint8 => taxBeneficiary) internal _taxBeneficiary;
address[] internal _holders;
bool internal _swapEnabled;
bool internal _swapping;
bool internal _paused;
bool internal _suspendTaxes;
bool internal _distributing;
bool internal immutable _initialized;
uint8 internal immutable _decimals;
uint24 internal constant _denominator = 1000;
uint24 internal _totalTxTax;
uint24 internal _totalBuyTax;
uint24 internal _totalSellTax;
uint24 internal _minTaxDistributionPercent;
uint24 internal _minSwapPercent;
uint32 internal _lastTaxDistribution;
uint32 internal _tradingEnabled;
uint32 internal _lastSwap;
uint256 internal _totalSupply;
uint256 internal _totalTaxCollected;
uint256 internal _minTaxDistributionAmount;
uint256 internal _amountForTaxDistribution;
uint256 internal _minSwapAmount;
uint256 internal _amountForLiquidity;
struct Renounced {
bool Pausable;
bool Taxable;
bool DEXRouterV2;
}
struct holderAccount {
bool exists;
}
struct taxBeneficiary {
bool exists;
address account;
uint24[3] percent; // 0: tx, 1: buy, 2: sell
uint256 unclaimed;
}
struct DEXRouterV2 {
address router;
address pair;
address WETH;
address receiver;
}
Renounced internal _renounced;
DEXRouterV2 internal _dex;
function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) {
unchecked {
return (amount * bps) / (100 * uint256(_denominator));
}
}
function _timestamp() internal view returns (uint32) {
unchecked {
return uint32(block.timestamp % 2**32);
}
}
function denominator() external pure returns (uint24) {
return _denominator;
}
function version() external pure returns (string memory) {
return _version;
}
}// SPDX-License-Identifier: MIT
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_Pausable is CF_Ownable, CF_Common {
event Paused(bool status);
event RenouncedPausable();
/// @notice Permanently renounce and prevent the owner from being able to pause the Smart-Contract
/// @dev Existing settings will continue to be effective
function renouncePausable() external onlyOwner {
_renounced.Pausable = true;
emit RenouncedPausable();
}
/// @notice Check if the Smart-Contract is paused
function isPaused() external view returns (bool) {
return _paused;
}
function pause(bool status) external onlyOwner {
require(!_renounced.Pausable);
require(_paused != status);
_paused = status;
emit Paused(status);
}
}// 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);
event TaxDistributed(uint256 amount);
event RenouncedTaxable();
struct taxBeneficiaryView {
address account;
uint24[3] percent;
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) || from == _dex.pair ? 0 : _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) || from == _dex.pair ? 0 : _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) || to == _owner || to == _dex.pair || to == _dex.router ? 0 : _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
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].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
function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent) external onlyOwner {
require(!_renounced.Taxable);
_setTaxBeneficiary(slot, account, percent);
}
function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent) internal {
require(slot < 5);
require(account != address(this) && account != address(0xdEaD) && account != address(0));
taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];
unchecked {
_totalTxTax += percent[0] - _taxBeneficiary.percent[0];
_totalBuyTax += percent[1] - _taxBeneficiary.percent[1];
_totalSellTax += percent[2] - _taxBeneficiary.percent[2];
require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax");
}
_taxBeneficiary.account = account;
_taxBeneficiary.percent = percent;
if (!_taxBeneficiary.exists) { _taxBeneficiary.exists = true; }
emit SetTaxBeneficiary(slot, account, percent);
}
/// @notice Triggers the tax distribution
/// @dev Will only be executed if there is no ongoing 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 (_amountForTaxDistribution == 0 || _balance[address(this)] < _amountForTaxDistribution || _amountForTaxDistribution < _minTaxDistributionAmount) { return; }
}
unchecked {
uint256 distributed;
for (uint8 i; i < 5; i++) {
address account = _taxBeneficiary[i].account;
uint256 unclaimed = _taxBeneficiary[i].unclaimed;
if (unclaimed == 0 || 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) {
super._transfer(address(this), account, unclaimed);
_amountForTaxDistribution -= unclaimed;
return unclaimed;
}
/// @notice Suspend or reinstate tax collection
/// @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
/// @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));
}
}// 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 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
/// @param force Ignore the min. threshold amount
function autoSwap(bool force) external onlyOwner {
require(_swapEnabled && !_swapping);
_autoSwap(force);
}
function _autoSwap(bool force) internal lockSwapping {
if (!_swapEnabled) { return; }
unchecked {
if (force || (_amountForLiquidity / 2 >= _minSwapAmount && _balance[address(this)] >= _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, tokenAmountForLiquidity);
try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmountForLiquidity, 0, pathToSwapExactTokensForETH, address(this), block.timestamp + 1) {
_lastSwap = _timestamp();
if (_amountForLiquidity > 0) { _amountForLiquidity /= 2; }
uint256 ethAmount = address(this).balance - ethBalance;
emit SwappedTokensForETH(tokenAmountForLiquidity, ethAmount);
if (ethAmount > 0) {
if (tokenAmountForLiquidity > 0 && ethAmount > 0) {
_approve(address(this), _dex.router, tokenAmountForLiquidity);
try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethAmount }(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);
}
}
}
}
/// @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 unless using the pause method
function enableTrading() external onlyOwner {
require(!_renounced.DEXRouterV2);
require(_tradingEnabled == 0, "Already enabled");
_tradingEnabled = _timestamp();
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.23;
import "./CF_Common.sol";
abstract contract CF_HolderList is CF_Common {
struct Holder {
address account;
uint256 balance;
}
/// @notice Total number of holders
function totalHolders() public view returns (uint256 total) {
unchecked {
uint256 cnt = _holders.length;
for (uint256 i; i < cnt; i++) {
address account = _holders[i];
if (account == address(0) || _balance[account] == 0) { continue; }
++total;
}
}
}
/// @notice Retrieves a list of wallets and their balance, paginated
/// @param offset How many rows to skip over
/// @param limit How many rows to return, at most
/// @return holders Rows matching your criteria
/// @return total Total number of holders
function getHolders(uint256 offset, uint256 limit) public view returns (Holder[] memory, uint256 total) {
total = totalHolders();
require(limit >= offset && offset <= total, "Invalid range");
unchecked {
uint256 rows = (limit - offset) + 1;
if (rows > total - offset) { rows = total - offset; }
require(rows > 0, "Out of range");
Holder[] memory holders = new Holder[](rows);
uint256 cnt = _holders.length;
uint256 s;
uint256 h;
for (uint256 i; i < cnt; i++) {
address account = _holders[i];
if (account == address(0) || _balance[account] == 0) { continue; }
if (s++ < offset) { continue; }
holders[h] = Holder(account, _balance[account]);
if (++h >= rows) { break; }
}
return (holders, total);
}
}
/// @notice Retrieves the full list of wallets and their balance
/// @dev Use the paginated version of this function if the output exceeds the return limit
function getHolders() external view returns (Holder[] memory, uint256 total) {
total = totalHolders();
return getHolders(0, total);
}
}// 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);
}{
"evmVersion": "shanghai",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"optimizer": {
"enabled": true,
"runs": 200
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedPausable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","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":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","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"},{"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":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","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":[],"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":"getHolders","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct CF_HolderList.Holder[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getHolders","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct CF_HolderList.Holder[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","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":[],"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":"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":"bool","name":"status","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","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":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePausable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Pausable","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":"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":"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]"}],"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":"totalHolders","outputs":[{"internalType":"uint256","name":"total","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"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801562000010575f80fd5b5060408051808201909152600981526826a2a3a0aa37b5b2b760b91b602082015260129062000040908262000a5b565b506040805180820190915260048152634d45474160e01b60208201526013906200006b908262000a5b565b50601260a0526a2d7eb3f96e070d970000006007556200009f73fcf91df83e05823b50c6d7549077a7e2894fdd006200027b565b620000c273fcf91df83e05823b50c6d7549077a7e2894fdd00620186a0620002ca565b620000f6737a250d5630b4cf539739df2c5dacb4c659f2488d73fcf91df83e05823b50c6d7549077a7e2894fdd0062000388565b5060068054600754620186a06101f491820204600b81905560ff65ffffffffffff60701b01199092167201f40001f4000000000000000000000000000117909255600955604080516060810182529182526103e860208301526127109082015262000179905f9073fcf91df83e05823b50c6d7549077a7e2894fdd009062000679565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6012604051620001ab919062000b27565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060145560016080819052305f8181526003909452918320805460ff1916821790556005805491820181559092525f8051602062003eeb83398151915290910180546001600160a01b031916909117905562000c25565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805115620002d7575f80fd5b5f620002f16007548362ffffff16620008fe60201b60201c565b6001600160a01b0384165f81815260016020818152604080842086905560038252808420805460ff19168417905560058054938401815584525f8051602062003eeb83398151915290920180546001600160a01b031916851790559051848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b0383166200039c575f80fd5b600e546001600160a01b03848116911614620005ed575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200041a919062000ba1565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200045a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000480919062000ba1565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015620004d1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004f7919062000ba1565b90506001600160a01b0381166200057d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200057a919062000ba1565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b038381169116146200061f57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b60058360ff161062000689575f80fd5b6001600160a01b0382163014801590620006ae57506001600160a01b03821661dead14155b8015620006c357506001600160a01b03821615155b620006cc575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805462ffffff60281b19811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b015162ffffff60401b1990951665ffffffffffff60281b1990931692909217630100000090980485169093036801000000000000000091829004851601841602959095178086559254958701516b01000000000000000000000080850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906200083957506006546161a86801000000000000000090910462ffffff1611801590620007fc57506006546161a86b01000000000000000000000090910462ffffff1611155b80156200083957506006546161a868010000000000000000820462ffffff9081166b01000000000000000000000090930481169290920190911611155b620008755760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640160405180910390fd5b8054610100600160a81b0319166101006001600160a01b03851602178155620008a46001820183600362000908565b50805460ff16620008bb57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051620008f09392919062000bd0565b60405180910390a150505050565b620186a091020490565b60018301918390821562000995579160200282015f5b838211156200096257835183826101000a81548162ffffff021916908362ffffff16021790555092602001926003016020816002010492830192600103026200091e565b8015620009935782816101000a81549062ffffff021916905560030160208160020104928301926001030262000962565b505b50620009a3929150620009a7565b5090565b5b80821115620009a3575f8155600101620009a8565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620009e657607f821691505b60208210810362000a0557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000a5657805f5260205f20601f840160051c8101602085101562000a325750805b601f840160051c820191505b8181101562000a53575f815560010162000a3e565b50505b505050565b81516001600160401b0381111562000a775762000a77620009bd565b62000a8f8162000a888454620009d1565b8462000a0b565b602080601f83116001811462000ac5575f841562000aad5750858301515b5f19600386901b1c1916600185901b17855562000b1f565b5f85815260208120601f198616915b8281101562000af55788860151825594840194600190910190840162000ad4565b508582101562000b1357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f80835462000b3681620009d1565b6001828116801562000b51576001811462000b675762000b95565b60ff198416875282151583028701945062000b95565b875f526020805f205f5b8581101562000b8c5781548a82015290840190820162000b71565b50505082870194505b50929695505050505050565b5f6020828403121562000bb2575f80fd5b81516001600160a01b038116811462000bc9575f80fd5b9392505050565b60ff841681526001600160a01b03831660208083019190915260a082019060408301845f5b600381101562000c1957815162ffffff168352918301919083019060010162000bf5565b50505050949350505050565b60805160a0516132a062000c4b5f395f81816104a50152610d3901525f50506132a05ff3fe608060405260043610610326575f3560e01c8063715018a6116101ad578063a9059cbb116100ea578063d505accf1161008e578063dd62ed3e1161006b578063dd62ed3e1461097c578063e2745ef21461099b578063f2fde38b146109af578063f4db9698146109ce57005b8063d505accf1461092a578063d551160914610949578063d8454a821461096857005b8063c78fe0d4116100c7578063c78fe0d4146108a1578063cc1776d3146108b5578063d1ace710146108c9578063d232c220146108e857005b8063a9059cbb14610846578063b187bd2614610865578063b56980711461088257005b80638da5cb5b1161015157806396ce07951161012e57806396ce0795146107d5578063a457c2d7146107e9578063a4d8971a14610808578063a5596b4f1461082757005b80638da5cb5b1461078657806395101f90146107a257806395d89b41146107c157005b80638324c3b91161018a5780638324c3b91461072b5780638a8c523c1461073f5780638bf1acff146107535780638d8350ca1461076757005b8063715018a6146106c45780637b1ab0d2146106d85780637ecebe00146106f757005b8063351a964d1161027b57806353d74fdf1161021f5780635fe8e7cc116101fc5780635fe8e7cc1461062e5780636bdb5ad1146106505780636f05be971461066f57806370a082311461069057005b806353d74fdf146105ce57806354fd4d50146105e25780635f6417581461060f57005b8063370158ea11610258578063370158ea14610558578063395093511461057e5780634f7041a51461059d5780635117cdee146105b157005b8063351a964d1461050e57806335ed71a8146105255780633644e5151461054457005b8063095ea7b3116102e257806323b872dd116102bf57806323b872dd14610473578063313ce5671461049257806332633967146104cf57806333d48a7d146104ee57005b8063095ea7b31461042257806315ad87221461044157806318160ddd1461045557005b806302329a291461032f5780630588b1a51461034e578063064a59d01461038357806306fdde03146103b257806307e9652c146103d357806309523308146103f157005b3661032d57005b005b34801561033a575f80fd5b5061032d610349366004612cc5565b6109eb565b348015610359575f80fd5b50600654600160701b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b34801561038e575f80fd5b50600654600160c01b900463ffffffff1615155b604051901515815260200161037a565b3480156103bd575f80fd5b506103c6610aa0565b60405161037a9190612d27565b3480156103de575f80fd5b506006546301000000900460ff166103a2565b3480156103fc575f80fd5b50600e546001600160a01b03165b6040516001600160a01b03909116815260200161037a565b34801561042d575f80fd5b506103a261043c366004612d4d565b610b30565b34801561044c575f80fd5b5061032d610b46565b348015610460575f80fd5b506007545b60405190815260200161037a565b34801561047e575f80fd5b506103a261048d366004612d77565b610ba6565b34801561049d575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037a565b3480156104da575f80fd5b5061032d6104e9366004612dcc565b610bc7565b3480156104f9575f80fd5b50600654600160881b900462ffffff1661036a565b348015610519575f80fd5b5060065460ff166103a2565b348015610530575f80fd5b5061032d61053f366004612cc5565b610c8e565b34801561054f575f80fd5b50601454610465565b348015610563575f80fd5b5061056c610d2b565b60405161037a96959493929190612de5565b348015610589575f80fd5b506103a2610598366004612d4d565b610eb4565b3480156105a8575f80fd5b5061036a610ecb565b3480156105bc575f80fd5b50600f546001600160a01b031661040a565b3480156105d9575f80fd5b50610465610eda565b3480156105ed575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526103c6565b34801561061a575f80fd5b5061036a610629366004612e49565b610f55565b348015610639575f80fd5b50610642610fe2565b60405161037a929190612e64565b34801561065b575f80fd5b5061032d61066a366004612dcc565b611001565b34801561067a575f80fd5b506106836110c6565b60405161037a9190612eec565b34801561069b575f80fd5b506104656106aa366004612e49565b6001600160a01b03165f9081526001602052604090205490565b3480156106cf575f80fd5b5061032d6111e3565b3480156106e3575f80fd5b5061040a6106f2366004612f57565b611217565b348015610702575f80fd5b50610465610711366004612e49565b6001600160a01b03165f9081526015602052604090205490565b348015610736575f80fd5b5061032d611267565b34801561074a575f80fd5b5061032d6112c9565b34801561075e575f80fd5b5061036a611376565b348015610772575f80fd5b5061036a610781366004612e49565b61137c565b348015610791575f80fd5b505f546001600160a01b031661040a565b3480156107ad575f80fd5b5061036a6107bc366004612e49565b6113bb565b3480156107cc575f80fd5b506103c6611412565b3480156107e0575f80fd5b506103e861036a565b3480156107f4575f80fd5b506103a2610803366004612d4d565b611421565b348015610813575f80fd5b5061032d610822366004612cc5565b611481565b348015610832575f80fd5b5061032d610841366004612cc5565b6114d5565b348015610851575f80fd5b506103a2610860366004612d4d565b611530565b348015610870575f80fd5b5060065462010000900460ff166103a2565b34801561088d575f80fd5b5061064261089c366004612f8e565b61153c565b3480156108ac575f80fd5b5061032d611739565b3480156108c0575f80fd5b5061036a61179d565b3480156108d4575f80fd5b5061032d6108e3366004612cc5565b6117a7565b3480156108f3575f80fd5b50600d546040805160ff8084161515825261010084048116151560208301526201000090930490921615159082015260600161037a565b348015610935575f80fd5b5061032d610944366004612fbe565b611804565b348015610954575f80fd5b5061032d61096336600461303b565b6119ec565b348015610973575f80fd5b50600854610465565b348015610987575f80fd5b50610465610996366004612f57565b611a39565b3480156109a6575f80fd5b5061032d611a63565b3480156109ba575f80fd5b5061032d6109c9366004612e49565b611af6565b3480156109d9575f80fd5b506011546001600160a01b031661040a565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b8152600401610a14906130e0565b60405180910390fd5b600d5460ff1615610a2c575f80fd5b801515600660029054906101000a900460ff16151503610a4a575f80fd5b60068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd290610a9590831515815260200190565b60405180910390a150565b606060128054610aaf90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610adb90613106565b8015610b265780601f10610afd57610100808354040283529160200191610b26565b820191905f5260205f20905b815481529060010190602001808311610b0957829003601f168201915b5050505050905090565b5f610b3c338484611b3a565b5060015b92915050565b5f546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610a14906130e0565b600d805460ff191660011790556040517fbac59158523e697197ebd95013205b34c0b416747a935fb50262c337e26ce59a905f90a1565b5f610bb2843384611b9b565b610bbd848484611c04565b5060019392505050565b5f546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615610c04575f80fd5b60018162ffffff1610158015610c2157506103e88162ffffff1611155b610c5c5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60701b1916600160701b62ffffff93909316928302179055600754620186a0910204600955565b50565b5f546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615610ccc575f80fd5b801580610ce35750600e546001600160a01b031615155b610d185760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610a14565b6006805460ff1916911515919091179055565b6060805f805f6060601260137f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600754604051806040016040528060058152602001640312e302e360dc1b815250858054610d9890613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490613106565b8015610e0f5780601f10610de657610100808354040283529160200191610e0f565b820191905f5260205f20905b815481529060010190602001808311610df257829003601f168201915b50505050509550848054610e2290613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e90613106565b8015610e995780601f10610e7057610100808354040283529160200191610e99565b820191905f5260205f20905b815481529060010190602001808311610e7c57829003601f168201915b50505050509450955095509550955095509550909192939495565b5f610b3c338484610ec53388611a39565b01611b3a565b5f610ed5336113bb565b905090565b6005545f90815b81811015610f50575f60058281548110610efd57610efd61313e565b5f918252602090912001546001600160a01b03169050801580610f3557506001600160a01b0381165f90815260016020526040902054155b15610f405750610f48565b836001019350505b600101610ee1565b505090565b6006545f906301000000900460ff1615610f7057505f919050565b6001600160a01b038216301480610f9357505f546001600160a01b038381169116145b80610fab5750600f546001600160a01b038381169116145b80610fc35750600e546001600160a01b038381169116145b610fdb57600654600160581b900462ffffff16610b40565b5f92915050565b60605f610fed610eda565b9050610ff95f8261153c565b915091509091565b5f546001600160a01b0316331461102a5760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff161561103f575f80fd5b60018162ffffff161015801561105c57506103e88162ffffff1611155b6110975760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60881b1916600160881b62ffffff93909316928302179055600754620186a0910204600b55565b60408051600580825260c08201909252606091816020015b6110e6612bd1565b8152602001906001900390816110de5790505090505f5b60058160ff1610156111df57604080516060808201835260ff84165f81815260046020818152868320805461010090046001600160a01b031687529383529081528551938401958690529394938501936001909201916003918390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161115a5750505092845250505060ff83165f81815260046020908152604090912060020154920191909152835184919081106111cc576111cc61313e565b60209081029190910101526001016110fd565b5090565b5f546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610a14906130e0565b6112155f612058565b565b5f80546001600160a01b031633146112415760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611256575f80fd5b61126083836120a7565b9392505050565b5f546001600160a01b031633146112905760405162461bcd60e51b8152600401610a14906130e0565b600d805461ff0019166101001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b031633146112f25760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611307575f80fd5b600654600160c01b900463ffffffff16156113565760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a14565b6006805463ffffffff60c01b19164263ffffffff16600160c01b02179055565b5f610ed5335b5f6001600160a01b0382163014806113a15750600f546001600160a01b038381169116145b610fdb5760065465010000000000900462ffffff16610b40565b6006545f906301000000900460ff16156113d657505f919050565b6001600160a01b0382163014806113fa5750600f546001600160a01b038381169116145b610fdb57600654600160401b900462ffffff16610b40565b606060138054610aaf90613106565b5f8061142d3385611a39565b9050828110156114745760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610a14565b610bbd3385858403611b3a565b5f546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff1680156114c45750600654610100900460ff16155b6114cc575f80fd5b610c8b81612388565b5f546001600160a01b031633146114fe5760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611512575f80fd5b6006805491151563010000000263ff00000019909216919091179055565b5f610b3c338484611c04565b60605f611547610eda565b90508383101580156115595750808411155b6115955760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b6044820152606401610a14565b6001848403018482038111156115aa57508381035b5f81116115e85760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662072616e676560a01b6044820152606401610a14565b5f8167ffffffffffffffff81111561160257611602613027565b60405190808252806020026020018201604052801561164657816020015b604080518082019091525f80825260208201528152602001906001900390816116205790505b506005549091505f80805b8381101561172a575f6005828154811061166d5761166d61313e565b5f918252602090912001546001600160a01b031690508015806116a557506001600160a01b0381165f90815260016020526040902054155b156116b05750611722565b60018401938b11156116c25750611722565b6040805180820182526001600160a01b0383168082525f90815260016020908152929020549181019190915286518790859081106117025761170261313e565b6020026020010181905250868360010193508310611720575061172a565b505b600101611651565b50929550505050509250929050565b5f546001600160a01b031633146117625760405162461bcd60e51b8152600401610a14906130e0565b600d805462ff00001916620100001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f610ed533610f55565b5f546001600160a01b031633146117d05760405162461bcd60e51b8152600401610a14906130e0565b600654610100900460ff161580156117f35750600654640100000000900460ff16155b6117fb575f80fd5b610c8b816126c8565b428410156118485760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610a14565b6014546001600160a01b038881165f8181526015602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611960573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119965750886001600160a01b0316816001600160a01b0316145b6119d65760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610a14565b50506119e3878787611b3a565b50505050505050565b5f546001600160a01b03163314611a155760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611a29575f80fd5b611a34838383612815565b505050565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314611a8c5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff168015611aa65750600654610100900460ff16155b611aae575f80fd5b600c54600a54305f908152600160205260409020549101908110611ad0575f80fd5b305f90815260016020526040812054600c80549390910390920190915561121590612388565b5f546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610a14906130e0565b6001600160a01b038116611b31575f80fd5b610c8b81612058565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f611ba68484611a39565b905081811015611bf15760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610a14565b611bfe8484848403611b3a565b50505050565b60065462010000900460ff1615611c465760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a14565b600654640100000000900460ff16158015611c695750600654610100900460ff16155b8015611c9c5750600f546001600160a01b03848116911614801590611c9c5750600e546001600160a01b03848116911614155b15611cb357611caa5f612388565b611cb35f6126c8565b5f81118015611ccf57505f546001600160a01b03848116911614155b8015611ce857505f546001600160a01b03838116911614155b8015611cfd57506001600160a01b0383163014155b8015611d1257506001600160a01b0382163014155b8015611d2c5750600e546001600160a01b03838116911614155b15611fba57600f546001600160a01b03848116911614801590611d5d5750600f546001600160a01b03838116911614155b80611da65750600f546001600160a01b0384811691161480611d8c5750600f546001600160a01b038381169116145b8015611da65750600654600160c01b900463ffffffff1615155b611de55760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610a14565b6006546301000000900460ff16158015611e0a5750600654640100000000900460ff16155b8015611e1e5750600654610100900460ff16155b15611fba57600f545f9081906001600160a01b0386811691161480611e505750600f546001600160a01b038581169116145b15611e7757600f546001600160a01b03868116911614611e71576002611e74565b60015b90505b5f5b60058160ff161015611fa2575f808360ff1611611ec65760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16611f0e565b8260ff16600114611eec5760ff82165f9081526004602052604090206001016002611ea6565b60ff82165f908152600460205260409020600101546301000000900462ffffff165b62ffffff169050805f03611f225750611f9a565b620186a085820204611f35883083612a6b565b600f5460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603611f7057600c805482019055611f93565b60ff83165f908152600460205260409020600201805482019055600a8054820190555b9390930192505b600101611e79565b508115611fb757600880548301905591819003915b50505b611fc5838383612a6b565b5f81118015611fec57506001600160a01b0382165f9081526003602052604090205460ff16155b15611a3457506001600160a01b03165f818152600360205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916909117905550565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166120ba575f80fd5b600e546001600160a01b038481169116146122fd575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121349190613152565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613152565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156121e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220b9190613152565b90506001600160a01b03811661228d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015612266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190613152565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b0383811691161461232e57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b6006805461ff001981166101001790915560ff16156126ba5780806123dc5750600b546002600c54816123bd576123bd61316d565b04101580156123dc5750600c54305f9081526001602052604090205410155b156126ba575f6002600c54816123f4576123f461316d565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f815181106124305761243061313e565b6001600160a01b0392831660209182029290920101526010548251911690829060019081106124615761246161313e565b6001600160a01b039283166020918202929092010152600e546124879130911685611b3a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124c29086905f90869030904260010190600401613181565b5f604051808303815f87803b1580156124d9575f80fd5b505af19250505080156124ea575060015b61250b57600e546125069030906001600160a01b03165f611b3a565b6126b6565b600680546001600160e01b0316600160e01b63ffffffff421602179055600c541561254c576002600c5f828254816125455761254561316d565b0490915550505b604080518481524784900360208201819052917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e14910160405180910390a180156126b4575f8411801561259e57505f81115b156126b457600e546125bb9030906001600160a01b031686611b3a565b600e5460115460405163f305d71960e01b8152306004820152602481018790525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561264a575060408051601f3d908101601f19168201909252612647918101906131f2565b60015b61266b57600e546126669030906001600160a01b03165f611b3a565b6126b4565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f600c55505b505b5050505b506006805461ff0019169055565b6006805464ff0000000019166401000000001790558061271357600a5415806127005750600a54305f90815260016020526040902054105b8061270e5750600954600a54105b612804575b5f805b60058160ff1610156127b05760ff81165f90815260046020526040902080546002909101546101009091046001600160a01b0316908015806127655750600f546001600160a01b038381169116145b156127715750506127a8565b5f61277c8383612ba8565b905080156127a05760ff84165f908152600460205260409020600201805482900390555b939093019250505b600101612716565b506006805463ffffffff60a01b1916600160a01b63ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506006805464ff0000000019169055565b60058360ff1610612824575f80fd5b6001600160a01b038216301480159061284857506001600160a01b03821661dead14155b801561285c57506001600160a01b03821615155b612864575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805467ffffff000000000019811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b01516affffff0000000000000000199095166affffffffffff0000000000199093169290921763010000009098048516909303600160401b9182900485160184160295909517808655925495870151600160581b80850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906129b057506006546161a8600160401b90910462ffffff161180159061298157506006546161a8600160581b90910462ffffff1611155b80156129b057506006546161a8600160401b820462ffffff908116600160581b90930481169290920190911611155b6129e75760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610a14565b8054610100600160a81b0319166101006001600160a01b03851602178155612a1460018201836003612bff565b50805460ff16612a2a57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051612a5d9392919061321d565b60405180910390a150505050565b6001600160a01b03831615801590612a8b57506001600160a01b03821615155b612ad75760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610a14565b6001600160a01b0383165f90815260016020526040902054811115612b305760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610a14565b8015612b63576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8e91815260200190565b5f612bb4308484612a6b565b81600a5f828254612bc5919061324b565b90915550919392505050565b60405180606001604052805f6001600160a01b03168152602001612bf3612c93565b81526020015f81525090565b600183019183908215612c87579160200282015f5b83821115612c5657835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302612c14565b8015612c855782816101000a81549062ffffff0219169055600301602081600201049283019260010302612c56565b505b506111df929150612cb1565b60405180606001604052806003906020820280368337509192915050565b5b808211156111df575f8155600101612cb2565b5f60208284031215612cd5575f80fd5b81358015158114611260575f80fd5b5f81518084525f5b81811015612d0857602081850181015186830182015201612cec565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6112606020830184612ce4565b6001600160a01b0381168114610c8b575f80fd5b5f8060408385031215612d5e575f80fd5b8235612d6981612d39565b946020939093013593505050565b5f805f60608486031215612d89575f80fd5b8335612d9481612d39565b92506020840135612da481612d39565b929592945050506040919091013590565b803562ffffff81168114612dc7575f80fd5b919050565b5f60208284031215612ddc575f80fd5b61126082612db5565b60c081525f612df760c0830189612ce4565b8281036020840152612e098189612ce4565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050612e3c8185612ce4565b9998505050505050505050565b5f60208284031215612e59575f80fd5b813561126081612d39565b604080825283518282018190525f91906020906060850190828801855b82811015612eaf57815180516001600160a01b03168552850151858501529285019290840190600101612e81565b5050508093505050508260208301529392505050565b805f5b6003811015611bfe57815162ffffff16845260209384019390910190600101612ec8565b602080825282518282018190525f919060409081850190868401855b82811015612f4a57815180516001600160a01b0316855286810151612f2f88870182612ec5565b50850151608085015260a09093019290850190600101612f08565b5091979650505050505050565b5f8060408385031215612f68575f80fd5b8235612f7381612d39565b91506020830135612f8381612d39565b809150509250929050565b5f8060408385031215612f9f575f80fd5b50508035926020909101359150565b803560ff81168114612dc7575f80fd5b5f805f805f805f60e0888a031215612fd4575f80fd5b8735612fdf81612d39565b96506020880135612fef81612d39565b9550604088013594506060880135935061300b60808901612fae565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b5f805f60a0848603121561304d575f80fd5b61305684612fae565b925060208085013561306781612d39565b9250605f85018613613077575f80fd5b6040516060810181811067ffffffffffffffff8211171561309a5761309a613027565b6040528060a08701888111156130ae575f80fd5b604088015b818110156130d1576130c481612db5565b83529184019184016130b3565b50505080925050509250925092565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b600181811c9082168061311a57607f821691505b60208210810361313857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613162575f80fd5b815161126081612d39565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156131d15784516001600160a01b0316835293830193918301916001016131ac565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613204575f80fd5b8351925060208401519150604084015190509250925092565b60ff841681526001600160a01b038316602082015260a081016132436040830184612ec5565b949350505050565b81810381811115610b4057634e487b7160e01b5f52601160045260245ffdfea2646970667358221220644d37236bd965e8d457ee9c09677b6b5dc7968576f7ba0d6e0ea22517c7c46364736f6c63430008170033036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0
Deployed Bytecode
0x608060405260043610610326575f3560e01c8063715018a6116101ad578063a9059cbb116100ea578063d505accf1161008e578063dd62ed3e1161006b578063dd62ed3e1461097c578063e2745ef21461099b578063f2fde38b146109af578063f4db9698146109ce57005b8063d505accf1461092a578063d551160914610949578063d8454a821461096857005b8063c78fe0d4116100c7578063c78fe0d4146108a1578063cc1776d3146108b5578063d1ace710146108c9578063d232c220146108e857005b8063a9059cbb14610846578063b187bd2614610865578063b56980711461088257005b80638da5cb5b1161015157806396ce07951161012e57806396ce0795146107d5578063a457c2d7146107e9578063a4d8971a14610808578063a5596b4f1461082757005b80638da5cb5b1461078657806395101f90146107a257806395d89b41146107c157005b80638324c3b91161018a5780638324c3b91461072b5780638a8c523c1461073f5780638bf1acff146107535780638d8350ca1461076757005b8063715018a6146106c45780637b1ab0d2146106d85780637ecebe00146106f757005b8063351a964d1161027b57806353d74fdf1161021f5780635fe8e7cc116101fc5780635fe8e7cc1461062e5780636bdb5ad1146106505780636f05be971461066f57806370a082311461069057005b806353d74fdf146105ce57806354fd4d50146105e25780635f6417581461060f57005b8063370158ea11610258578063370158ea14610558578063395093511461057e5780634f7041a51461059d5780635117cdee146105b157005b8063351a964d1461050e57806335ed71a8146105255780633644e5151461054457005b8063095ea7b3116102e257806323b872dd116102bf57806323b872dd14610473578063313ce5671461049257806332633967146104cf57806333d48a7d146104ee57005b8063095ea7b31461042257806315ad87221461044157806318160ddd1461045557005b806302329a291461032f5780630588b1a51461034e578063064a59d01461038357806306fdde03146103b257806307e9652c146103d357806309523308146103f157005b3661032d57005b005b34801561033a575f80fd5b5061032d610349366004612cc5565b6109eb565b348015610359575f80fd5b50600654600160701b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b34801561038e575f80fd5b50600654600160c01b900463ffffffff1615155b604051901515815260200161037a565b3480156103bd575f80fd5b506103c6610aa0565b60405161037a9190612d27565b3480156103de575f80fd5b506006546301000000900460ff166103a2565b3480156103fc575f80fd5b50600e546001600160a01b03165b6040516001600160a01b03909116815260200161037a565b34801561042d575f80fd5b506103a261043c366004612d4d565b610b30565b34801561044c575f80fd5b5061032d610b46565b348015610460575f80fd5b506007545b60405190815260200161037a565b34801561047e575f80fd5b506103a261048d366004612d77565b610ba6565b34801561049d575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000001216815260200161037a565b3480156104da575f80fd5b5061032d6104e9366004612dcc565b610bc7565b3480156104f9575f80fd5b50600654600160881b900462ffffff1661036a565b348015610519575f80fd5b5060065460ff166103a2565b348015610530575f80fd5b5061032d61053f366004612cc5565b610c8e565b34801561054f575f80fd5b50601454610465565b348015610563575f80fd5b5061056c610d2b565b60405161037a96959493929190612de5565b348015610589575f80fd5b506103a2610598366004612d4d565b610eb4565b3480156105a8575f80fd5b5061036a610ecb565b3480156105bc575f80fd5b50600f546001600160a01b031661040a565b3480156105d9575f80fd5b50610465610eda565b3480156105ed575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526103c6565b34801561061a575f80fd5b5061036a610629366004612e49565b610f55565b348015610639575f80fd5b50610642610fe2565b60405161037a929190612e64565b34801561065b575f80fd5b5061032d61066a366004612dcc565b611001565b34801561067a575f80fd5b506106836110c6565b60405161037a9190612eec565b34801561069b575f80fd5b506104656106aa366004612e49565b6001600160a01b03165f9081526001602052604090205490565b3480156106cf575f80fd5b5061032d6111e3565b3480156106e3575f80fd5b5061040a6106f2366004612f57565b611217565b348015610702575f80fd5b50610465610711366004612e49565b6001600160a01b03165f9081526015602052604090205490565b348015610736575f80fd5b5061032d611267565b34801561074a575f80fd5b5061032d6112c9565b34801561075e575f80fd5b5061036a611376565b348015610772575f80fd5b5061036a610781366004612e49565b61137c565b348015610791575f80fd5b505f546001600160a01b031661040a565b3480156107ad575f80fd5b5061036a6107bc366004612e49565b6113bb565b3480156107cc575f80fd5b506103c6611412565b3480156107e0575f80fd5b506103e861036a565b3480156107f4575f80fd5b506103a2610803366004612d4d565b611421565b348015610813575f80fd5b5061032d610822366004612cc5565b611481565b348015610832575f80fd5b5061032d610841366004612cc5565b6114d5565b348015610851575f80fd5b506103a2610860366004612d4d565b611530565b348015610870575f80fd5b5060065462010000900460ff166103a2565b34801561088d575f80fd5b5061064261089c366004612f8e565b61153c565b3480156108ac575f80fd5b5061032d611739565b3480156108c0575f80fd5b5061036a61179d565b3480156108d4575f80fd5b5061032d6108e3366004612cc5565b6117a7565b3480156108f3575f80fd5b50600d546040805160ff8084161515825261010084048116151560208301526201000090930490921615159082015260600161037a565b348015610935575f80fd5b5061032d610944366004612fbe565b611804565b348015610954575f80fd5b5061032d61096336600461303b565b6119ec565b348015610973575f80fd5b50600854610465565b348015610987575f80fd5b50610465610996366004612f57565b611a39565b3480156109a6575f80fd5b5061032d611a63565b3480156109ba575f80fd5b5061032d6109c9366004612e49565b611af6565b3480156109d9575f80fd5b506011546001600160a01b031661040a565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b8152600401610a14906130e0565b60405180910390fd5b600d5460ff1615610a2c575f80fd5b801515600660029054906101000a900460ff16151503610a4a575f80fd5b60068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd290610a9590831515815260200190565b60405180910390a150565b606060128054610aaf90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610adb90613106565b8015610b265780601f10610afd57610100808354040283529160200191610b26565b820191905f5260205f20905b815481529060010190602001808311610b0957829003601f168201915b5050505050905090565b5f610b3c338484611b3a565b5060015b92915050565b5f546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610a14906130e0565b600d805460ff191660011790556040517fbac59158523e697197ebd95013205b34c0b416747a935fb50262c337e26ce59a905f90a1565b5f610bb2843384611b9b565b610bbd848484611c04565b5060019392505050565b5f546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615610c04575f80fd5b60018162ffffff1610158015610c2157506103e88162ffffff1611155b610c5c5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60701b1916600160701b62ffffff93909316928302179055600754620186a0910204600955565b50565b5f546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615610ccc575f80fd5b801580610ce35750600e546001600160a01b031615155b610d185760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610a14565b6006805460ff1916911515919091179055565b6060805f805f6060601260137f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600754604051806040016040528060058152602001640312e302e360dc1b815250858054610d9890613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490613106565b8015610e0f5780601f10610de657610100808354040283529160200191610e0f565b820191905f5260205f20905b815481529060010190602001808311610df257829003601f168201915b50505050509550848054610e2290613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e90613106565b8015610e995780601f10610e7057610100808354040283529160200191610e99565b820191905f5260205f20905b815481529060010190602001808311610e7c57829003601f168201915b50505050509450955095509550955095509550909192939495565b5f610b3c338484610ec53388611a39565b01611b3a565b5f610ed5336113bb565b905090565b6005545f90815b81811015610f50575f60058281548110610efd57610efd61313e565b5f918252602090912001546001600160a01b03169050801580610f3557506001600160a01b0381165f90815260016020526040902054155b15610f405750610f48565b836001019350505b600101610ee1565b505090565b6006545f906301000000900460ff1615610f7057505f919050565b6001600160a01b038216301480610f9357505f546001600160a01b038381169116145b80610fab5750600f546001600160a01b038381169116145b80610fc35750600e546001600160a01b038381169116145b610fdb57600654600160581b900462ffffff16610b40565b5f92915050565b60605f610fed610eda565b9050610ff95f8261153c565b915091509091565b5f546001600160a01b0316331461102a5760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff161561103f575f80fd5b60018162ffffff161015801561105c57506103e88162ffffff1611155b6110975760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60881b1916600160881b62ffffff93909316928302179055600754620186a0910204600b55565b60408051600580825260c08201909252606091816020015b6110e6612bd1565b8152602001906001900390816110de5790505090505f5b60058160ff1610156111df57604080516060808201835260ff84165f81815260046020818152868320805461010090046001600160a01b031687529383529081528551938401958690529394938501936001909201916003918390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161115a5750505092845250505060ff83165f81815260046020908152604090912060020154920191909152835184919081106111cc576111cc61313e565b60209081029190910101526001016110fd565b5090565b5f546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610a14906130e0565b6112155f612058565b565b5f80546001600160a01b031633146112415760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611256575f80fd5b61126083836120a7565b9392505050565b5f546001600160a01b031633146112905760405162461bcd60e51b8152600401610a14906130e0565b600d805461ff0019166101001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b031633146112f25760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611307575f80fd5b600654600160c01b900463ffffffff16156113565760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a14565b6006805463ffffffff60c01b19164263ffffffff16600160c01b02179055565b5f610ed5335b5f6001600160a01b0382163014806113a15750600f546001600160a01b038381169116145b610fdb5760065465010000000000900462ffffff16610b40565b6006545f906301000000900460ff16156113d657505f919050565b6001600160a01b0382163014806113fa5750600f546001600160a01b038381169116145b610fdb57600654600160401b900462ffffff16610b40565b606060138054610aaf90613106565b5f8061142d3385611a39565b9050828110156114745760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610a14565b610bbd3385858403611b3a565b5f546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff1680156114c45750600654610100900460ff16155b6114cc575f80fd5b610c8b81612388565b5f546001600160a01b031633146114fe5760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611512575f80fd5b6006805491151563010000000263ff00000019909216919091179055565b5f610b3c338484611c04565b60605f611547610eda565b90508383101580156115595750808411155b6115955760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b6044820152606401610a14565b6001848403018482038111156115aa57508381035b5f81116115e85760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662072616e676560a01b6044820152606401610a14565b5f8167ffffffffffffffff81111561160257611602613027565b60405190808252806020026020018201604052801561164657816020015b604080518082019091525f80825260208201528152602001906001900390816116205790505b506005549091505f80805b8381101561172a575f6005828154811061166d5761166d61313e565b5f918252602090912001546001600160a01b031690508015806116a557506001600160a01b0381165f90815260016020526040902054155b156116b05750611722565b60018401938b11156116c25750611722565b6040805180820182526001600160a01b0383168082525f90815260016020908152929020549181019190915286518790859081106117025761170261313e565b6020026020010181905250868360010193508310611720575061172a565b505b600101611651565b50929550505050509250929050565b5f546001600160a01b031633146117625760405162461bcd60e51b8152600401610a14906130e0565b600d805462ff00001916620100001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f610ed533610f55565b5f546001600160a01b031633146117d05760405162461bcd60e51b8152600401610a14906130e0565b600654610100900460ff161580156117f35750600654640100000000900460ff16155b6117fb575f80fd5b610c8b816126c8565b428410156118485760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610a14565b6014546001600160a01b038881165f8181526015602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611960573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119965750886001600160a01b0316816001600160a01b0316145b6119d65760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610a14565b50506119e3878787611b3a565b50505050505050565b5f546001600160a01b03163314611a155760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611a29575f80fd5b611a34838383612815565b505050565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314611a8c5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff168015611aa65750600654610100900460ff16155b611aae575f80fd5b600c54600a54305f908152600160205260409020549101908110611ad0575f80fd5b305f90815260016020526040812054600c80549390910390920190915561121590612388565b5f546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610a14906130e0565b6001600160a01b038116611b31575f80fd5b610c8b81612058565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f611ba68484611a39565b905081811015611bf15760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610a14565b611bfe8484848403611b3a565b50505050565b60065462010000900460ff1615611c465760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a14565b600654640100000000900460ff16158015611c695750600654610100900460ff16155b8015611c9c5750600f546001600160a01b03848116911614801590611c9c5750600e546001600160a01b03848116911614155b15611cb357611caa5f612388565b611cb35f6126c8565b5f81118015611ccf57505f546001600160a01b03848116911614155b8015611ce857505f546001600160a01b03838116911614155b8015611cfd57506001600160a01b0383163014155b8015611d1257506001600160a01b0382163014155b8015611d2c5750600e546001600160a01b03838116911614155b15611fba57600f546001600160a01b03848116911614801590611d5d5750600f546001600160a01b03838116911614155b80611da65750600f546001600160a01b0384811691161480611d8c5750600f546001600160a01b038381169116145b8015611da65750600654600160c01b900463ffffffff1615155b611de55760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610a14565b6006546301000000900460ff16158015611e0a5750600654640100000000900460ff16155b8015611e1e5750600654610100900460ff16155b15611fba57600f545f9081906001600160a01b0386811691161480611e505750600f546001600160a01b038581169116145b15611e7757600f546001600160a01b03868116911614611e71576002611e74565b60015b90505b5f5b60058160ff161015611fa2575f808360ff1611611ec65760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16611f0e565b8260ff16600114611eec5760ff82165f9081526004602052604090206001016002611ea6565b60ff82165f908152600460205260409020600101546301000000900462ffffff165b62ffffff169050805f03611f225750611f9a565b620186a085820204611f35883083612a6b565b600f5460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603611f7057600c805482019055611f93565b60ff83165f908152600460205260409020600201805482019055600a8054820190555b9390930192505b600101611e79565b508115611fb757600880548301905591819003915b50505b611fc5838383612a6b565b5f81118015611fec57506001600160a01b0382165f9081526003602052604090205460ff16155b15611a3457506001600160a01b03165f818152600360205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916909117905550565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166120ba575f80fd5b600e546001600160a01b038481169116146122fd575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121349190613152565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613152565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156121e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220b9190613152565b90506001600160a01b03811661228d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015612266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190613152565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b0383811691161461232e57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b6006805461ff001981166101001790915560ff16156126ba5780806123dc5750600b546002600c54816123bd576123bd61316d565b04101580156123dc5750600c54305f9081526001602052604090205410155b156126ba575f6002600c54816123f4576123f461316d565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f815181106124305761243061313e565b6001600160a01b0392831660209182029290920101526010548251911690829060019081106124615761246161313e565b6001600160a01b039283166020918202929092010152600e546124879130911685611b3a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124c29086905f90869030904260010190600401613181565b5f604051808303815f87803b1580156124d9575f80fd5b505af19250505080156124ea575060015b61250b57600e546125069030906001600160a01b03165f611b3a565b6126b6565b600680546001600160e01b0316600160e01b63ffffffff421602179055600c541561254c576002600c5f828254816125455761254561316d565b0490915550505b604080518481524784900360208201819052917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e14910160405180910390a180156126b4575f8411801561259e57505f81115b156126b457600e546125bb9030906001600160a01b031686611b3a565b600e5460115460405163f305d71960e01b8152306004820152602481018790525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561264a575060408051601f3d908101601f19168201909252612647918101906131f2565b60015b61266b57600e546126669030906001600160a01b03165f611b3a565b6126b4565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f600c55505b505b5050505b506006805461ff0019169055565b6006805464ff0000000019166401000000001790558061271357600a5415806127005750600a54305f90815260016020526040902054105b8061270e5750600954600a54105b612804575b5f805b60058160ff1610156127b05760ff81165f90815260046020526040902080546002909101546101009091046001600160a01b0316908015806127655750600f546001600160a01b038381169116145b156127715750506127a8565b5f61277c8383612ba8565b905080156127a05760ff84165f908152600460205260409020600201805482900390555b939093019250505b600101612716565b506006805463ffffffff60a01b1916600160a01b63ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506006805464ff0000000019169055565b60058360ff1610612824575f80fd5b6001600160a01b038216301480159061284857506001600160a01b03821661dead14155b801561285c57506001600160a01b03821615155b612864575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805467ffffff000000000019811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b01516affffff0000000000000000199095166affffffffffff0000000000199093169290921763010000009098048516909303600160401b9182900485160184160295909517808655925495870151600160581b80850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906129b057506006546161a8600160401b90910462ffffff161180159061298157506006546161a8600160581b90910462ffffff1611155b80156129b057506006546161a8600160401b820462ffffff908116600160581b90930481169290920190911611155b6129e75760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610a14565b8054610100600160a81b0319166101006001600160a01b03851602178155612a1460018201836003612bff565b50805460ff16612a2a57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051612a5d9392919061321d565b60405180910390a150505050565b6001600160a01b03831615801590612a8b57506001600160a01b03821615155b612ad75760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610a14565b6001600160a01b0383165f90815260016020526040902054811115612b305760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610a14565b8015612b63576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8e91815260200190565b5f612bb4308484612a6b565b81600a5f828254612bc5919061324b565b90915550919392505050565b60405180606001604052805f6001600160a01b03168152602001612bf3612c93565b81526020015f81525090565b600183019183908215612c87579160200282015f5b83821115612c5657835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302612c14565b8015612c855782816101000a81549062ffffff0219169055600301602081600201049283019260010302612c56565b505b506111df929150612cb1565b60405180606001604052806003906020820280368337509192915050565b5b808211156111df575f8155600101612cb2565b5f60208284031215612cd5575f80fd5b81358015158114611260575f80fd5b5f81518084525f5b81811015612d0857602081850181015186830182015201612cec565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6112606020830184612ce4565b6001600160a01b0381168114610c8b575f80fd5b5f8060408385031215612d5e575f80fd5b8235612d6981612d39565b946020939093013593505050565b5f805f60608486031215612d89575f80fd5b8335612d9481612d39565b92506020840135612da481612d39565b929592945050506040919091013590565b803562ffffff81168114612dc7575f80fd5b919050565b5f60208284031215612ddc575f80fd5b61126082612db5565b60c081525f612df760c0830189612ce4565b8281036020840152612e098189612ce4565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050612e3c8185612ce4565b9998505050505050505050565b5f60208284031215612e59575f80fd5b813561126081612d39565b604080825283518282018190525f91906020906060850190828801855b82811015612eaf57815180516001600160a01b03168552850151858501529285019290840190600101612e81565b5050508093505050508260208301529392505050565b805f5b6003811015611bfe57815162ffffff16845260209384019390910190600101612ec8565b602080825282518282018190525f919060409081850190868401855b82811015612f4a57815180516001600160a01b0316855286810151612f2f88870182612ec5565b50850151608085015260a09093019290850190600101612f08565b5091979650505050505050565b5f8060408385031215612f68575f80fd5b8235612f7381612d39565b91506020830135612f8381612d39565b809150509250929050565b5f8060408385031215612f9f575f80fd5b50508035926020909101359150565b803560ff81168114612dc7575f80fd5b5f805f805f805f60e0888a031215612fd4575f80fd5b8735612fdf81612d39565b96506020880135612fef81612d39565b9550604088013594506060880135935061300b60808901612fae565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b5f805f60a0848603121561304d575f80fd5b61305684612fae565b925060208085013561306781612d39565b9250605f85018613613077575f80fd5b6040516060810181811067ffffffffffffffff8211171561309a5761309a613027565b6040528060a08701888111156130ae575f80fd5b604088015b818110156130d1576130c481612db5565b83529184019184016130b3565b50505080925050509250925092565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b600181811c9082168061311a57607f821691505b60208210810361313857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613162575f80fd5b815161126081612d39565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156131d15784516001600160a01b0316835293830193918301916001016131ac565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613204575f80fd5b8351925060208401519150604084015190509250925092565b60ff841681526001600160a01b038316602082015260a081016132436040830184612ec5565b949350505050565b81810381811115610b4057634e487b7160e01b5f52601160045260245ffdfea2646970667358221220644d37236bd965e8d457ee9c09677b6b5dc7968576f7ba0d6e0ea22517c7c46364736f6c63430008170033
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.
Add Token to MetaMask (Web3)