ETH Price: $2,062.88 (-15.47%)

Token

reTAO Layer (reTAO)
 

Overview

Max Total Supply

21,000,000 reTAO

Holders

56

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: reTAO
Balance
16,610,801.127031285967547434 reTAO

Value
$0.00
0x2c52ba1c6c368063379f2f1a48213117be378fcf
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
reTAO

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 1 : reTAO.sol
// SPDX-License-Identifier: MIT

/*
    Web: https://retaolayer.ai/
    TG: https://t.me/ReTaoLayer
    X: https://x.com/ReTaoLayer
*/

pragma solidity 0.8.26;

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(
        address spender,
        uint256 allowance,
        uint256 needed
    );

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(
        address sender,
        uint256 balance,
        uint256 needed,
        uint256 tokenId
    );

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value)
        public
        virtual
        returns (bool)
    {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(
        address owner,
        address spender,
        uint256 value,
        bool emitEvent
    ) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 value
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(
                    spender,
                    currentAllowance,
                    value
                );
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}

interface IUniswapV2Router {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract reTAO is Ownable, ERC20 {
    IUniswapV2Router public immutable uniswapV2Router;

    address public constant ZERO_ADDRESS = address(0);
    address public constant DEAD_ADDRESS = address(0xdEaD);

    address public immutable uniswapV2Pair;
    address public developmentWallet;

    bool public isLimitsEnabled;
    bool public isCooldownEnabled;
    bool private inSwapBack;
    bool public isLaunched;

    uint256 private lastSwapBackExecutionBlock;

    uint256 public constant MAX_FEE = 25;

    uint256 public maxBuy;
    uint256 public maxSell;
    uint256 public maxWallet;

    uint256 public swapTokensAtAmount;
    uint256 public buyFee;
    uint256 public sellFee;

    mapping(address => bool) public isExcludedFromFees;
    mapping(address => bool) public isExcludedFromLimits;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => uint256) private _holderLastTransferTimestamp;

    event Launch();
    event SetOperationsWallet(address newWallet, address oldWallet);
    event SetDevelopmentWallet(address newWallet, address oldWallet);
    event SetLimitsEnabled(bool status);
    event SetCooldownEnabled(bool status);
    event SetTaxesEnabled(bool status);
    event SetMaxBuy(uint256 amount);
    event SetMaxSell(uint256 amount);
    event SetMaxWallet(uint256 amount);
    event SetSwapTokensAtAmount(uint256 newValue, uint256 oldValue);
    event SetBuyFees(uint256 newValue, uint256 oldValue);
    event SetSellFees(uint256 newValue, uint256 oldValue);
    event ExcludeFromFees(address account, bool isExcluded);
    event ExcludeFromLimits(address account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address pair, bool value);
    event WithdrawStuckTokens(address token, uint256 amount);

    modifier lockSwapBack() {
        inSwapBack = true;
        _;
        inSwapBack = false;
    }

    constructor() Ownable(msg.sender) ERC20("reTAO Layer", "reTAO") {
        address sender = msg.sender;
        _mint(sender, 21_000_000 ether);
        uint256 totalSupply = totalSupply();

        developmentWallet = 0x3bd0Ae45123d7cbDB775E32859347c4dF02c5d1D;

        maxBuy = (totalSupply * 2) / 100;
        maxSell = (totalSupply * 2) / 100;
        maxWallet = (totalSupply * 2) / 100;
        swapTokensAtAmount = totalSupply / 1000;

        isLimitsEnabled = true;
        isCooldownEnabled = true;

        // initial high tax
        buyFee = 24;
        sellFee = 24;

        uniswapV2Router = IUniswapV2Router(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
            address(this),
            uniswapV2Router.WETH()
        );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        _excludeFromFees(address(this), true);
        _excludeFromFees(address(0xdead), true);
        _excludeFromFees(sender, true);
        _excludeFromFees(developmentWallet, true);
        _excludeFromLimits(address(this), true);
        _excludeFromLimits(address(0xdead), true);
        _excludeFromLimits(sender, true);
        _excludeFromLimits(developmentWallet, true);
    }

    receive() external payable {}

    fallback() external payable {}

    function _transferOwnership(address newOwner) internal override {
        address oldOwner = owner();
        if (oldOwner != address(0)) {
            _excludeFromFees(oldOwner, false);
            _excludeFromLimits(oldOwner, false);
        }
        _excludeFromFees(newOwner, true);
        _excludeFromLimits(newOwner, true);
        super._transferOwnership(newOwner);
    }

    function launch() external onlyOwner {
        require(!isLaunched, "error");
        isLaunched = true;
        emit Launch();
    }

    function setDevelopmentWallet(address _developmentWallet)
        external
        onlyOwner
    {
        require(_developmentWallet != address(0), "error");
        address oldWallet = developmentWallet;
        developmentWallet = _developmentWallet;
        emit SetDevelopmentWallet(developmentWallet, oldWallet);
    }

    function setLimitsEnabled(bool value) external onlyOwner {
        isLimitsEnabled = value;
        emit SetLimitsEnabled(value);
    }

    function setCooldownEnabled(bool value) external onlyOwner {
        isCooldownEnabled = value;
        emit SetCooldownEnabled(value);
    }

