ETH Price: $3,482.22 (+5.61%)

Contract

0x755d61b9aCBC7FCc935E280291cD86cC1913af93
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve216469032025-01-17 21:28:4741 mins ago1737149327IN
0x755d61b9...C1913af93
0 ETH0.0005540911.92136795
Approve216440152025-01-17 11:48:3510 hrs ago1737114515IN
0x755d61b9...C1913af93
0 ETH0.000267825.76089034
Transfer216401902025-01-16 22:59:3523 hrs ago1737068375IN
0x755d61b9...C1913af93
0 ETH0.000342075.65492194
Approve216401742025-01-16 22:56:2323 hrs ago1737068183IN
0x755d61b9...C1913af93
0 ETH0.000305966.55082407
Approve216395682025-01-16 20:54:2325 hrs ago1737060863IN
0x755d61b9...C1913af93
0 ETH0.000348637.50098862
Transfer216390512025-01-16 19:10:5926 hrs ago1737054659IN
0x755d61b9...C1913af93
0 ETH0.0006845911.31942493
Approve216343002025-01-16 3:16:2342 hrs ago1736997383IN
0x755d61b9...C1913af93
0 ETH0.000085892.92254908
Approve216339532025-01-16 2:06:3544 hrs ago1736993195IN
0x755d61b9...C1913af93
0 ETH0.000259585.58495684
Approve216322232025-01-15 20:18:112 days ago1736972291IN
0x755d61b9...C1913af93
0 ETH0.000745316.03533906
Approve216298672025-01-15 12:25:352 days ago1736943935IN
0x755d61b9...C1913af93
0 ETH0.000139322.99606201
Approve216285082025-01-15 7:51:472 days ago1736927507IN
0x755d61b9...C1913af93
0 ETH0.000091233.10402062
Approve216260452025-01-14 23:36:472 days ago1736897807IN
0x755d61b9...C1913af93
0 ETH0.000327437.01047296
Approve216234072025-01-14 14:44:593 days ago1736865899IN
0x755d61b9...C1913af93
0 ETH0.0003615213.49213502
Approve216234032025-01-14 14:44:113 days ago1736865851IN
0x755d61b9...C1913af93
0 ETH0.0006392513.69002908
Approve216197132025-01-14 2:23:113 days ago1736821391IN
0x755d61b9...C1913af93
0 ETH0.000307326.57977745
Approve216166082025-01-13 15:58:354 days ago1736783915IN
0x755d61b9...C1913af93
0 ETH0.0005857812.59670202
Approve216144182025-01-13 8:37:594 days ago1736757479IN
0x755d61b9...C1913af93
0 ETH0.000286836.14118177
Transfer216139142025-01-13 6:56:114 days ago1736751371IN
0x755d61b9...C1913af93
0 ETH0.000161893.23415013
Approve216138352025-01-13 6:40:234 days ago1736750423IN
0x755d61b9...C1913af93
0 ETH0.000198334.24628555
Approve216137622025-01-13 6:25:234 days ago1736749523IN
0x755d61b9...C1913af93
0 ETH0.000183733.93377211
Approve216132552025-01-13 4:43:114 days ago1736743391IN
0x755d61b9...C1913af93
0 ETH0.000143773.09722968
Transfer216118182025-01-12 23:53:114 days ago1736725991IN
0x755d61b9...C1913af93
0 ETH0.000149852.47775415
Transfer216118122025-01-12 23:51:594 days ago1736725919IN
0x755d61b9...C1913af93
0 ETH0.000145482.40547134
Transfer216118092025-01-12 23:51:234 days ago1736725883IN
0x755d61b9...C1913af93
0 ETH0.000152752.5257527
Transfer216118072025-01-12 23:50:594 days ago1736725859IN
0x755d61b9...C1913af93
0 ETH0.000088542.04124205
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MedXToken

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 17 : MedXToken.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.24;

import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ERC20, ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";

import {IMedXToken} from "./interfaces/MedXToken/IMedXToken.sol";
import {UnsafeMath} from "./libraries/UnsafeMath.sol";

/// @title MedX ERC20 Token
/// @author PixelPlex Inc.
contract MedXToken is IMedXToken, ERC20Burnable, Ownable2Step, ReentrancyGuard {
    using UnsafeMath for uint256;

    /// @inheritdoc IMedXToken
    uint256 public constant BUY_FEE_PERCENT = 3;

    /// @inheritdoc IMedXToken
    uint256 public constant SELL_FEE_PERCENT = 3;

    /// @inheritdoc IMedXToken
    uint256 public immutable tradingEnableTime;

    /// @inheritdoc IMedXToken
    address public immutable weth;

    /// @inheritdoc IMedXToken
    address public immutable wethUniV2Pair;

    /// @inheritdoc IMedXToken
    IUniswapV2Router02 public immutable uniV2Router;

    bool private _tradingEnabled;
    /// @inheritdoc IMedXToken
    function tradingEnabled() external view returns (bool) {
        return _tradingEnabled || tradingEnableTime <= block.timestamp;
    }

    /// @inheritdoc IMedXToken
    bool public feeEnabled;

    /// @inheritdoc IMedXToken
    address public admin;

    /// @inheritdoc IMedXToken
    address payable public feeReceiver;

    /// @inheritdoc IMedXToken
    mapping(address => bool) public whitelisted;

    /// @inheritdoc IMedXToken
    mapping(address => bool) public blacklisted;

    /// @inheritdoc IMedXToken
    mapping(address => bool) public applyTax;

    /// @inheritdoc IMedXToken
    mapping(address => bool) public canBurn;

    constructor(
        address _owner,
        address payable _feeReceiver,
        IUniswapV2Router02 _uniV2Router,
        address usdt,
        uint256 _tradingEnableTime
    ) ERC20("MedXT", "$MedXT") Ownable(_owner) {
        address admin_ = msg.sender;
        _mint(admin_, 25e9 * 1e18);
        _setAdmin(admin_);
        _setFeeReceiver(_feeReceiver);
        _toggleFee(true);
        uniV2Router = _uniV2Router;
        tradingEnableTime = _tradingEnableTime;

        // `_tradingIsEnabled()` is called to set `tradingEnabled` variable
        // and emit `TradingEnabled` event if `_tradingEnableTime` lte `block.number`
        _tradingIsEnabled();

        weth = _uniV2Router.WETH();
        IUniswapV2Factory factory = IUniswapV2Factory(_uniV2Router.factory());
        address self = address(this);
        address _wethUniV2Pair = factory.createPair(self, weth);
        wethUniV2Pair = _wethUniV2Pair;
        address usdtUniV2Pair = factory.createPair(self, usdt);
        _updateTaxedList(_wethUniV2Pair, true);
        _updateTaxedList(usdtUniV2Pair, true);
        _approve(self, address(_uniV2Router), type(uint256).max);
    }

    // #region PUBLIC OVERRIDES

    /// @inheritdoc ERC20Burnable
    function burn(uint256 value) public override(ERC20Burnable) onlyBurner {
        super.burn(value);
    }

    /// @inheritdoc ERC20Burnable
    function burnFrom(address account, uint256 value) public override(ERC20Burnable) onlyBurner {
        super.burnFrom(account, value);
    }

    // #endregion

    // #region ADMIN & OWNER FUNCTIONS

    /// @inheritdoc IMedXToken
    function updateAdmin(address newAdmin) external onlyOwnerOrAdmin returns (bool changed) {
        return _setAdmin(newAdmin);
    }

    /// @inheritdoc IMedXToken
    function toggleFee(bool enable) external onlyOwnerOrAdmin returns (bool toggled) {
        return _toggleFee(enable);
    }

    /// @inheritdoc IMedXToken
    function updateFeeReceiver(address payable newFeeReceiver) external onlyOwnerOrAdmin returns (bool changed) {
        return _setFeeReceiver(newFeeReceiver);
    }

    /// @inheritdoc IMedXToken
    function updateWhitelist(
        address[] calldata removeFromWhitelist,
        address[] calldata addToWhitelist
    ) external onlyOwnerOrAdmin {
        uint256 removeListLength = removeFromWhitelist.length;
        for (uint256 i = 0; i < removeListLength; i++) _updateWhitelist(removeFromWhitelist[i], false);
        uint256 addListLength = addToWhitelist.length;
        for (uint256 i = 0; i < addListLength; i++) _updateWhitelist(addToWhitelist[i], true);
    }

    /// @inheritdoc IMedXToken
    function updateBlacklist(
        address[] calldata removeFromBlacklist,
        address[] calldata addToBlacklist
    ) external onlyOwnerOrAdmin {
        uint256 removeListLength = removeFromBlacklist.length;
        for (uint256 i = 0; i < removeListLength; i++) _updateBlacklist(removeFromBlacklist[i], false);
        uint256 addListLength = addToBlacklist.length;
        for (uint256 i = 0; i < addListLength; i++) _updateBlacklist(addToBlacklist[i], true);
    }

    /// @inheritdoc IMedXToken
    function updateTaxedAddresses(
        address[] calldata removeFromTaxedList,
        address[] calldata addToTaxedList
    ) external onlyOwnerOrAdmin {
        uint256 removeListLength = removeFromTaxedList.length;
        for (uint256 i = 0; i < removeListLength; i++) _updateTaxedList(removeFromTaxedList[i], false);
        uint256 addListLength = addToTaxedList.length;
        for (uint256 i = 0; i < addListLength; i++) _updateTaxedList(addToTaxedList[i], true);
    }

    /// @inheritdoc IMedXToken
    function updateBurnersList(
        address[] calldata removeFromBurnersList,
        address[] calldata addToBurnersList
    ) external onlyOwnerOrAdmin {
        uint256 removeListLength = removeFromBurnersList.length;
        for (uint256 i = 0; i < removeListLength; i++) _updateBurnersList(removeFromBurnersList[i], false);
        uint256 addListLength = addToBurnersList.length;
        for (uint256 i = 0; i < addListLength; i++) _updateBurnersList(addToBurnersList[i], true);
    }

    // #endregion

    // #region PRIVATE OVERRIDES

    function _update(address from, address to, uint256 value) internal override(ERC20) {
        if (blacklisted[from]) revert Blacklisted(from);
        if (blacklisted[to]) revert Blacklisted(to);
        if (!feeEnabled || whitelisted[from] || whitelisted[to] || from == address(this)) {
            return super._update(from, to, value);
        }
        if (applyTax[to]) _updateWithSellFee(from, to, value);
        else if (applyTax[from]) _updateWithBuyFee(from, to, value);
        else super._update(from, to, value);
    }

    // emit Approval event on transferFrom and burnFrom operations
    function _approve(address owner, address spender, uint256 value, bool) internal virtual override(ERC20) {
        super._approve(owner, spender, value, true);
    }

    // #endregion

    function _collectFee(address transferFrom, address transferTo, address feeFrom, uint256 feeValue) private {
        address _feeReceiver = feeReceiver;
        super._update(feeFrom, _feeReceiver, feeValue);
        emit FeeTokenCollected(transferFrom, transferTo, _feeReceiver, feeValue);
    }

    function _updateWithSellFee(address from, address to, uint256 value) private onlyEnabledTrading {
        uint256 fee = (value * SELL_FEE_PERCENT) / 100;
        value = value.unsafeSub(fee);
        _collectFee(from, to, from, fee);
        super._update(from, to, value);
    }

    // has nonReentrant modifier
    // slither-disable-next-line reentrancy-no-eth
    function _updateWithBuyFee(address from, address to, uint256 value) private nonReentrant onlyEnabledTrading {
        uint256 tokenFee = (value * BUY_FEE_PERCENT) / 100;
        value = value.unsafeSub(tokenFee);
        address self = address(this);
        super._update(from, self, tokenFee);
        (bool swapSucceed, uint256 ethFee) = _trySwapFeeToEth(tokenFee);
        if (swapSucceed) emit FeeEthCollected(from, to, feeReceiver, tokenFee, ethFee);
        else _collectFee(from, to, self, tokenFee);
        super._update(from, to, value);
    }

    function _trySwapFeeToEth(uint256 value) private returns (bool success, uint256 amountOut) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = weth;
        try uniV2Router.swapExactTokensForETH(value, 1e-6 ether, path, feeReceiver, block.timestamp) returns (
            uint256[] memory amounts
        ) {
            return (true, amounts[1]);
        } catch (bytes memory reason) {
            // event is emitted if call reverted, so reentrancy is not possible here
            // slither-disable-next-line reentrancy-events
            emit FeeSwapFailed(value, reason);
            return (false, 0);
        }
    }

    function _toggleFee(bool enabled) private returns (bool toggled) {
        if (feeEnabled == enabled) return false;
        if (enabled && feeReceiver == address(0)) revert InvalidFeeReceiver();
        feeEnabled = enabled;
        emit FeeToggled(enabled);
        return true;
    }

    function _setFeeReceiver(address payable newFeeReceiver) private returns (bool changed) {
        address prevFeeReceiver = feeReceiver;
        if (prevFeeReceiver == newFeeReceiver) return false;
        if (newFeeReceiver == address(0) && feeEnabled) revert InvalidFeeReceiver();
        emit FeeReceiverUpdated(prevFeeReceiver, newFeeReceiver);
        feeReceiver = newFeeReceiver;
        return true;
    }

    function _updateWhitelist(address account, bool whitelist) private {
        if (whitelisted[account] == whitelist) return;
        if (applyTax[account]) revert InvalidWhitelistedAccount(account);
        whitelisted[account] = whitelist;
        emit WhitelistUpdated(account, whitelist);
    }

    function _updateBlacklist(address account, bool blacklist) private {
        if (blacklisted[account] == blacklist) return;
        if (account == address(this) || account == wethUniV2Pair) revert InvalidBlacklistedAccount(account);
        blacklisted[account] = blacklist;
        emit BlacklistUpdated(account, blacklist);
    }

    function _updateTaxedList(address account, bool taxed) private {
        if (applyTax[account] == taxed) return;
        if (taxed) _updateWhitelist(account, false);
        applyTax[account] = taxed;
        emit TaxedListUpdated(account, taxed);
    }

    function _updateBurnersList(address account, bool _canBurn) private {
        if (canBurn[account] == _canBurn) return;
        canBurn[account] = _canBurn;
        emit BurnersListUpdated(account, _canBurn);
    }

    function _setAdmin(address newAdmin) private returns (bool changed) {
        address prevAdmin = admin;
        if (prevAdmin == newAdmin) return false;
        emit AdminUpdated(prevAdmin, newAdmin);
        admin = newAdmin;
        return true;
    }

    /// @dev Is not a view function, because it enables fee using cache-variable `_tradingEnabled`
    function _tradingIsEnabled() private returns (bool) {
        if (_tradingEnabled) return true;
        if (tradingEnableTime > block.timestamp) return false;
        _tradingEnabled = true;
        emit TradingEnabled();
        return true;
    }

    modifier onlyOwnerOrAdmin() {
        address caller = msg.sender;
        if (caller != owner() && caller != admin) revert OwnerOrAdminUnauthorizedAccount(caller);
        _;
    }

    modifier onlyBurner() {
        address caller = msg.sender;
        if (!canBurn[caller]) revert BurnerUnauthorizedAccount(caller);
        _;
    }

    modifier onlyEnabledTrading() {
        if (!_tradingIsEnabled()) revert TradingIsDisabled(tradingEnableTime, block.timestamp);
        _;
    }
}

File 2 of 17 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.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);
    }
}

File 3 of 17 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.20;

import {Ownable} from "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is specified at deployment time in the constructor for `Ownable`. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

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

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

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        if (pendingOwner() != sender) {
            revert OwnableUnauthorizedAccount(sender);
        }
        _transferOwnership(sender);
    }
}

File 4 of 17 : draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @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);
}

File 5 of 17 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.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 account => uint256) private _balances;

    mapping(address account => mapping(address spender => 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);
            }
        }
    }
}

File 6 of 17 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;

import {ERC20} from "../ERC20.sol";
import {Context} from "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, deducting from
     * the caller's allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

File 7 of 17 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.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);
}

File 8 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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);
}

File 9 of 17 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 10 of 17 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 11 of 17 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 12 of 17 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 13 of 17 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 14 of 17 : IMedXToken.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.24;

import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IMedXTokenEvents} from "./IMedXTokenEvents.sol";
import {IMedXTokenErrors} from "./IMedXTokenErrors.sol";

/// @title Interface of the MedX token contract
/// @author PixelPlex Inc.
interface IMedXToken is IMedXTokenEvents, IMedXTokenErrors {
    // #region public constants
    // solhint-disable func-name-mixedcase
    // slither-disable-start naming-convention

    /// @notice Fee percent on buy
    function BUY_FEE_PERCENT() external pure returns (uint256);

    /// @notice Fee percent on sell
    function SELL_FEE_PERCENT() external pure returns (uint256);

    // slither-disable-end naming-convention
    // solhint-enable func-name-mixedcase
    // #endregion

    /// @dev When contract is deployed, trading on [MedX<=>USDT] and [MedX<=>WETH] Uniswap V2 pairs are disabled
    /// @dev This is used to prevent sniping on release
    /// @dev Trading is always enabled for whitelisted accounts
    /// @return tradingEnableTime Timestamp when trading becomes enabled
    function tradingEnableTime() external view returns (uint256);