    function setMaxBuy(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), "error");
        maxBuy = amount;
        emit SetMaxBuy(maxBuy);
    }

    function setMaxSell(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 2) / 1000), "error");
        maxSell = amount;
        emit SetMaxSell(maxSell);
    }

    function setMaxWallet(uint256 amount) external onlyOwner {
        require(amount >= ((totalSupply() * 3) / 1000), "error");
        maxWallet = amount;
        emit SetMaxWallet(maxWallet);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        uint256 _totalSupply = totalSupply();
        require(amount >= (_totalSupply * 1) / 1000000, "error");
        require(amount <= (_totalSupply * 5) / 1000, "error");
        uint256 oldValue = swapTokensAtAmount;
        swapTokensAtAmount = amount;
        emit SetSwapTokensAtAmount(amount, oldValue);
    }

    function setBuyFees(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= MAX_FEE, "error");
        uint256 oldValue = buyFee;
        buyFee = _buyFee;
        emit SetBuyFees(_buyFee, oldValue);
    }

    function setSellFees(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= MAX_FEE, "error");
        uint256 oldValue = sellFee;
        sellFee = _sellFee;
        emit SetSellFees(_sellFee, oldValue);
    }

    function excludeFromFees(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromFees(accounts[i], value);
        }
    }

    function excludeFromLimits(address[] calldata accounts, bool value)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < accounts.length; i++) {
            _excludeFromLimits(accounts[i], value);
        }
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(!automatedMarketMakerPairs[pair], "error");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function withdrawStuckTokens(address _token) external onlyOwner {
        address sender = msg.sender;
        uint256 amount;
        if (_token == ZERO_ADDRESS) {
            bool success;
            amount = address(this).balance;
            require(amount > 0, "error");
            (success, ) = address(sender).call{value: amount}("");
            require(success, "error");
        } else {
            amount = IERC20(_token).balanceOf(address(this));
            require(amount > 0, "error");
            IERC20(_token).transfer(msg.sender, amount);
        }
        emit WithdrawStuckTokens(_token, amount);
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        address origin = tx.origin;

        require(
            isLaunched ||
                isExcludedFromLimits[from] ||
                isExcludedFromLimits[to],
            "error"
        );

        bool limits = isLimitsEnabled &&
            !inSwapBack &&
            !(isExcludedFromLimits[from] || isExcludedFromLimits[to]);
        if (limits) {
            if (
                from != owner() &&
                to != owner() &&
                to != ZERO_ADDRESS &&
                to != DEAD_ADDRESS
            ) {
                if (isCooldownEnabled) {
                    if (to != address(uniswapV2Router) && to != uniswapV2Pair) {
                        require(
                            _holderLastTransferTimestamp[origin] <
                                block.number - 3 &&
                                _holderLastTransferTimestamp[to] <
                                block.number - 3,
                            "error"
                        );
                        _holderLastTransferTimestamp[origin] = block.number;
                        _holderLastTransferTimestamp[to] = block.number;
                    }
                }

                if (
                    automatedMarketMakerPairs[from] && !isExcludedFromLimits[to]
                ) {
                    require(amount <= maxBuy, "error");
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "error"
                    );
                } else if (
                    automatedMarketMakerPairs[to] && !isExcludedFromLimits[from]
                ) {
                    require(amount <= maxSell, "error");
                } else if (!isExcludedFromLimits[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "error"
                    );
                }
            }
        }

        bool takeFee = !inSwapBack &&
            !(isExcludedFromFees[from] || isExcludedFromFees[to]);

        if (takeFee) {
            uint256 fees = 0;
            if (automatedMarketMakerPairs[to] && sellFee > 0) {
                fees = (amount * sellFee) / 100;
            } else if (automatedMarketMakerPairs[from] && buyFee > 0) {
                fees = (amount * buyFee) / 100;
            }

            if (fees > 0) {
                amount -= fees;
                super._update(from, address(this), fees);
            }
        }

        uint256 balance = balanceOf(address(this));
        bool shouldSwap = balance >= swapTokensAtAmount;
        if (takeFee && !automatedMarketMakerPairs[from] && shouldSwap) {
            if (block.number > lastSwapBackExecutionBlock) {
                _swapBack(balance);
                lastSwapBackExecutionBlock = block.number;
            }
        }

        super._update(from, to, amount);
    }

    function _swapBack(uint256 balance) internal virtual lockSwapBack {
        bool success;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uint256 maxSwapAmount = swapTokensAtAmount * 15;

        if (balance > maxSwapAmount) {
            balance = maxSwapAmount;
        }

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            balance,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 ethBalance = address(this).balance;

        (success, ) = address(developmentWallet).call{value: ethBalance}(
            ""
        );
    }

    function _excludeFromFees(address account, bool value) internal virtual {
        isExcludedFromFees[account] = value;
        emit ExcludeFromFees(account, value);
    }

    function _excludeFromLimits(address account, bool value) internal virtual {
        isExcludedFromLimits[account] = value;
        emit ExcludeFromLimits(account, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value)
        internal
        virtual
    {
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromLimits","type":"event"},{"anonymous":false,"inputs":[],"name":"Launch","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":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetBuyFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetCooldownEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetDevelopmentWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetLimitsEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newWallet","type":"address"},{"indexed":false,"internalType":"address","name":"oldWallet","type":"address"}],"name":"SetOperationsWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSellFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"SetSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetTaxesEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckTokens","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DEAD_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZERO_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLimitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604080518082018252600b81526a3932aa20a7902630bcb2b960a91b60208083019190915282518084019093526005835264726554414f60d81b9083015290338061007757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6100808161036a565b50600461008d8382610fc5565b50600561009a8282610fc5565b503391506100b59050816a115eec47f6cf7e350000006103b5565b60006100c060035490565b600680546001600160a01b031916733bd0ae45123d7cbdb775e32859347c4df02c5d1d179055905060646100f5826002611099565b6100ff91906110b6565b600855606461010f826002611099565b61011991906110b6565b6009556064610129826002611099565b61013391906110b6565b600a556101426103e8826110b6565b600b556006805461ffff60a01b191661010160a01b1790556018600c819055600d55737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156101b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101dd91906110d8565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561022c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025091906110d8565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561029d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102c191906110d8565b6001600160a01b031660a08190526102da9060016103eb565b6102ef3060805160001961044f60201b60201c565b6102fa306001610461565b61030761dead6001610461565b610312826001610461565b600654610329906001600160a01b03166001610461565b6103343060016104bd565b61034161dead60016104bd565b61034c8260016104bd565b600654610363906001600160a01b031660016104bd565b50506111b6565b6000546001600160a01b0316801561039257610387816000610461565b6103928160006104bd565b61039d826001610461565b6103a88260016104bd565b6103b182610519565b5050565b6001600160a01b0382166103df5760405163ec442f0560e01b81526000600482015260240161006e565b6103b160008383610569565b6001600160a01b038216600081815260106020908152604091829020805460ff19168515159081179091558251938452908301527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91015b60405180910390a15050565b61045c8383836001610b31565b505050565b6001600160a01b0382166000818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610443565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc929101610443565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6006543290600160b81b900460ff168061059b57506001600160a01b0384166000908152600f602052604090205460ff165b806105be57506001600160a01b0383166000908152600f602052604090205460ff165b6105f25760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b600654600090600160a01b900460ff1680156106185750600654600160b01b900460ff16155b801561066057506001600160a01b0385166000908152600f602052604090205460ff168061065e57506001600160a01b0384166000908152600f602052604090205460ff165b155b9050801561099e576000546001600160a01b0386811691161480159061069457506000546001600160a01b03858116911614155b80156106a857506001600160a01b03841615155b80156106bf57506001600160a01b03841661dead14155b1561099e57600654600160a81b900460ff16156107c1576080516001600160a01b0316846001600160a01b03161415801561070e575060a0516001600160a01b0316846001600160a01b031614155b156107c15761071e600343611108565b6001600160a01b038316600090815260116020526040902054108015610765575061074a600343611108565b6001600160a01b038516600090815260116020526040902054105b6107995760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b6001600160a01b03808316600090815260116020526040808220439081905592871682529020555b6001600160a01b03851660009081526010602052604090205460ff16801561080257506001600160a01b0384166000908152600f602052604090205460ff16155b156108a2576008548311156108415760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b600a546001600160a01b038516600090815260016020526040902054610867908561111b565b111561089d5760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b61099e565b6001600160a01b03841660009081526010602052604090205460ff1680156108e357506001600160a01b0385166000908152600f602052604090205460ff16155b156109225760095483111561089d5760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b6001600160a01b0384166000908152600f602052604090205460ff1661099e57600a546001600160a01b038516600090815260016020526040902054610968908561111b565b111561099e5760405162461bcd60e51b815260206004820152600560248201526432b93937b960d91b604482015260640161006e565b600654600090600160b01b900460ff161580156109f757506001600160a01b0386166000908152600e602052604090205460ff16806109f557506001600160a01b0385166000908152600e602052604090205460ff165b155b90508015610aba576001600160a01b03851660009081526010602052604081205460ff168015610a2957506000600d54115b15610a4f576064600d5486610a3e9190611099565b610a4891906110b6565b9050610a9b565b6001600160a01b03871660009081526010602052604090205460ff168015610a7957506000600c54115b15610a9b576064600c5486610a8e9190611099565b610a9891906110b6565b90505b8015610ab857610aab8186611108565b9450610ab8873083610c07565b505b30600090815260016020526040902054600b54811015828015610af657506001600160a01b03881660009081526010602052604090205460ff16155b8015610aff5750805b15610b1c57600754431115610b1c57610b1782610d31565b436007555b610b27888888610c07565b5050505050505050565b6001600160a01b038416610b5b5760405163e602df0560e01b81526000600482015260240161006e565b6001600160a01b038316610b8557604051634a1406b160e11b81526000600482015260240161006e565b6001600160a01b0380851660009081526002602090815260408083209387168352929052208290558015610c0157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610bf891815260200190565b60405180910390a35b50505050565b6001600160a01b038316610c32578060036000828254610c27919061111b565b90915550610ca49050565b6001600160a01b03831660009081526001602052604090205481811015610c855760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161006e565b6001600160a01b03841660009081526001602052604090209082900390555b6001600160a01b038216610cc057600380548290039055610cdf565b6001600160a01b03821660009081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d2491815260200190565b60405180910390a3505050565b6006805460ff60b01b1916600160b01b179055604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110610d7d57610d7d61112e565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0191906110d8565b81600181518110610e1457610e1461112e565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600b54600f610e459190611099565b905080841115610e53578093505b6080516001600160a01b031663791ac9478560008530426040518663ffffffff1660e01b8152600401610e8a959493929190611144565b600060405180830381600087803b158015610ea457600080fd5b505af1158015610eb8573d6000803e3d6000fd5b50506006546040514793506001600160a01b0390911691508290600081818185875af1925050503d8060008114610f0b576040519150601f19603f3d011682016040523d82523d6000602084013e610f10565b606091505b50506006805460ff60b01b19169055505050505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680610f5157607f821691505b602082108103610f7157634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561045c57806000526020600020601f840160051c81016020851015610f9e5750805b601f840160051c820191505b81811015610fbe5760008155600101610faa565b5050505050565b81516001600160401b03811115610fde57610fde610f27565b610ff281610fec8454610f3d565b84610f77565b6020601f821160018114611026576000831561100e5750848201515b600019600385901b1c1916600184901b178455610fbe565b600084815260208120601f198516915b828110156110565787850151825560209485019460019092019101611036565b50848210156110745786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176110b0576110b0611083565b92915050565b6000826110d357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156110ea57600080fd5b81516001600160a01b038116811461110157600080fd5b9392505050565b818103818111156110b0576110b0611083565b808201808211156110b0576110b0611083565b634e487b7160e01b600052603260045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b818110156111965783516001600160a01b031683526020938401939092019160010161116f565b50506001600160a01b039590951660608401525050608001529392505050565b60805160a0516121726111f76000396000818161041201526115df0152600081816102fe015281816115a201528181611ba70152611c9001526121726000f3fe6080604052600436106102535760003560e01c8063715018a611610138578063bc063e1a116100b0578063dd62ed3e11610077578063dd62ed3e14610750578063e2f4560514610796578063ef998cf0146107ac578063f2fde38b146107cc578063f53bc835146107ec578063f8b45b051461080c57005b8063bc063e1a146106ba578063c04a5414146106cf578063cb963728146106ef578063d5759ba31461070f578063dcf7aef31461073057005b80639a7a23d6116100ff5780639a7a23d6146105f4578063a9059cbb14610614578063ad29ffde14610634578063afa4f3b214610654578063b62496f514610674578063b8eb3546146106a457005b8063715018a61461056c57806372ac2486146105815780638da5cb5b146105a157806395927c25146105bf57806395d89b41146105df57005b806347062402116101cb5780635932ead1116101925780635932ead11461048f5780635cce86cd146104af5780635d0044ca146104df5780636ca541e5146104ff57806370a082311461052057806370db69d61461055657005b806347062402146103ea57806349bd5a5e146104005780634e6fd6c4146104345780634fbee1931461044a578063538ba4f91461047a57005b806318160ddd1161021a57806318160ddd1461033857806323b872dd146103575780632b14ca5614610377578063307aebc91461038d578063313ce567146103ae57806341aea9de146103ca57005b806301339c211461025c57806306fdde0314610271578063095ea7b31461029c578063106a5a8f146102cc5780631694505e146102ec57005b3661025a57005b005b34801561026857600080fd5b5061025a610822565b34801561027d57600080fd5b5061028661089b565b6040516102939190611d6b565b60405180910390f35b3480156102a857600080fd5b506102bc6102b7366004611dce565b61092d565b6040519015158152602001610293565b3480156102d857600080fd5b5061025a6102e7366004611e08565b610947565b3480156102f857600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b34801561034457600080fd5b506003545b604051908152602001610293565b34801561036357600080fd5b506102bc610372366004611e91565b610998565b34801561038357600080fd5b50610349600d5481565b34801561039957600080fd5b506006546102bc90600160b81b900460ff1681565b3480156103ba57600080fd5b5060405160128152602001610293565b3480156103d657600080fd5b5061025a6103e5366004611ed2565b6109bc565b3480156103f657600080fd5b50610349600c5481565b34801561040c57600080fd5b506103207f000000000000000000000000000000000000000000000000000000000000000081565b34801561044057600080fd5b5061032061dead81565b34801561045657600080fd5b506102bc610465366004611ef6565b600e6020526000908152604090205460ff1681565b34801561048657600080fd5b50610320600081565b34801561049b57600080fd5b5061025a6104aa366004611ed2565b610a1c565b3480156104bb57600080fd5b506102bc6104ca366004611ef6565b600f6020526000908152604090205460ff1681565b3480156104eb57600080fd5b5061025a6104fa366004611f13565b610a71565b34801561050b57600080fd5b506006546102bc90600160a81b900460ff1681565b34801561052c57600080fd5b5061034961053b366004611ef6565b6001600160a01b031660009081526001602052604090205490565b34801561056257600080fd5b5061034960085481565b34801561057857600080fd5b5061025a610aee565b34801561058d57600080fd5b5061025a61059c366004611ef6565b610b02565b3480156105ad57600080fd5b506000546001600160a01b0316610320565b3480156105cb57600080fd5b5061025a6105da366004611f13565b610b90565b3480156105eb57600080fd5b50610286610bf7565b34801561060057600080fd5b5061025a61060f366004611f2c565b610c06565b34801561062057600080fd5b506102bc61062f366004611dce565b610c55565b34801561064057600080fd5b5061025a61064f366004611e08565b610c63565b34801561066057600080fd5b5061025a61066f366004611f13565b610cae565b34801561068057600080fd5b506102bc61068f366004611ef6565b60106020526000908152604090205460ff1681565b3480156106b057600080fd5b5061034960095481565b3480156106c657600080fd5b50610349601981565b3480156106db57600080fd5b50600654610320906001600160a01b031681565b3480156106fb57600080fd5b5061025a61070a366004611ef6565b610d79565b34801561071b57600080fd5b506006546102bc90600160a01b900460ff1681565b34801561073c57600080fd5b5061025a61074b366004611f13565b610f66565b34801561075c57600080fd5b5061034961076b366004611f65565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156107a257600080fd5b50610349600b5481565b3480156107b857600080fd5b5061025a6107c7366004611f13565b610fcd565b3480156107d857600080fd5b5061025a6107e7366004611ef6565b61104a565b3480156107f857600080fd5b5061025a610807366004611f13565b611088565b34801561081857600080fd5b50610349600a5481565b61082a611105565b600654600160b81b900460ff161561085d5760405162461bcd60e51b815260040161085490611f93565b60405180910390fd5b6006805460ff60b81b1916600160b81b1790556040517f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266990600090a1565b6060600480546108aa90611fb2565b80601f01602080910402602001604051908101604052809291908181526020018280546108d690611fb2565b80156109235780601f106108f857610100808354040283529160200191610923565b820191906000526020600020905b81548152906001019060200180831161090657829003601f168201915b5050505050905090565b60003361093b818585611132565b60019150505b92915050565b61094f611105565b60005b828110156109925761098a84848381811061096f5761096f611fec565b90506020020160208101906109849190611ef6565b83611144565b600101610952565b50505050565b6000336109a68582856111a0565b6109b1858585611218565b506001949350505050565b6109c4611105565b60068054821515600160a01b0260ff60a01b199091161790556040517ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78190610a1190831515815260200190565b60405180910390a150565b610a24611105565b60068054821515600160a81b0260ff60a81b199091161790556040517f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f90610a1190831515815260200190565b610a79611105565b6103e8610a8560035490565b610a90906003612018565b610a9a919061202f565b811015610ab95760405162461bcd60e51b815260040161085490611f93565b600a8190556040518181527fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf63618690602001610a11565b610af6611105565b610b006000611277565b565b610b0a611105565b6001600160a01b038116610b305760405162461bcd60e51b815260040161085490611f93565b600680546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c91015b60405180910390a15050565b610b98611105565b6019811115610bb95760405162461bcd60e51b815260040161085490611f93565b600d80549082905560408051838152602081018390527f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b019101610b84565b6060600580546108aa90611fb2565b610c0e611105565b6001600160a01b03821660009081526010602052604090205460ff1615610c475760405162461bcd60e51b815260040161085490611f93565b610c5182826112be565b5050565b60003361093b818585611218565b610c6b611105565b60005b8281101561099257610ca6848483818110610c8b57610c8b611fec565b9050602002016020810190610ca09190611ef6565b8361131a565b600101610c6e565b610cb6611105565b6000610cc160035490565b9050620f4240610cd2826001612018565b610cdc919061202f565b821015610cfb5760405162461bcd60e51b815260040161085490611f93565b6103e8610d09826005612018565b610d13919061202f565b821115610d325760405162461bcd60e51b815260040161085490611f93565b600b80549083905560408051848152602081018390527f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca91015b60405180910390a1505050565b610d81611105565b3360006001600160a01b038316610e2a575047600081610db35760405162461bcd60e51b815260040161085490611f93565b6040516001600160a01b038416908390600081818185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b50508091505080610e245760405162461bcd60e51b815260040161085490611f93565b50610f27565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612051565b905060008111610eb45760405162461bcd60e51b815260040161085490611f93565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f25919061206a565b505b604080516001600160a01b0385168152602081018390527f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b9101610d6c565b610f6e611105565b6019811115610f8f5760405162461bcd60e51b815260040161085490611f93565b600c80549082905560408051838152602081018390527f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d9101610b84565b610fd5611105565b6103e8610fe160035490565b610fec906002612018565b610ff6919061202f565b8110156110155760405162461bcd60e51b815260040161085490611f93565b60098190556040518181527f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b790602001610a11565b611052611105565b6001600160a01b03811661107c57604051631e4fbdf760e01b815260006004820152602401610854565b61108581611277565b50565b611090611105565b6103e861109c60035490565b6110a7906002612018565b6110b1919061202f565b8110156110d05760405162461bcd60e51b815260040161085490611f93565b60088190556040518181527f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f90602001610a11565b6000546001600160a01b03163314610b005760405163118cdaa760e01b8152336004820152602401610854565b61113f8383836001611376565b505050565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc929101610b84565b6001600160a01b038381166000908152600260209081526040808320938616835292905220546000198114610992578181101561120957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610854565b61099284848484036000611376565b6001600160a01b03831661124257604051634b637e8f60e11b815260006004820152602401610854565b6001600160a01b03821661126c5760405163ec442f0560e01b815260006004820152602401610854565b61113f83838361144b565b6000546001600160a01b0316801561129f5761129481600061131a565b61129f816000611144565b6112aa82600161131a565b6112b5826001611144565b610c51826119bf565b6001600160a01b038216600081815260106020908152604091829020805460ff19168515159081179091558251938452908301527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610b84565b6001600160a01b0382166000818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610b84565b6001600160a01b0384166113a05760405163e602df0560e01b815260006004820152602401610854565b6001600160a01b0383166113ca57604051634a1406b160e11b815260006004820152602401610854565b6001600160a01b038085166000908152600260209081526040808320938716835292905220829055801561099257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161143d91815260200190565b60405180910390a350505050565b6006543290600160b81b900460ff168061147d57506001600160a01b0384166000908152600f602052604090205460ff165b806114a057506001600160a01b0383166000908152600f602052604090205460ff165b6114bc5760405162461bcd60e51b815260040161085490611f93565b600654600090600160a01b900460ff1680156114e25750600654600160b01b900460ff16155b801561152a57506001600160a01b0385166000908152600f602052604090205460ff168061152857506001600160a01b0384166000908152600f602052604090205460ff165b155b9050801561182c576000546001600160a01b0386811691161480159061155e57506000546001600160a01b03858116911614155b801561157257506001600160a01b03841615155b801561158957506001600160a01b03841661dead14155b1561182c57600654600160a81b900460ff16156116af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03161415801561161457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b156116af57611624600343612087565b6001600160a01b03831660009081526011602052604090205410801561166b5750611650600343612087565b6001600160a01b038516600090815260116020526040902054105b6116875760405162461bcd60e51b815260040161085490611f93565b6001600160a01b03808316600090815260116020526040808220439081905592871682529020555b6001600160a01b03851660009081526010602052604090205460ff1680156116f057506001600160a01b0384166000908152600f602052604090205460ff16155b15611760576008548311156117175760405162461bcd60e51b815260040161085490611f93565b600a546001600160a01b03851660009081526001602052604090205461173d908561209a565b111561175b5760405162461bcd60e51b815260040161085490611f93565b61182c565b6001600160a01b03841660009081526010602052604090205460ff1680156117a157506001600160a01b0385166000908152600f602052604090205460ff16155b156117c85760095483111561175b5760405162461bcd60e51b815260040161085490611f93565b6001600160a01b0384166000908152600f602052604090205460ff1661182c57600a546001600160a01b03851660009081526001602052604090205461180e908561209a565b111561182c5760405162461bcd60e51b815260040161085490611f93565b600654600090600160b01b900460ff1615801561188557506001600160a01b0386166000908152600e602052604090205460ff168061188357506001600160a01b0385166000908152600e602052604090205460ff165b155b90508015611948576001600160a01b03851660009081526010602052604081205460ff1680156118b757506000600d54115b156118dd576064600d54866118cc9190612018565b6118d6919061202f565b9050611929565b6001600160a01b03871660009081526010602052604090205460ff16801561190757506000600c54115b15611929576064600c548661191c9190612018565b611926919061202f565b90505b8015611946576119398186612087565b9450611946873083611a0f565b505b30600090815260016020526040902054600b5481101582801561198457506001600160a01b03881660009081526010602052604090205460ff16155b801561198d5750805b156119aa576007544311156119aa576119a582611b39565b436007555b6119b5888888611a0f565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316611a3a578060036000828254611a2f919061209a565b90915550611aac9050565b6001600160a01b03831660009081526001602052604090205481811015611a8d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610854565b6001600160a01b03841660009081526001602052604090209082900390555b6001600160a01b038216611ac857600380548290039055611ae7565b6001600160a01b03821660009081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b2c91815260200190565b60405180910390a3505050565b6006805460ff60b01b1916600160b01b179055604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611b8557611b85611fec565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2791906120ad565b81600181518110611c3a57611c3a611fec565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600b54600f611c6b9190612018565b905080841115611c79578093505b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611cce9087906000908790309042906004016120ca565b600060405180830381600087803b158015611ce857600080fd5b505af1158015611cfc573d6000803e3d6000fd5b50506006546040514793506001600160a01b0390911691508290600081818185875af1925050503d8060008114611d4f576040519150601f19603f3d011682016040523d82523d6000602084013e611d54565b606091505b50506006805460ff60b01b19169055505050505050565b602081526000825180602084015260005b81811015611d995760208186018101516040868401015201611d7c565b506000604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461108557600080fd5b60008060408385031215611de157600080fd5b8235611dec81611db9565b946020939093013593505050565b801515811461108557600080fd5b600080600060408486031215611e1d57600080fd5b833567ffffffffffffffff811115611e3457600080fd5b8401601f81018613611e4557600080fd5b803567ffffffffffffffff811115611e5c57600080fd5b8660208260051b8401011115611e7157600080fd5b602091820194509250840135611e8681611dfa565b809150509250925092565b600080600060608486031215611ea657600080fd5b8335611eb181611db9565b92506020840135611ec181611db9565b929592945050506040919091013590565b600060208284031215611ee457600080fd5b8135611eef81611dfa565b9392505050565b600060208284031215611f0857600080fd5b8135611eef81611db9565b600060208284031215611f2557600080fd5b5035919050565b60008060408385031215611f3f57600080fd5b8235611f4a81611db9565b91506020830135611f5a81611dfa565b809150509250929050565b60008060408385031215611f7857600080fd5b8235611f8381611db9565b91506020830135611f5a81611db9565b60208082526005908201526432b93937b960d91b604082015260600190565b600181811c90821680611fc657607f821691505b602082108103611fe657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761094157610941612002565b60008261204c57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561206357600080fd5b5051919050565b60006020828403121561207c57600080fd5b8151611eef81611dfa565b8181038181111561094157610941612002565b8082018082111561094157610941612002565b6000602082840312156120bf57600080fd5b8151611eef81611db9565b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b8181101561211c5783516001600160a01b03168352602093840193909201916001016120f5565b50506001600160a01b03959095166060840152505060800152939250505056fea264697066735822122071e4d18d87e0f2033e4e2ea74a4d01d55038f00b66c4f66a14d40666899dcf6564736f6c634300081a0033