    /// @return weth The address of the wrapped ETH contract
    function weth() external view returns (address);

    /// @return wethUniV2Pair The address of the [MEDX<=>WETH] Uniswap V2 pair
    function wethUniV2Pair() external view returns (address);

    /// @return uniV2Router The address of the Uniswap V2 router (Router02)
    function uniV2Router() external view returns (IUniswapV2Router02);

    /// @dev see: IMedXToken#tradingEnableTime
    /// @return tradingEnabled Equals `true` if trading is enabled
    function tradingEnabled() external view returns (bool);

    /// @return feeEnabled Equals `true` if the fee feature is enabled, `false` otherwise
    function feeEnabled() external view returns (bool);

    /// @return admin The address of the admin
    function admin() external view returns (address);

    /// @return feeReceiver The address of the fee receiver
    function feeReceiver() external view returns (address payable);

    /// @notice Checks if an account is whitelisted, meaning the trading fee is not applicable to it
    /// @param account The address of the account to check whitelisting for
    /// @return whitelisted_ Equals `true` if the account is whitelisted, `false` otherwise
    function whitelisted(address account) external view returns (bool whitelisted_);

    /// @notice Checks if an account is blacklisted and cannot send or receive MedX tokens
    /// @param account The address of the account to check blacklisting for
    /// @return blacklisted_ Equals `true` if the account is blacklisted, `false` otherwise
    function blacklisted(address account) external view returns (bool blacklisted_);

    /// @notice Checks if an account is a taxable DEX, to which a fee should be applied
    /// @dev When tokens are sent to the DEX, it is considered a buy operation and 3% of the sent tokens will be
    /// sent to the fee receiver.
    /// @dev When tokens are received from the DEX, it is considered a sell operation and 3% of the received
    /// tokens will be swapped to ETH and sent to the fee receiver.
    /// @param account The address of the account to check if it is a taxable DEX
    /// @return applyTax_ Equals `true` if the account is a taxable DEX, `false` otherwise
    function applyTax(address account) external view returns (bool applyTax_);

    /// @notice Checks if an account is in the burners list
    /// @param account The address of the account to check if it is in the burners list
    /// @return canBurn_ Equals `true` if the account can burn tokens
    function canBurn(address account) external view returns (bool canBurn_);

    // #region ADMIN & OWNER FUNCTIONS

    /// @notice Changes the address of the admin
    /// @dev Can only be called by the owner or the admin
    /// @dev Will succeed, but will not emit any event if the current admin equals `newAdmin`
    /// @param newAdmin The address of the new admin
    /// @return changed Equals `true` if the fee receiver is updated, `false` otherwise
    function updateAdmin(address newAdmin) external returns (bool changed);

    /// @notice Enables or disables the fee feature
    /// @dev Can only be called by the owner or the admin
    /// @dev Will succeed, but will not emit any event if the current fee feature state equals `enabled`
    /// @param enabled Should equal `true` if the fee feature should be enabled, `false` otherwise
    /// @return toggled Equals `true` if the fee feature was toggled, `false` otherwise
    function toggleFee(bool enabled) external returns (bool toggled);

    /// @notice Changes the address of the fee receiver
    /// @dev Can only be called by the owner or the admin
    /// @dev Will succeed, but will not emit any event if the current fee receiver equals `newFeeReceiver`
    /// @param newFeeReceiver The address of the new fee receiver
    /// @return changed Equals `true` if the fee receiver is updated, `false` otherwise
    function updateFeeReceiver(address payable newFeeReceiver) external returns (bool changed);

    /// @notice Updates the whitelist
    /// @dev Can only be called by the owner or the admin
    /// @dev The function will not check if the same address is in both parameters. In this case, the address
    /// will be whitelisted.
    /// @param removeFromWhitelist The list of addresses to be removed from the whitelist
    /// @param addToWhitelist The list of addresses to be added to the whitelist
    function updateWhitelist(address[] calldata removeFromWhitelist, address[] calldata addToWhitelist) external;

    /// @notice Updates the blacklist
    /// @dev Can only be called by the owner or the admin
    /// @dev The function will not check if the same address is in both parameters. In this case, the address
    /// will be blacklisted.
    /// @param removeFromBlacklist The list of addresses to be removed from the blacklist
    /// @param addToBlacklist The list of addresses to be added to the blacklist
    function updateBlacklist(address[] calldata removeFromBlacklist, address[] calldata addToBlacklist) external;

    /// @notice Updates the list of taxable DEX addresses
    /// @dev Can only be called by the owner or the admin
    /// @dev The function will not check if the same address is in both parameters. In this case, the address
    /// will be added to the list.
    /// @param removeFromTaxedList The list of addresses to be removed from the list of taxable DEX addresses
    /// @param addToTaxedList The list of addresses to be added to the list of taxable DEX addresses
    function updateTaxedAddresses(address[] calldata removeFromTaxedList, address[] calldata addToTaxedList) external;

    /// @notice Updates the list of addresses, that can burn tokens
    /// @dev Can only be called by the owner or the admin
    /// @dev The function will not check if the same address is in both parameters. In this case, the address
    /// will be added to the list.
    /// @param removeFromBurnersList The list of addresses to be removed from the burners list
    /// @param addToBurnersList The list of addresses to be added to the burners list
    function updateBurnersList(address[] calldata removeFromBurnersList, address[] calldata addToBurnersList) external;

    // #endregion
}

File 15 of 17 : IMedXTokenErrors.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.24;

/// @title Errors of the MedX token contract
/// @author PixelPlex Inc.
interface IMedXTokenErrors {
    /// @notice Indicates that trading currently is disabled for non-whitelisted accounts
    /// @param tradingEnableTime The timestamp of trading enable
    /// @param currentTime The current timestamp
    error TradingIsDisabled(uint256 tradingEnableTime, uint256 currentTime);

    /// @notice Indicates that provided address is taxed and can not be added to the whitelist
    /// @param account Address of the account to be whitelisted
    error InvalidWhitelistedAccount(address account);

    /// @notice Indicates that provided account can not be added to the blacklist
    /// @param account Address of the account to be blacklisted
    error InvalidBlacklistedAccount(address account);

    /// @notice Indicates that the sender or the receiver is blacklisted
    /// @param account Address of the blacklisted account
    error Blacklisted(address account);

    /// @notice Indicates that the fee receiver is zero address
    /// @dev Fee receiver can be zero address only if the fee feature is disable
    error InvalidFeeReceiver();

    /// @notice Indicates that the function was called by an account that is not the fee receiver
    /// @param account Address of the account that called the function
    error FeeReceiverUnauthorizedAccount(address account);

    /// @notice Indicates that the function was called by an account that is not the owner nor the admin
    /// @param account Address of the account that called the function
    error OwnerOrAdminUnauthorizedAccount(address account);

    /// @notice Indicates that the function was called by an account that is not a burner
    /// @param account Address of the account that called the function
    error BurnerUnauthorizedAccount(address account);
}

File 16 of 17 : IMedXTokenEvents.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.24;

/// @title Events of MedX token contract
/// @author PixelPlex Inc.
interface IMedXTokenEvents {
    /// @notice Emitted when the admin address is updated
    /// @param previousAdmin The address of previous admin
    /// @param newAdmin The address of the new admin
    event AdminUpdated(address indexed previousAdmin, address indexed newAdmin);

    /// @notice Emitted when trading by non-whitelisted accounts are enabled
    event TradingEnabled();

    // #region FEE EVENTS

    /// @notice Emitted when the fee feature is toggled
    /// @param enabled `true` if fee is enabled, `false` otherwise
    event FeeToggled(bool indexed enabled);

    /// @notice Emitted when the fee receiver is updated
    /// @param prevFeeReceiver Address of previous fee receiver
    /// @param newFeeReceiver Address of the new fee receiver
    event FeeReceiverUpdated(address indexed prevFeeReceiver, address indexed newFeeReceiver);

    /// @notice Emitted when fee is collected in MedX tokens
    /// @dev Whenever the user sells MedX tokens the contract charges the fee and sends it to the fee receiver
    /// @param transferFrom Address of the account that sent tokens
    /// @param transferTo Address of the account that received tokens
    /// @param feeReceiver Address of the account that received the fee (current fee receiver)
    /// @param feeValue Amount of tokens that were charged as a fee
    event FeeTokenCollected(
        address indexed transferFrom,
        address indexed transferTo,
        address indexed feeReceiver,
        uint256 feeValue
    );

    /// @notice Emitted when swapping MedX tokens to ETH is failed
    /// @dev Whenever the user buys MedX tokens the contract tries to swap the fee to ETH using UniswapV2
    /// @param amountIn Amount of tokens that were charged as a fee
    /// @param reason Reason of the swap's failure
    event FeeSwapFailed(uint256 amountIn, bytes reason);