Deployed Bytecode

0x6080604052600436106102535760003560e01c8063715018a611610138578063bc063e1a116100b0578063dd62ed3e11610077578063dd62ed3e14610750578063e2f4560514610796578063ef998cf0146107ac578063f2fde38b146107cc578063f53bc835146107ec578063f8b45b051461080c57005b8063bc063e1a146106ba578063c04a5414146106cf578063cb963728146106ef578063d5759ba31461070f578063dcf7aef31461073057005b80639a7a23d6116100ff5780639a7a23d6146105f4578063a9059cbb14610614578063ad29ffde14610634578063afa4f3b214610654578063b62496f514610674578063b8eb3546146106a457005b8063715018a61461056c57806372ac2486146105815780638da5cb5b146105a157806395927c25146105bf57806395d89b41146105df57005b806347062402116101cb5780635932ead1116101925780635932ead11461048f5780635cce86cd146104af5780635d0044ca146104df5780636ca541e5146104ff57806370a082311461052057806370db69d61461055657005b806347062402146103ea57806349bd5a5e146104005780634e6fd6c4146104345780634fbee1931461044a578063538ba4f91461047a57005b806318160ddd1161021a57806318160ddd1461033857806323b872dd146103575780632b14ca5614610377578063307aebc91461038d578063313ce567146103ae57806341aea9de146103ca57005b806301339c211461025c57806306fdde0314610271578063095ea7b31461029c578063106a5a8f146102cc5780631694505e146102ec57005b3661025a57005b005b34801561026857600080fd5b5061025a610822565b34801561027d57600080fd5b5061028661089b565b6040516102939190611d6b565b60405180910390f35b3480156102a857600080fd5b506102bc6102b7366004611dce565b61092d565b6040519015158152602001610293565b3480156102d857600080fd5b5061025a6102e7366004611e08565b610947565b3480156102f857600080fd5b506103207f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610293565b34801561034457600080fd5b506003545b604051908152602001610293565b34801561036357600080fd5b506102bc610372366004611e91565b610998565b34801561038357600080fd5b50610349600d5481565b34801561039957600080fd5b506006546102bc90600160b81b900460ff1681565b3480156103ba57600080fd5b5060405160128152602001610293565b3480156103d657600080fd5b5061025a6103e5366004611ed2565b6109bc565b3480156103f657600080fd5b50610349600c5481565b34801561040c57600080fd5b506103207f0000000000000000000000002c52ba1c6c368063379f2f1a48213117be378fcf81565b34801561044057600080fd5b5061032061dead81565b34801561045657600080fd5b506102bc610465366004611ef6565b600e6020526000908152604090205460ff1681565b34801561048657600080fd5b50610320600081565b34801561049b57600080fd5b5061025a6104aa366004611ed2565b610a1c565b3480156104bb57600080fd5b506102bc6104ca366004611ef6565b600f6020526000908152604090205460ff1681565b3480156104eb57600080fd5b5061025a6104fa366004611f13565b610a71565b34801561050b57600080fd5b506006546102bc90600160a81b900460ff1681565b34801561052c57600080fd5b5061034961053b366004611ef6565b6001600160a01b031660009081526001602052604090205490565b34801561056257600080fd5b5061034960085481565b34801561057857600080fd5b5061025a610aee565b34801561058d57600080fd5b5061025a61059c366004611ef6565b610b02565b3480156105ad57600080fd5b506000546001600160a01b0316610320565b3480156105cb57600080fd5b5061025a6105da366004611f13565b610b90565b3480156105eb57600080fd5b50610286610bf7565b34801561060057600080fd5b5061025a61060f366004611f2c565b610c06565b34801561062057600080fd5b506102bc61062f366004611dce565b610c55565b34801561064057600080fd5b5061025a61064f366004611e08565b610c63565b34801561066057600080fd5b5061025a61066f366004611f13565b610cae565b34801561068057600080fd5b506102bc61068f366004611ef6565b60106020526000908152604090205460ff1681565b3480156106b057600080fd5b5061034960095481565b3480156106c657600080fd5b50610349601981565b3480156106db57600080fd5b50600654610320906001600160a01b031681565b3480156106fb57600080fd5b5061025a61070a366004611ef6565b610d79565b34801561071b57600080fd5b506006546102bc90600160a01b900460ff1681565b34801561073c57600080fd5b5061025a61074b366004611f13565b610f66565b34801561075c57600080fd5b5061034961076b366004611f65565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156107a257600080fd5b50610349600b5481565b3480156107b857600080fd5b5061025a6107c7366004611f13565b610fcd565b3480156107d857600080fd5b5061025a6107e7366004611ef6565b61104a565b3480156107f857600080fd5b5061025a610807366004611f13565b611088565b34801561081857600080fd5b50610349600a5481565b61082a611105565b600654600160b81b900460ff161561085d5760405162461bcd60e51b815260040161085490611f93565b60405180910390fd5b6006805460ff60b81b1916600160b81b1790556040517f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266990600090a1565b6060600480546108aa90611fb2565b80601f01602080910402602001604051908101604052809291908181526020018280546108d690611fb2565b80156109235780601f106108f857610100808354040283529160200191610923565b820191906000526020600020905b81548152906001019060200180831161090657829003601f168201915b5050505050905090565b60003361093b818585611132565b60019150505b92915050565b61094f611105565b60005b828110156109925761098a84848381811061096f5761096f611fec565b90506020020160208101906109849190611ef6565b83611144565b600101610952565b50505050565b6000336109a68582856111a0565b6109b1858585611218565b506001949350505050565b6109c4611105565b60068054821515600160a01b0260ff60a01b199091161790556040517ff771b1e218dc92494b39e21852f9c24c3b448d6697c2b485cc1f0cff3c9ec78190610a1190831515815260200190565b60405180910390a150565b610a24611105565b60068054821515600160a81b0260ff60a81b199091161790556040517f381fb4c4aa72df83c60e7e567b9b6faf3fc2b05a6da932da9f071d63442c828f90610a1190831515815260200190565b610a79611105565b6103e8610a8560035490565b610a90906003612018565b610a9a919061202f565b811015610ab95760405162461bcd60e51b815260040161085490611f93565b600a8190556040518181527fa2c87c3e7a3048198ae94e814f6a27e12a4e2a7476e33a0db4d97ffeaf63618690602001610a11565b610af6611105565b610b006000611277565b565b610b0a611105565b6001600160a01b038116610b305760405162461bcd60e51b815260040161085490611f93565b600680546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f2b355c7f17401d9755d704a4cf6149a26deb56a381bb5d06c87b608183dbe09c91015b60405180910390a15050565b610b98611105565b6019811115610bb95760405162461bcd60e51b815260040161085490611f93565b600d80549082905560408051838152602081018390527f125b37650f21d088600cef1223439f6a8bd70800debfd486c503a8a2d19d4b019101610b84565b6060600580546108aa90611fb2565b610c0e611105565b6001600160a01b03821660009081526010602052604090205460ff1615610c475760405162461bcd60e51b815260040161085490611f93565b610c5182826112be565b5050565b60003361093b818585611218565b610c6b611105565b60005b8281101561099257610ca6848483818110610c8b57610c8b611fec565b9050602002016020810190610ca09190611ef6565b8361131a565b600101610c6e565b610cb6611105565b6000610cc160035490565b9050620f4240610cd2826001612018565b610cdc919061202f565b821015610cfb5760405162461bcd60e51b815260040161085490611f93565b6103e8610d09826005612018565b610d13919061202f565b821115610d325760405162461bcd60e51b815260040161085490611f93565b600b80549083905560408051848152602081018390527f190dc7c30bc62ef30e35c5f5512ad715a1bd03230f2d89c965249246c8d8ecca91015b60405180910390a1505050565b610d81611105565b3360006001600160a01b038316610e2a575047600081610db35760405162461bcd60e51b815260040161085490611f93565b6040516001600160a01b038416908390600081818185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b50508091505080610e245760405162461bcd60e51b815260040161085490611f93565b50610f27565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190612051565b905060008111610eb45760405162461bcd60e51b815260040161085490611f93565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015610f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f25919061206a565b505b604080516001600160a01b0385168152602081018390527f07c81a5e6d155913a9ed2ce53630058179c89fc94bb5de130620b0245c9f6a0b9101610d6c565b610f6e611105565b6019811115610f8f5760405162461bcd60e51b815260040161085490611f93565b600c80549082905560408051838152602081018390527f5fcc0eea159d45a3b8d481be746c9beed251431a542a5fed4484be37ab783e8d9101610b84565b610fd5611105565b6103e8610fe160035490565b610fec906002612018565b610ff6919061202f565b8110156110155760405162461bcd60e51b815260040161085490611f93565b60098190556040518181527f3c0ac525ebd597ae4e1201e687d8a7424b740a53b775b1527eb1c1936c1bd3b790602001610a11565b611052611105565b6001600160a01b03811661107c57604051631e4fbdf760e01b815260006004820152602401610854565b61108581611277565b50565b611090611105565b6103e861109c60035490565b6110a7906002612018565b6110b1919061202f565b8110156110d05760405162461bcd60e51b815260040161085490611f93565b60088190556040518181527f16fd9174d80e7089ed0c10c47c8079476be2ec28b97c4b40846cffd8a7aa9e9f90602001610a11565b6000546001600160a01b03163314610b005760405163118cdaa760e01b8152336004820152602401610854565b61113f8383836001611376565b505050565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527f4b89c347592b1d537e066cb4ed98d87696ae35164745d7e370e4add16941dc929101610b84565b6001600160a01b038381166000908152600260209081526040808320938616835292905220546000198114610992578181101561120957604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610854565b61099284848484036000611376565b6001600160a01b03831661124257604051634b637e8f60e11b815260006004820152602401610854565b6001600160a01b03821661126c5760405163ec442f0560e01b815260006004820152602401610854565b61113f83838361144b565b6000546001600160a01b0316801561129f5761129481600061131a565b61129f816000611144565b6112aa82600161131a565b6112b5826001611144565b610c51826119bf565b6001600160a01b038216600081815260106020908152604091829020805460ff19168515159081179091558251938452908301527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610b84565b6001600160a01b0382166000818152600e6020908152604091829020805460ff19168515159081179091558251938452908301527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101610b84565b6001600160a01b0384166113a05760405163e602df0560e01b815260006004820152602401610854565b6001600160a01b0383166113ca57604051634a1406b160e11b815260006004820152602401610854565b6001600160a01b038085166000908152600260209081526040808320938716835292905220829055801561099257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161143d91815260200190565b60405180910390a350505050565b6006543290600160b81b900460ff168061147d57506001600160a01b0384166000908152600f602052604090205460ff165b806114a057506001600160a01b0383166000908152600f602052604090205460ff165b6114bc5760405162461bcd60e51b815260040161085490611f93565b600654600090600160a01b900460ff1680156114e25750600654600160b01b900460ff16155b801561152a57506001600160a01b0385166000908152600f602052604090205460ff168061152857506001600160a01b0384166000908152600f602052604090205460ff165b155b9050801561182c576000546001600160a01b0386811691161480159061155e57506000546001600160a01b03858116911614155b801561157257506001600160a01b03841615155b801561158957506001600160a01b03841661dead14155b1561182c57600654600160a81b900460ff16156116af577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b03161415801561161457507f0000000000000000000000002c52ba1c6c368063379f2f1a48213117be378fcf6001600160a01b0316846001600160a01b031614155b156116af57611624600343612087565b6001600160a01b03831660009081526011602052604090205410801561166b5750611650600343612087565b6001600160a01b038516600090815260116020526040902054105b6116875760405162461bcd60e51b815260040161085490611f93565b6001600160a01b03808316600090815260116020526040808220439081905592871682529020555b6001600160a01b03851660009081526010602052604090205460ff1680156116f057506001600160a01b0384166000908152600f602052604090205460ff16155b15611760576008548311156117175760405162461bcd60e51b815260040161085490611f93565b600a546001600160a01b03851660009081526001602052604090205461173d908561209a565b111561175b5760405162461bcd60e51b815260040161085490611f93565b61182c565b6001600160a01b03841660009081526010602052604090205460ff1680156117a157506001600160a01b0385166000908152600f602052604090205460ff16155b156117c85760095483111561175b5760405162461bcd60e51b815260040161085490611f93565b6001600160a01b0384166000908152600f602052604090205460ff1661182c57600a546001600160a01b03851660009081526001602052604090205461180e908561209a565b111561182c5760405162461bcd60e51b815260040161085490611f93565b600654600090600160b01b900460ff1615801561188557506001600160a01b0386166000908152600e602052604090205460ff168061188357506001600160a01b0385166000908152600e602052604090205460ff165b155b90508015611948576001600160a01b03851660009081526010602052604081205460ff1680156118b757506000600d54115b156118dd576064600d54866118cc9190612018565b6118d6919061202f565b9050611929565b6001600160a01b03871660009081526010602052604090205460ff16801561190757506000600c54115b15611929576064600c548661191c9190612018565b611926919061202f565b90505b8015611946576119398186612087565b9450611946873083611a0f565b505b30600090815260016020526040902054600b5481101582801561198457506001600160a01b03881660009081526010602052604090205460ff16155b801561198d5750805b156119aa576007544311156119aa576119a582611b39565b436007555b6119b5888888611a0f565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316611a3a578060036000828254611a2f919061209a565b90915550611aac9050565b6001600160a01b03831660009081526001602052604090205481811015611a8d5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610854565b6001600160a01b03841660009081526001602052604090209082900390555b6001600160a01b038216611ac857600380548290039055611ae7565b6001600160a01b03821660009081526001602052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b2c91815260200190565b60405180910390a3505050565b6006805460ff60b01b1916600160b01b179055604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611b8557611b85611fec565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2791906120ad565b81600181518110611c3a57611c3a611fec565b60200260200101906001600160a01b031690816001600160a01b0316815250506000600b54600f611c6b9190612018565b905080841115611c79578093505b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611cce9087906000908790309042906004016120ca565b600060405180830381600087803b158015611ce857600080fd5b505af1158015611cfc573d6000803e3d6000fd5b50506006546040514793506001600160a01b0390911691508290600081818185875af1925050503d8060008114611d4f576040519150601f19603f3d011682016040523d82523d6000602084013e611d54565b606091505b50506006805460ff60b01b19169055505050505050565b602081526000825180602084015260005b81811015611d995760208186018101516040868401015201611d7c565b506000604082850101526040601f19601f83011684010191505092915050565b6001600160a01b038116811461108557600080fd5b60008060408385031215611de157600080fd5b8235611dec81611db9565b946020939093013593505050565b801515811461108557600080fd5b600080600060408486031215611e1d57600080fd5b833567ffffffffffffffff811115611e3457600080fd5b8401601f81018613611e4557600080fd5b803567ffffffffffffffff811115611e5c57600080fd5b8660208260051b8401011115611e7157600080fd5b602091820194509250840135611e8681611dfa565b809150509250925092565b600080600060608486031215611ea657600080fd5b8335611eb181611db9565b92506020840135611ec181611db9565b929592945050506040919091013590565b600060208284031215611ee457600080fd5b8135611eef81611dfa565b9392505050565b600060208284031215611f0857600080fd5b8135611eef81611db9565b600060208284031215611f2557600080fd5b5035919050565b60008060408385031215611f3f57600080fd5b8235611f4a81611db9565b91506020830135611f5a81611dfa565b809150509250929050565b60008060408385031215611f7857600080fd5b8235611f8381611db9565b91506020830135611f5a81611db9565b60208082526005908201526432b93937b960d91b604082015260600190565b600181811c90821680611fc657607f821691505b602082108103611fe657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761094157610941612002565b60008261204c57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561206357600080fd5b5051919050565b60006020828403121561207c57600080fd5b8151611eef81611dfa565b8181038181111561094157610941612002565b8082018082111561094157610941612002565b6000602082840312156120bf57600080fd5b8151611eef81611db9565b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b8181101561211c5783516001600160a01b03168352602093840193909201916001016120f5565b50506001600160a01b03959095166060840152505060800152939250505056fea264697066735822122071e4d18d87e0f2033e4e2ea74a4d01d55038f00b66c4f66a14d40666899dcf6564736f6c634300081a0033

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.