    /// @notice Emitted when fee is collected in ETH
    /// @dev Whenever the user buys MedX tokens the contract swaps fee to ETH using UniswapV2.
    /// @dev Swapped ETH is sent to the fee receiver.
    /// @param transferFrom Address of the account that sent tokens
    /// @param transferTo Address of the account that received tokens
    /// @param feeReceiver Address of the account that received the fee (current fee receiver)
    /// @param tokenFeeValue Amount of tokens that were charged as a fee
    /// @param ethFeeValue Amount of ETH received from the swap
    event FeeEthCollected(
        address indexed transferFrom,
        address indexed transferTo,
        address indexed feeReceiver,
        uint256 tokenFeeValue,
        uint256 ethFeeValue
    );

    // #endregion

    /// @notice Emitted when an address is added to or removed from the whitelist
    /// @param account Address of the account that was added to or removed from the whitelist
    /// @param whitelisted `true` if account is added to whitelist, `false` if it was removed
    event WhitelistUpdated(address indexed account, bool indexed whitelisted);

    /// @notice Emitted when an address is added to or removed from the blacklist
    /// @param account Address of the account, that was added to or removed from the blacklist
    /// @param blacklisted `true` if account is added to blacklist, `false` if it was removed
    event BlacklistUpdated(address indexed account, bool indexed blacklisted);

    /// @notice Emitted when an address is added to or removed from the tax list
    /// @param account Address of the account, that was added to or removed from the tax list
    /// @param taxed `true` if account is added to tax list, `false` if it was removed
    event TaxedListUpdated(address indexed account, bool indexed taxed);

    /// @notice Emitted when an address is added to or removed from the burners list
    /// @param account Address of the account, that was added to or removed from the burners list
    /// @param canBurn `true` if account is added to the burners list, `false` if it was removed
    event BurnersListUpdated(address indexed account, bool indexed canBurn);
}

File 17 of 17 : UnsafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.24;

library UnsafeMath {
    function unsafeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            return a + b;
        }
    }

    function unsafeSub(uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            return a - b;
        }
    }

    function unsafeMul(uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            return a * b;
        }
    }

    function unsafeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            return a / b;
        }
    }

    function unsafeDivCeil(uint256 a, uint256 b) internal pure returns (uint256) {
        unchecked {
            uint256 result = a / b;
            return a % b > 0 ? result + 1 : result;
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address payable","name":"_feeReceiver","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"_uniV2Router","type":"address"},{"internalType":"address","name":"usdt","type":"address"},{"internalType":"uint256","name":"_tradingEnableTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"Blacklisted","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"BurnerUnauthorizedAccount","type":"error"},{"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":"account","type":"address"}],"name":"FeeReceiverUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"InvalidBlacklistedAccount","type":"error"},{"inputs":[],"name":"InvalidFeeReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"InvalidWhitelistedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnerOrAdminUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"uint256","name":"tradingEnableTime","type":"uint256"},{"internalType":"uint256","name":"currentTime","type":"uint256"}],"name":"TradingIsDisabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"canBurn","type":"bool"}],"name":"BurnersListUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transferFrom","type":"address"},{"indexed":true,"internalType":"address","name":"transferTo","type":"address"},{"indexed":true,"internalType":"address","name":"feeReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenFeeValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethFeeValue","type":"uint256"}],"name":"FeeEthCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevFeeReceiver","type":"address"},{"indexed":true,"internalType":"address","name":"newFeeReceiver","type":"address"}],"name":"FeeReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"FeeSwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"}],"name":"FeeToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transferFrom","type":"address"},{"indexed":true,"internalType":"address","name":"transferTo","type":"address"},{"indexed":true,"internalType":"address","name":"feeReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeValue","type":"uint256"}],"name":"FeeTokenCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"taxed","type":"bool"}],"name":"TaxedListUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"BUY_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELL_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","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":"","type":"address"}],"name":"applyTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"toggleFee","outputs":[{"internalType":"bool","name":"toggled","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnableTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uniV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateAdmin","outputs":[{"internalType":"bool","name":"changed","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"removeFromBlacklist","type":"address[]"},{"internalType":"address[]","name":"addToBlacklist","type":"address[]"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"removeFromBurnersList","type":"address[]"},{"internalType":"address[]","name":"addToBurnersList","type":"address[]"}],"name":"updateBurnersList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFeeReceiver","type":"address"}],"name":"updateFeeReceiver","outputs":[{"internalType":"bool","name":"changed","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"removeFromTaxedList","type":"address[]"},{"internalType":"address[]","name":"addToTaxedList","type":"address[]"}],"name":"updateTaxedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"removeFromWhitelist","type":"address[]"},{"internalType":"address[]","name":"addToWhitelist","type":"address[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethUniV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b50604051620034d1380380620034d1833981016040819052620000359162000f92565b8460405180604001604052806005815260200164135959161560da1b8152506040518060400160405280600681526020016509135959161560d21b8152508160039081620000849190620010ac565b506004620000938282620010ac565b5050506001600160a01b038116620000c657604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000d18162000356565b50600160075533620000f0816b50c783eb9b5c85f2a800000062000374565b620000fb81620003b2565b5062000107856200044b565b5062000114600162000514565b506001600160a01b03841660e052608082905262000131620005b9565b50836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000197919062001178565b6001600160a01b031660a0816001600160a01b0316815250506000846001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000217919062001178565b60a0516040516364e329cb60e11b815230600482018190526001600160a01b03928316602483015292935060009184169063c9c65396906044016020604051808303816000875af115801562000271573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000297919062001178565b6001600160a01b0381811660c0526040516364e329cb60e11b8152848216600482015288821660248201529192506000919085169063c9c65396906044016020604051808303816000875af1158015620002f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200031b919062001178565b90506200032a8260016200061b565b620003378160016200061b565b620003468389600019620006b0565b50505050505050505050620013b5565b600680546001600160a01b03191690556200037181620006c4565b50565b6001600160a01b038216620003a05760405163ec442f0560e01b815260006004820152602401620000bd565b620003ae6000838362000716565b5050565b6008546000906001600160a01b036201000090910481169083168103620003dc5750600092915050565b826001600160a01b0316816001600160a01b03167f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b60405160405180910390a35050600880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055600190565b6009546000906001600160a01b0390811690831681036200046f5750600092915050565b6001600160a01b0383161580156200048e5750600854610100900460ff165b15620004ad57604051633480121760e21b815260040160405180910390fd5b826001600160a01b0316816001600160a01b03167fa92ff4390fe6943f0b30e8fe715dde86f85ab79b2b2c640a10fc094cc4036cc860405160405180910390a35050600980546001600160a01b0319166001600160a01b0392909216919091179055600190565b6000811515600860019054906101000a900460ff161515036200053957506000919050565b8180156200055057506009546001600160a01b0316155b156200056f57604051633480121760e21b815260040160405180910390fd5b6008805461ff001916610100841515908102919091179091556040517ff6dd3d5757de9286321e4c4c156cfab73bcf637c3b2815bd90d55e5a74e0b31390600090a2506001919050565b60085460009060ff1615620005ce5750600190565b426080511115620005df5750600090565b6008805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150600190565b6001600160a01b0382166000908152600c602052604090205481151560ff90911615150362000648575050565b80156200065c576200065c82600062000890565b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917f66bcab33b38ffa6a535483c985bbdb2b7d0791d9a1642bbcdb51ca9ef6ad27b891a35050565b620006bf838383600162000958565b505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166000908152600b602052604090205460ff161562000760576040516001620b633d60e31b031981526001600160a01b0384166004820152602401620000bd565b6001600160a01b0382166000908152600b602052604090205460ff1615620007aa576040516001620b633d60e31b031981526001600160a01b0383166004820152602401620000bd565b600854610100900460ff161580620007da57506001600160a01b0383166000908152600a602052604090205460ff165b80620007fe57506001600160a01b0382166000908152600a602052604090205460ff165b806200081257506001600160a01b03831630145b156200082557620006bf8383836200096d565b6001600160a01b0382166000908152600c602052604090205460ff16156200085457620006bf83838362000aa0565b6001600160a01b0383166000908152600c602052604090205460ff16156200088357620006bf83838362000b1e565b620006bf8383836200096d565b6001600160a01b0382166000908152600a602052604090205481151560ff909116151503620008bd575050565b6001600160a01b0382166000908152600c602052604090205460ff16156200090457604051632d388f8960e01b81526001600160a01b0383166004820152602401620000bd565b6001600160a01b0382166000818152600a6020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b62000967848484600162000c37565b50505050565b6001600160a01b0383166200099c578060026000828254620009909190620011b5565b9091555062000a109050565b6001600160a01b03831660009081526020819052604090205481811015620009f15760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000bd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821662000a2e5760028054829003905562000a4d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a9391815260200190565b60405180910390a3505050565b62000aaa620005b9565b62000ad657608051604051637d6f261b60e01b81526004810191909152426024820152604401620000bd565b6000606462000ae7600384620011cb565b62000af39190620011e5565b905062000b01828262000d12565b915062000b118484818462000d1c565b620009678484846200096d565b62000b2862000d94565b62000b32620005b9565b62000b5e57608051604051637d6f261b60e01b81526004810191909152426024820152604401620000bd565b6000606462000b6f600384620011cb565b62000b7b9190620011e5565b905062000b89828262000d12565b91503062000b998582846200096d565b60008062000ba78462000dbf565b91509150811562000c085760095460408051868152602081018490526001600160a01b039283169289811692908b16917f72f1c7890d9a85f50b5284898d72fa2f2c9ae6b94cf0e85447bda3b79a9eed4a910160405180910390a462000c16565b62000c168787858762000d1c565b62000c238787876200096d565b50505050620006bf62000f7560201b60201c565b6001600160a01b03841662000c635760405163e602df0560e01b815260006004820152602401620000bd565b6001600160a01b03831662000c8f57604051634a1406b160e11b815260006004820152602401620000bd565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156200096757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000d0491815260200190565b60405180910390a350505050565b8082035b92915050565b6009546001600160a01b031662000d358382846200096d565b806001600160a01b0316846001600160a01b0316866001600160a01b03167f581561b91b50e15abb3b3a5f88f281f2671178420589f2e8e3c8b7551783ab128560405162000d8591815260200190565b60405180910390a45050505050565b60026007540362000db857604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b604080516002808252606082018352600092839283929091602083019080368337019050509050308160008151811062000dfd5762000dfd62001208565b60200260200101906001600160a01b031690816001600160a01b03168152505060a0518160018151811062000e365762000e3662001208565b6001600160a01b03928316602091820292909201015260e0516009546040516318cbafe560e01b8152918316926318cbafe59262000e8892899264e8d4a510009288929091169042906004016200121e565b6000604051808303816000875af192505050801562000ecb57506040513d6000823e601f3d908101601f1916820160405262000ec8919081019062001293565b60015b62000f4a573d80801562000efc576040519150601f19603f3d011682016040523d82523d6000602084013e62000f01565b606091505b507f9b22231c5dcd7d242b996a86a0ed19eae40cedefcb426de68a320cb4415dcf24858260405162000f359291906200135c565b60405180910390a15060009485945092505050565b60018160018151811062000f625762000f6262001208565b6020026020010151935093505050915091565b6001600755565b6001600160a01b03811681146200037157600080fd5b600080600080600060a0868803121562000fab57600080fd5b855162000fb88162000f7c565b602087015190955062000fcb8162000f7c565b604087015190945062000fde8162000f7c565b606087015190935062000ff18162000f7c565b80925050608086015190509295509295909350565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200103157607f821691505b6020821081036200105257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006bf576000816000526020600020601f850160051c81016020861015620010835750805b601f850160051c820191505b81811015620010a4578281556001016200108f565b505050505050565b81516001600160401b03811115620010c857620010c862001006565b620010e081620010d984546200101c565b8462001058565b602080601f831160018114620011185760008415620010ff5750858301515b600019600386901b1c1916600185901b178555620010a4565b600085815260208120601f198616915b82811015620011495788860151825594840194600190910190840162001128565b5085821015620011685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200118b57600080fd5b8151620011988162000f7c565b9392505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000d165762000d166200119f565b808202811582820484141762000d165762000d166200119f565b6000826200120357634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015620012725784516001600160a01b0316835293830193918301916001016200124b565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215620012a757600080fd5b82516001600160401b0380821115620012bf57600080fd5b818501915085601f830112620012d457600080fd5b815181811115620012e957620012e962001006565b8060051b604051601f19603f8301168101818110858211171562001311576200131162001006565b6040529182528482019250838101850191888311156200133057600080fd5b938501935b82851015620013505784518452938501939285019262001335565b98975050505050505050565b8281526000602060406020840152835180604085015260005b81811015620013935785810183015185820160600152820162001375565b506000606082860101526060601f19601f830116850101925050509392505050565b60805160a05160c05160e0516120b162001420600039600081816104060152611b160152600081816103bb01526113000152600081816102c90152611abc015260008181610340015281816106cd015281816117c801528181611854015261195901526120b16000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c8063958c2e5211610130578063d936547e116100b8578063e2f273bd1161007c578063e2f273bd1461053b578063e30c39781461054e578063e61e90f61461055f578063f2fde38b14610572578063f851a4401461058557600080fd5b8063d936547e146104a9578063dbac26e9146104cc578063dd62ed3e146104ef578063de530cfc14610528578063df2c0e291461043057600080fd5b8063a771ebc7116100ff578063a771ebc71461044b578063a9059cbb1461045d578063b3f0067414610470578063c69bebe414610483578063c7cd469a1461049657600080fd5b8063958c2e521461040157806395d89b4114610428578063a075429914610430578063a3673ac11461043857600080fd5b80634513de53116101b357806379ba50971161018257806379ba50971461039b57806379cc6790146103a357806383ceb55b146103b6578063868e4c61146103dd5780638da5cb5b146103f057600080fd5b80634513de531461033b5780634ada218b1461036257806370a082311461036a578063715018a61461039357600080fd5b8063313ce567116101fa578063313ce567146102925780633820a686146102a15780633fc8cef3146102c45780634227715e1461030357806342966c681461032657600080fd5b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461026d57806323b872dd1461027f575b600080fd5b61023461059e565b6040516102419190611c82565b60405180910390f35b61025d610258366004611cb1565b610630565b6040519015158152602001610241565b6002545b604051908152602001610241565b61025d61028d366004611cdd565b61064a565b60405160128152602001610241565b61025d6102af366004611d1e565b600d6020526000908152604090205460ff1681565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610241565b61025d610311366004611d1e565b600c6020526000908152604090205460ff1681565b610339610334366004611d3b565b61066e565b005b6102717f000000000000000000000000000000000000000000000000000000000000000081565b61025d6106bb565b610271610378366004611d1e565b6001600160a01b031660009081526020819052604090205490565b6103396106f4565b610339610708565b6103396103b1366004611cb1565b61074c565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b61025d6103eb366004611d54565b610796565b6005546001600160a01b03166102eb565b6102eb7f000000000000000000000000000000000000000000000000000000000000000081565b61023461081b565b610271600381565b610339610446366004611dc2565b61082a565b60085461025d90610100900460ff1681565b61025d61046b366004611cb1565b610930565b6009546102eb906001600160a01b031681565b61025d610491366004611d1e565b61093e565b6103396104a4366004611dc2565b6109ba565b61025d6104b7366004611d1e565b600a6020526000908152604090205460ff1681565b61025d6104da366004611d1e565b600b6020526000908152604090205460ff1681565b6102716104fd366004611e2e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610339610536366004611dc2565b610ab6565b61025d610549366004611d1e565b610bb2565b6006546001600160a01b03166102eb565b61033961056d366004611dc2565b610c2e565b610339610580366004611d1e565b610d2a565b6008546102eb906201000090046001600160a01b031681565b6060600380546105ad90611e67565b80601f01602080910402602001604051908101604052809291908181526020018280546105d990611e67565b80156106265780601f106105fb57610100808354040283529160200191610626565b820191906000526020600020905b81548152906001019060200180831161060957829003601f168201915b5050505050905090565b60003361063e818585610d9b565b60019150505b92915050565b600033610658858285610da8565b610663858585610e26565b506001949350505050565b336000818152600d602052604090205460ff166106ae57604051637c11f1eb60e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6106b782610e85565b5050565b60085460009060ff16806106ef5750427f000000000000000000000000000000000000000000000000000000000000000011155b905090565b6106fc610e8f565b6107066000610ebc565b565b60065433906001600160a01b031681146107405760405163118cdaa760e01b81526001600160a01b03821660048201526024016106a5565b61074981610ebc565b50565b336000818152600d602052604090205460ff1661078757604051637c11f1eb60e01b81526001600160a01b03821660048201526024016106a5565b6107918383610ed5565b505050565b6000336107ab6005546001600160a01b031690565b6001600160a01b0316816001600160a01b0316141580156107e057506008546001600160a01b03828116620100009092041614155b156108095760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b61081283610eea565b91505b50919050565b6060600480546105ad90611e67565b3361083d6005546001600160a01b031690565b6001600160a01b0316816001600160a01b03161415801561087257506008546001600160a01b03828116620100009092041614155b1561089b5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b818110156108e0576108d88787838181106108bc576108bc611e9b565b90506020020160208101906108d19190611d1e565b6000610f8c565b60010161089f565b508260005b818110156109265761091e86868381811061090257610902611e9b565b90506020020160208101906109179190611d1e565b6001610f8c565b6001016108e5565b5050505050505050565b60003361063e818585610e26565b6000336109536005546001600160a01b031690565b6001600160a01b0316816001600160a01b03161415801561098857506008546001600160a01b03828116620100009092041614155b156109b15760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b6108128361101d565b336109cd6005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610a0257506008546001600160a01b03828116620100009092041614155b15610a2b5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610a7057610a68878783818110610a4c57610a4c611e9b565b9050602002016020810190610a619190611d1e565b60006110e3565b600101610a2f565b508260005b8181101561092657610aae868683818110610a9257610a92611e9b565b9050602002016020810190610aa79190611d1e565b60016110e3565b600101610a75565b33610ac96005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610afe57506008546001600160a01b03828116620100009092041614155b15610b275760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610b6c57610b64878783818110610b4857610b48611e9b565b9050602002016020810190610b5d9190611d1e565b60006111a8565b600101610b2b565b508260005b8181101561092657610baa868683818110610b8e57610b8e611e9b565b9050602002016020810190610ba39190611d1e565b60016111a8565b600101610b71565b600033610bc76005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610bfc57506008546001600160a01b03828116620100009092041614155b15610c255760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b61081283611228565b33610c416005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610c7657506008546001600160a01b03828116620100009092041614155b15610c9f5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610ce457610cdc878783818110610cc057610cc0611e9b565b9050602002016020810190610cd59190611d1e565b60006112c0565b600101610ca3565b508260005b8181101561092657610d22868683818110610d0657610d06611e9b565b9050602002016020810190610d1b9190611d1e565b60016112c0565b600101610ce9565b610d32610e8f565b600680546001600160a01b0383166001600160a01b03199091168117909155610d636005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61079183838360016113b1565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610e205781811015610e1157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106a5565b610e20848484840360006113b1565b50505050565b6001600160a01b038316610e5057604051634b637e8f60e11b8152600060048201526024016106a5565b6001600160a01b038216610e7a5760405163ec442f0560e01b8152600060048201526024016106a5565b6107918383836113be565b6107493382611526565b6005546001600160a01b031633146107065760405163118cdaa760e01b81523360048201526024016106a5565b600680546001600160a01b03191690556107498161155c565b610ee0823383610da8565b6106b78282611526565b6000811515600860019054906101000a900460ff16151503610f0e57506000919050565b818015610f2457506009546001600160a01b0316155b15610f4257604051633480121760e21b815260040160405180910390fd5b6008805461ff001916610100841515908102919091179091556040517ff6dd3d5757de9286321e4c4c156cfab73bcf637c3b2815bd90d55e5a74e0b31390600090a2506001919050565b6001600160a01b0382166000908152600c602052604090205481151560ff909116151503610fb8575050565b8015610fc957610fc98260006110e3565b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917f66bcab33b38ffa6a535483c985bbdb2b7d0791d9a1642bbcdb51ca9ef6ad27b891a35050565b6009546000906001600160a01b0390811690831681036110405750600092915050565b6001600160a01b03831615801561105e5750600854610100900460ff165b1561107c57604051633480121760e21b815260040160405180910390fd5b826001600160a01b0316816001600160a01b03167fa92ff4390fe6943f0b30e8fe715dde86f85ab79b2b2c640a10fc094cc4036cc860405160405180910390a35050600980546001600160a01b0319166001600160a01b0392909216919091179055600190565b6001600160a01b0382166000908152600a602052604090205481151560ff90911615150361110f575050565b6001600160a01b0382166000908152600c602052604090205460ff161561115457604051632d388f8960e01b81526001600160a01b03831660048201526024016106a5565b6001600160a01b0382166000818152600a6020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b0382166000908152600d602052604090205481151560ff9091161515036111d4575050565b6001600160a01b0382166000818152600d6020526040808220805460ff191685151590811790915590519092917f0379ec0391bd24902dfe4c8ab1e285648413f62192b2905210e14055a0b58e9091a35050565b6008546000906001600160a01b0362010000909104811690831681036112515750600092915050565b826001600160a01b0316816001600160a01b03167f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b60405160405180910390a35050600880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055600190565b6001600160a01b0382166000908152600b602052604090205481151560ff9091161515036112ec575050565b6001600160a01b03821630148061133457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b1561135d57604051631d06c05160e21b81526001600160a01b03831660048201526024016106a5565b6001600160a01b0382166000818152600b6020526040808220805460ff191685151590811790915590519092917f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac91a35050565b610e2084848460016115ae565b6001600160a01b0383166000908152600b602052604090205460ff1615611406576040516001620b633d60e31b031981526001600160a01b03841660048201526024016106a5565b6001600160a01b0382166000908152600b602052604090205460ff161561144e576040516001620b633d60e31b031981526001600160a01b03831660048201526024016106a5565b600854610100900460ff16158061147d57506001600160a01b0383166000908152600a602052604090205460ff165b806114a057506001600160a01b0382166000908152600a602052604090205460ff165b806114b357506001600160a01b03831630145b156114c357610791838383611683565b6001600160a01b0382166000908152600c602052604090205460ff16156114ef576107918383836117ad565b6001600160a01b0383166000908152600c602052604090205460ff161561151b57610791838383611831565b610791838383611683565b6001600160a01b03821661155057604051634b637e8f60e11b8152600060048201526024016106a5565b6106b7826000836113be565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166115d85760405163e602df0560e01b8152600060048201526024016106a5565b6001600160a01b03831661160257604051634a1406b160e11b8152600060048201526024016106a5565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610e2057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161167591815260200190565b60405180910390a350505050565b6001600160a01b0383166116ae5780600260008282546116a39190611ec7565b909155506117209050565b6001600160a01b038316600090815260208190526040902054818110156117015760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016106a5565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661173c5760028054829003905561175b565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117a091815260200190565b60405180910390a3505050565b6117b5611942565b6117fa57604051637d6f261b60e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201524260248201526044016106a5565b60006064611809600384611eda565b6118139190611ef1565b90508082039150611826848486846119c0565b610e20848484611683565b611839611a35565b611841611942565b61188657604051637d6f261b60e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201524260248201526044016106a5565b60006064611895600384611eda565b61189f9190611ef1565b90508082039150306118b2858284611683565b6000806118be84611a5f565b91509150811561191d5760095460408051868152602081018490526001600160a01b039283169289811692908b16917f72f1c7890d9a85f50b5284898d72fa2f2c9ae6b94cf0e85447bda3b79a9eed4a910160405180910390a4611929565b611929878785876119c0565b611934878787611683565b505050506107916001600755565b60085460009060ff16156119565750600190565b427f000000000000000000000000000000000000000000000000000000000000000011156119845750600090565b6008805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150600190565b6009546001600160a01b03166119d7838284611683565b806001600160a01b0316846001600160a01b0316866001600160a01b03167f581561b91b50e15abb3b3a5f88f281f2671178420589f2e8e3c8b7551783ab1285604051611a2691815260200190565b60405180910390a45050505050565b600260075403611a5857604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b6040805160028082526060820183526000928392839290916020830190803683370190505090503081600081518110611a9a57611a9a611e9b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611aee57611aee611e9b565b6001600160a01b0392831660209182029290920101526009546040516318cbafe560e01b81527f00000000000000000000000000000000000000000000000000000000000000008316926318cbafe592611b5a92899264e8d4a510009288929116904290600401611f29565b6000604051808303816000875af1925050508015611b9a57506040513d6000823e601f3d908101601f19168201604052611b979190810190611f9c565b60015b611c14573d808015611bc8576040519150601f19603f3d011682016040523d82523d6000602084013e611bcd565b606091505b507f9b22231c5dcd7d242b996a86a0ed19eae40cedefcb426de68a320cb4415dcf248582604051611bff92919061205a565b60405180910390a15060009485945092505050565b600181600181518110611c2957611c29611e9b565b6020026020010151935093505050915091565b6000815180845260005b81811015611c6257602081850181015186830182015201611c46565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611c956020830184611c3c565b9392505050565b6001600160a01b038116811461074957600080fd5b60008060408385031215611cc457600080fd5b8235611ccf81611c9c565b946020939093013593505050565b600080600060608486031215611cf257600080fd5b8335611cfd81611c9c565b92506020840135611d0d81611c9c565b929592945050506040919091013590565b600060208284031215611d3057600080fd5b8135611c9581611c9c565b600060208284031215611d4d57600080fd5b5035919050565b600060208284031215611d6657600080fd5b81358015158114611c9557600080fd5b60008083601f840112611d8857600080fd5b50813567ffffffffffffffff811115611da057600080fd5b6020830191508360208260051b8501011115611dbb57600080fd5b9250929050565b60008060008060408587031215611dd857600080fd5b843567ffffffffffffffff80821115611df057600080fd5b611dfc88838901611d76565b90965094506020870135915080821115611e1557600080fd5b50611e2287828801611d76565b95989497509550505050565b60008060408385031215611e4157600080fd5b8235611e4c81611c9c565b91506020830135611e5c81611c9c565b809150509250929050565b600181811c90821680611e7b57607f821691505b60208210810361081557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561064457610644611eb1565b808202811582820484141761064457610644611eb1565b600082611f0e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015611f7b5784516001600160a01b031683529383019391830191600101611f56565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215611faf57600080fd5b825167ffffffffffffffff80821115611fc757600080fd5b818501915085601f830112611fdb57600080fd5b815181811115611fed57611fed611f13565b8060051b604051601f19603f8301168101818110858211171561201257612012611f13565b60405291825284820192508381018501918883111561203057600080fd5b938501935b8285101561204e57845184529385019392850192612035565b98975050505050505050565b8281526040602082015260006120736040830184611c3c565b94935050505056fea264697066735822122033e5e4ce67bfbcfcb72a035f7b021073a252228eb7e00cc214eb6ea0ac0d993b64736f6c63430008180033000000000000000000000000138419f073cf67f01b80e60cfc23d5f7f618f1bc0000000000000000000000004895c295160caf657976c9a5622ca29fc0f63ffc0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000067658670

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063958c2e5211610130578063d936547e116100b8578063e2f273bd1161007c578063e2f273bd1461053b578063e30c39781461054e578063e61e90f61461055f578063f2fde38b14610572578063f851a4401461058557600080fd5b8063d936547e146104a9578063dbac26e9146104cc578063dd62ed3e146104ef578063de530cfc14610528578063df2c0e291461043057600080fd5b8063a771ebc7116100ff578063a771ebc71461044b578063a9059cbb1461045d578063b3f0067414610470578063c69bebe414610483578063c7cd469a1461049657600080fd5b8063958c2e521461040157806395d89b4114610428578063a075429914610430578063a3673ac11461043857600080fd5b80634513de53116101b357806379ba50971161018257806379ba50971461039b57806379cc6790146103a357806383ceb55b146103b6578063868e4c61146103dd5780638da5cb5b146103f057600080fd5b80634513de531461033b5780634ada218b1461036257806370a082311461036a578063715018a61461039357600080fd5b8063313ce567116101fa578063313ce567146102925780633820a686146102a15780633fc8cef3146102c45780634227715e1461030357806342966c681461032657600080fd5b806306fdde031461022c578063095ea7b31461024a57806318160ddd1461026d57806323b872dd1461027f575b600080fd5b61023461059e565b6040516102419190611c82565b60405180910390f35b61025d610258366004611cb1565b610630565b6040519015158152602001610241565b6002545b604051908152602001610241565b61025d61028d366004611cdd565b61064a565b60405160128152602001610241565b61025d6102af366004611d1e565b600d6020526000908152604090205460ff1681565b6102eb7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b039091168152602001610241565b61025d610311366004611d1e565b600c6020526000908152604090205460ff1681565b610339610334366004611d3b565b61066e565b005b6102717f000000000000000000000000000000000000000000000000000000006765867081565b61025d6106bb565b610271610378366004611d1e565b6001600160a01b031660009081526020819052604090205490565b6103396106f4565b610339610708565b6103396103b1366004611cb1565b61074c565b6102eb7f000000000000000000000000f9bf09ec583e6376c17c093f4ae798ec6c8e718281565b61025d6103eb366004611d54565b610796565b6005546001600160a01b03166102eb565b6102eb7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b61023461081b565b610271600381565b610339610446366004611dc2565b61082a565b60085461025d90610100900460ff1681565b61025d61046b366004611cb1565b610930565b6009546102eb906001600160a01b031681565b61025d610491366004611d1e565b61093e565b6103396104a4366004611dc2565b6109ba565b61025d6104b7366004611d1e565b600a6020526000908152604090205460ff1681565b61025d6104da366004611d1e565b600b6020526000908152604090205460ff1681565b6102716104fd366004611e2e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610339610536366004611dc2565b610ab6565b61025d610549366004611d1e565b610bb2565b6006546001600160a01b03166102eb565b61033961056d366004611dc2565b610c2e565b610339610580366004611d1e565b610d2a565b6008546102eb906201000090046001600160a01b031681565b6060600380546105ad90611e67565b80601f01602080910402602001604051908101604052809291908181526020018280546105d990611e67565b80156106265780601f106105fb57610100808354040283529160200191610626565b820191906000526020600020905b81548152906001019060200180831161060957829003601f168201915b5050505050905090565b60003361063e818585610d9b565b60019150505b92915050565b600033610658858285610da8565b610663858585610e26565b506001949350505050565b336000818152600d602052604090205460ff166106ae57604051637c11f1eb60e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6106b782610e85565b5050565b60085460009060ff16806106ef5750427f000000000000000000000000000000000000000000000000000000006765867011155b905090565b6106fc610e8f565b6107066000610ebc565b565b60065433906001600160a01b031681146107405760405163118cdaa760e01b81526001600160a01b03821660048201526024016106a5565b61074981610ebc565b50565b336000818152600d602052604090205460ff1661078757604051637c11f1eb60e01b81526001600160a01b03821660048201526024016106a5565b6107918383610ed5565b505050565b6000336107ab6005546001600160a01b031690565b6001600160a01b0316816001600160a01b0316141580156107e057506008546001600160a01b03828116620100009092041614155b156108095760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b61081283610eea565b91505b50919050565b6060600480546105ad90611e67565b3361083d6005546001600160a01b031690565b6001600160a01b0316816001600160a01b03161415801561087257506008546001600160a01b03828116620100009092041614155b1561089b5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b818110156108e0576108d88787838181106108bc576108bc611e9b565b90506020020160208101906108d19190611d1e565b6000610f8c565b60010161089f565b508260005b818110156109265761091e86868381811061090257610902611e9b565b90506020020160208101906109179190611d1e565b6001610f8c565b6001016108e5565b5050505050505050565b60003361063e818585610e26565b6000336109536005546001600160a01b031690565b6001600160a01b0316816001600160a01b03161415801561098857506008546001600160a01b03828116620100009092041614155b156109b15760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b6108128361101d565b336109cd6005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610a0257506008546001600160a01b03828116620100009092041614155b15610a2b5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610a7057610a68878783818110610a4c57610a4c611e9b565b9050602002016020810190610a619190611d1e565b60006110e3565b600101610a2f565b508260005b8181101561092657610aae868683818110610a9257610a92611e9b565b9050602002016020810190610aa79190611d1e565b60016110e3565b600101610a75565b33610ac96005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610afe57506008546001600160a01b03828116620100009092041614155b15610b275760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610b6c57610b64878783818110610b4857610b48611e9b565b9050602002016020810190610b5d9190611d1e565b60006111a8565b600101610b2b565b508260005b8181101561092657610baa868683818110610b8e57610b8e611e9b565b9050602002016020810190610ba39190611d1e565b60016111a8565b600101610b71565b600033610bc76005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610bfc57506008546001600160a01b03828116620100009092041614155b15610c255760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b61081283611228565b33610c416005546001600160a01b031690565b6001600160a01b0316816001600160a01b031614158015610c7657506008546001600160a01b03828116620100009092041614155b15610c9f5760405163109492b160e11b81526001600160a01b03821660048201526024016106a5565b8360005b81811015610ce457610cdc878783818110610cc057610cc0611e9b565b9050602002016020810190610cd59190611d1e565b60006112c0565b600101610ca3565b508260005b8181101561092657610d22868683818110610d0657610d06611e9b565b9050602002016020810190610d1b9190611d1e565b60016112c0565b600101610ce9565b610d32610e8f565b600680546001600160a01b0383166001600160a01b03199091168117909155610d636005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61079183838360016113b1565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610e205781811015610e1157604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106a5565b610e20848484840360006113b1565b50505050565b6001600160a01b038316610e5057604051634b637e8f60e11b8152600060048201526024016106a5565b6001600160a01b038216610e7a5760405163ec442f0560e01b8152600060048201526024016106a5565b6107918383836113be565b6107493382611526565b6005546001600160a01b031633146107065760405163118cdaa760e01b81523360048201526024016106a5565b600680546001600160a01b03191690556107498161155c565b610ee0823383610da8565b6106b78282611526565b6000811515600860019054906101000a900460ff16151503610f0e57506000919050565b818015610f2457506009546001600160a01b0316155b15610f4257604051633480121760e21b815260040160405180910390fd5b6008805461ff001916610100841515908102919091179091556040517ff6dd3d5757de9286321e4c4c156cfab73bcf637c3b2815bd90d55e5a74e0b31390600090a2506001919050565b6001600160a01b0382166000908152600c602052604090205481151560ff909116151503610fb8575050565b8015610fc957610fc98260006110e3565b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917f66bcab33b38ffa6a535483c985bbdb2b7d0791d9a1642bbcdb51ca9ef6ad27b891a35050565b6009546000906001600160a01b0390811690831681036110405750600092915050565b6001600160a01b03831615801561105e5750600854610100900460ff165b1561107c57604051633480121760e21b815260040160405180910390fd5b826001600160a01b0316816001600160a01b03167fa92ff4390fe6943f0b30e8fe715dde86f85ab79b2b2c640a10fc094cc4036cc860405160405180910390a35050600980546001600160a01b0319166001600160a01b0392909216919091179055600190565b6001600160a01b0382166000908152600a602052604090205481151560ff90911615150361110f575050565b6001600160a01b0382166000908152600c602052604090205460ff161561115457604051632d388f8960e01b81526001600160a01b03831660048201526024016106a5565b6001600160a01b0382166000818152600a6020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b0382166000908152600d602052604090205481151560ff9091161515036111d4575050565b6001600160a01b0382166000818152600d6020526040808220805460ff191685151590811790915590519092917f0379ec0391bd24902dfe4c8ab1e285648413f62192b2905210e14055a0b58e9091a35050565b6008546000906001600160a01b0362010000909104811690831681036112515750600092915050565b826001600160a01b0316816001600160a01b03167f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b60405160405180910390a35050600880546001600160a01b03909216620100000262010000600160b01b0319909216919091179055600190565b6001600160a01b0382166000908152600b602052604090205481151560ff9091161515036112ec575050565b6001600160a01b03821630148061133457507f000000000000000000000000f9bf09ec583e6376c17c093f4ae798ec6c8e71826001600160a01b0316826001600160a01b0316145b1561135d57604051631d06c05160e21b81526001600160a01b03831660048201526024016106a5565b6001600160a01b0382166000818152600b6020526040808220805460ff191685151590811790915590519092917f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac91a35050565b610e2084848460016115ae565b6001600160a01b0383166000908152600b602052604090205460ff1615611406576040516001620b633d60e31b031981526001600160a01b03841660048201526024016106a5565b6001600160a01b0382166000908152600b602052604090205460ff161561144e576040516001620b633d60e31b031981526001600160a01b03831660048201526024016106a5565b600854610100900460ff16158061147d57506001600160a01b0383166000908152600a602052604090205460ff165b806114a057506001600160a01b0382166000908152600a602052604090205460ff165b806114b357506001600160a01b03831630145b156114c357610791838383611683565b6001600160a01b0382166000908152600c602052604090205460ff16156114ef576107918383836117ad565b6001600160a01b0383166000908152600c602052604090205460ff161561151b57610791838383611831565b610791838383611683565b6001600160a01b03821661155057604051634b637e8f60e11b8152600060048201526024016106a5565b6106b7826000836113be565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0384166115d85760405163e602df0560e01b8152600060048201526024016106a5565b6001600160a01b03831661160257604051634a1406b160e11b8152600060048201526024016106a5565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610e2057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161167591815260200190565b60405180910390a350505050565b6001600160a01b0383166116ae5780600260008282546116a39190611ec7565b909155506117209050565b6001600160a01b038316600090815260208190526040902054818110156117015760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016106a5565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661173c5760028054829003905561175b565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117a091815260200190565b60405180910390a3505050565b6117b5611942565b6117fa57604051637d6f261b60e01b81527f000000000000000000000000000000000000000000000000000000006765867060048201524260248201526044016106a5565b60006064611809600384611eda565b6118139190611ef1565b90508082039150611826848486846119c0565b610e20848484611683565b611839611a35565b611841611942565b61188657604051637d6f261b60e01b81527f000000000000000000000000000000000000000000000000000000006765867060048201524260248201526044016106a5565b60006064611895600384611eda565b61189f9190611ef1565b90508082039150306118b2858284611683565b6000806118be84611a5f565b91509150811561191d5760095460408051868152602081018490526001600160a01b039283169289811692908b16917f72f1c7890d9a85f50b5284898d72fa2f2c9ae6b94cf0e85447bda3b79a9eed4a910160405180910390a4611929565b611929878785876119c0565b611934878787611683565b505050506107916001600755565b60085460009060ff16156119565750600190565b427f000000000000000000000000000000000000000000000000000000006765867011156119845750600090565b6008805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150600190565b6009546001600160a01b03166119d7838284611683565b806001600160a01b0316846001600160a01b0316866001600160a01b03167f581561b91b50e15abb3b3a5f88f281f2671178420589f2e8e3c8b7551783ab1285604051611a2691815260200190565b60405180910390a45050505050565b600260075403611a5857604051633ee5aeb560e01b815260040160405180910390fd5b6002600755565b6040805160028082526060820183526000928392839290916020830190803683370190505090503081600081518110611a9a57611a9a611e9b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611aee57611aee611e9b565b6001600160a01b0392831660209182029290920101526009546040516318cbafe560e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8316926318cbafe592611b5a92899264e8d4a510009288929116904290600401611f29565b6000604051808303816000875af1925050508015611b9a57506040513d6000823e601f3d908101601f19168201604052611b979190810190611f9c565b60015b611c14573d808015611bc8576040519150601f19603f3d011682016040523d82523d6000602084013e611bcd565b606091505b507f9b22231c5dcd7d242b996a86a0ed19eae40cedefcb426de68a320cb4415dcf248582604051611bff92919061205a565b60405180910390a15060009485945092505050565b600181600181518110611c2957611c29611e9b565b6020026020010151935093505050915091565b6000815180845260005b81811015611c6257602081850181015186830182015201611c46565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611c956020830184611c3c565b9392505050565b6001600160a01b038116811461074957600080fd5b60008060408385031215611cc457600080fd5b8235611ccf81611c9c565b946020939093013593505050565b600080600060608486031215611cf257600080fd5b8335611cfd81611c9c565b92506020840135611d0d81611c9c565b929592945050506040919091013590565b600060208284031215611d3057600080fd5b8135611c9581611c9c565b600060208284031215611d4d57600080fd5b5035919050565b600060208284031215611d6657600080fd5b81358015158114611c9557600080fd5b60008083601f840112611d8857600080fd5b50813567ffffffffffffffff811115611da057600080fd5b6020830191508360208260051b8501011115611dbb57600080fd5b9250929050565b60008060008060408587031215611dd857600080fd5b843567ffffffffffffffff80821115611df057600080fd5b611dfc88838901611d76565b90965094506020870135915080821115611e1557600080fd5b50611e2287828801611d76565b95989497509550505050565b60008060408385031215611e4157600080fd5b8235611e4c81611c9c565b91506020830135611e5c81611c9c565b809150509250929050565b600181811c90821680611e7b57607f821691505b60208210810361081557634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561064457610644611eb1565b808202811582820484141761064457610644611eb1565b600082611f0e57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015611f7b5784516001600160a01b031683529383019391830191600101611f56565b50506001600160a01b03969096166060850152505050608001529392505050565b60006020808385031215611faf57600080fd5b825167ffffffffffffffff80821115611fc757600080fd5b818501915085601f830112611fdb57600080fd5b815181811115611fed57611fed611f13565b8060051b604051601f19603f8301168101818110858211171561201257612012611f13565b60405291825284820192508381018501918883111561203057600080fd5b938501935b8285101561204e57845184529385019392850192612035565b98975050505050505050565b8281526040602082015260006120736040830184611c3c565b94935050505056fea264697066735822122033e5e4ce67bfbcfcb72a035f7b021073a252228eb7e00cc214eb6ea0ac0d993b64736f6c63430008180033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000138419f073cf67f01b80e60cfc23d5f7f618f1bc0000000000000000000000004895c295160caf657976c9a5622ca29fc0f63ffc0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000067658670

-----Decoded View---------------
Arg [0] : _owner (address): 0x138419F073cF67F01B80e60cFC23D5f7f618F1bc
Arg [1] : _feeReceiver (address): 0x4895C295160caF657976C9a5622CA29Fc0f63FFc
Arg [2] : _uniV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [3] : usdt (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [4] : _tradingEnableTime (uint256): 1734706800

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000138419f073cf67f01b80e60cfc23d5f7f618f1bc
Arg [1] : 0000000000000000000000004895c295160caf657976c9a5622ca29fc0f63ffc
Arg [2] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [3] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [4] : 0000000000000000000000000000000000000000000000000000000067658670


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.