BNB Price: $614.84 (+2.96%)
 

Overview

Max Total Supply

250,000,000HLX

Holders

440

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.00000001 HLX

Value
$0.00
0xa8aCdd81F46633b69AcB6ec5c16Ee7E00cc8938D
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
TrustToken

Compiler Version
v0.8.33+commit.64118f21

Optimization Enabled:
Yes with 200 runs

Other Settings:
prague EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/*
TrustToken — v4.7 

Guarantees:
- Controlled DEX-only launch (7 days, directional whitelist)
- Auto-open trading after launch window (failsafe, deterministic)
- Sell-side tax with deterministic decay → 0%
- 30-day DEX protection window:
• Same-block buy→sell (DEX buyers only)
• Hold-time (DEX buyers only)
• Max-sell cap (ALL DEX sells, first 30 days only)
- Emergency sell halt (fail-closed, treasury exempt)
- No upgradeability, no external hooks, no admin backdoors

Notes:
- Ownable is set in a version-agnostic way via _transferOwnership(_treasury)
(works with OZ v4 and v5, avoids constructor-arg mismatch surprises)
*/

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

interface IEmergencyGuard {
    function emergencyActive() external view returns (bool);
}

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32);

    function token0() external view returns (address);
    function token1() external view returns (address);
}

contract TrustToken is ERC20, Ownable {
    /*//////////////////////////////////////////////////////////////
    CONSTANTS
    //////////////////////////////////////////////////////////////*/

    uint256 public constant BPS_DENOMINATOR = 10_000;
    uint256 public constant HOLD_TIME = 300; // 5 minutes
    uint256 public constant LAUNCH_WINDOW_DURATION = 7 hours;
    uint256 public constant DEX_PROTECTION_DURATION = 30 days;

    uint256 public constant MAX_SELL_BPS_FIRST_7D = 50; // 0.5%
    uint256 public constant MAX_SELL_BPS_UNTIL_30D = 100; // 1%

    /*//////////////////////////////////////////////////////////////
                              ADDRESSES
    //////////////////////////////////////////////////////////////*/

    address public immutable treasury;
    address public immutable devWallet;
    IEmergencyGuard public immutable emergencyGuard;

    address public dexPair;

    /*//////////////////////////////////////////////////////////////
                         LAUNCH / GOVERNANCE
    //////////////////////////////////////////////////////////////*/

    address public launchAdmin;

    bool public tradingEnabled;
    bool public whitelistMode = true;

    mapping(address => bool) public whitelist;

    uint256 public pairActivatedAt;
    uint256 public tradingEnabledAt;

    /*//////////////////////////////////////////////////////////////
                            ANTI-BOT STATE
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public lastDexBuyAt;
    mapping(address => uint256) public lastDexBuyBlock;

    /*//////////////////////////////////////////////////////////////
                                EVENTS
    //////////////////////////////////////////////////////////////*/

    event DexPairSet(address pair);
    event DexPairActivated(address pair, uint256 timestamp);
    event TradingEnabled(uint256 timestamp);
    event WhitelistUpdated(address indexed wallet, bool allowed);
    event WhitelistDisabledForever();
    event LaunchControlRenounced();
    event SellTaxCollected(
        address indexed seller,
        uint256 grossAmount,
        uint256 taxAmount,
        uint256 treasuryShare,
        uint256 devShare
    );

    /*//////////////////////////////////////////////////////////////
                              MODIFIERS
    //////////////////////////////////////////////////////////////*/

    modifier onlyLaunchAdminAnytime() {
        require(msg.sender == launchAdmin, "Not launch admin");
        _;
    }

    modifier onlyLaunchAdmin() {
        require(msg.sender == launchAdmin, "Not launch admin");
        require(_withinLaunchWindow(), "Launch expired");
        _;
    }

    /*//////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 totalSupply_,
        address _treasury,
        address _devWallet,
        address _launchAdmin,
        address _emergencyGuard,
        address _mintTo
    ) ERC20(name_, symbol_) {
        require(_treasury != address(0), "Treasury zero");
        require(_devWallet != address(0), "Dev zero");
        require(_launchAdmin != address(0), "Launch admin zero");
        require(_mintTo != address(0), "MintTo zero");
        require(_emergencyGuard.code.length > 0, "Guard not contract");

        treasury = _treasury;
        devWallet = _devWallet;
        launchAdmin = _launchAdmin;
        emergencyGuard = IEmergencyGuard(_emergencyGuard);

        // Version-agnostic owner assignment (OZ v4 + v5 compatible)
        _transferOwnership(_treasury);

        _mint(_mintTo, totalSupply_);
    }

    /*//////////////////////////////////////////////////////////////
                         LAUNCH WINDOW LOGIC
    //////////////////////////////////////////////////////////////*/

    function _withinLaunchWindow() internal view returns (bool) {
        return
            pairActivatedAt != 0 &&
            block.timestamp <= pairActivatedAt + LAUNCH_WINDOW_DURATION;
    }

    /*//////////////////////////////////////////////////////////////
                         PAIR CONFIGURATION
    //////////////////////////////////////////////////////////////*/

    function setDexPair(address pair) external onlyOwner {
        require(pair != address(0), "Pair zero");
        require(pair != address(this), "Invalid pair");
        require(pair.code.length > 0, "Not contract");
        require(dexPair == address(0), "Pair already set");
        require(pairActivatedAt == 0, "Already activated");

        IUniswapV2Pair p = IUniswapV2Pair(pair);
        require(
            p.token0() == address(this) || p.token1() == address(this),
            "Invalid pair"
        );

        dexPair = pair;
        emit DexPairSet(pair);
    }

    function activatePair() external onlyOwner {
        require(dexPair != address(0), "Pair not set");
        require(pairActivatedAt == 0, "Already activated");

        IUniswapV2Pair p = IUniswapV2Pair(dexPair);
        (uint112 r0, uint112 r1, ) = p.getReserves();

        uint256 tokenReserve = p.token0() == address(this)
            ? uint256(r0)
            : uint256(r1);
        uint256 otherReserve = p.token0() == address(this)
            ? uint256(r1)
            : uint256(r0);

        require(tokenReserve > 0 && otherReserve > 0, "No liquidity");

        pairActivatedAt = block.timestamp;
        emit DexPairActivated(dexPair, pairActivatedAt);
    }

    /*//////////////////////////////////////////////////////////////
                        WHITELIST / LAUNCH OPS
    //////////////////////////////////////////////////////////////*/

    function addToWhitelist(address wallet) external onlyLaunchAdminAnytime {
        require(whitelistMode, "Whitelist disabled");
        whitelist[wallet] = true;
        emit WhitelistUpdated(wallet, true);
    }

    function removeFromWhitelist(
        address wallet
    ) external onlyLaunchAdminAnytime {
        require(whitelistMode, "Whitelist disabled");
        whitelist[wallet] = false;
        emit WhitelistUpdated(wallet, false);
    }

    function enableTrading() external onlyLaunchAdmin {
        require(!tradingEnabled, "Already enabled");
        require(pairActivatedAt != 0, "Pair not active");

        tradingEnabled = true;

        if (tradingEnabledAt == 0) {
            tradingEnabledAt = block.timestamp;
        }

        emit TradingEnabled(tradingEnabledAt);
    }

    function disableWhitelistForever() external onlyLaunchAdmin {
        require(whitelistMode, "Already disabled");
        whitelistMode = false;
        emit WhitelistDisabledForever();
    }

    function renounceLaunchControl() external onlyLaunchAdmin {
        launchAdmin = address(0);
        emit LaunchControlRenounced();
    }

    /*//////////////////////////////////////////////////////////////
                              TAX LOGIC
    //////////////////////////////////////////////////////////////*/

    function currentSellTaxBps() public view returns (uint256) {
        if (tradingEnabledAt == 0) return 0;

        uint256 elapsed = block.timestamp - tradingEnabledAt;

        if (elapsed < 30 days) return 2000;
        if (elapsed < 60 days) return 1000;
        if (elapsed < 100 days) return 750;
        if (elapsed < 180 days) return 500;
        if (elapsed < 365 days) return 250;
        return 0;
    }

    /*//////////////////////////////////////////////////////////////
                              TRANSFER
    //////////////////////////////////////////////////////////////*/

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        uint256 sendAmount = amount;

        // Treasury fully exempt
        if (from != treasury && to != treasury) {
            _autoStartTaxClockIfMissed();
            _enforceLaunchRules(from, to);

            // Track DEX buys
            if (
                pairActivatedAt != 0 &&
                block.timestamp <= pairActivatedAt + DEX_PROTECTION_DURATION &&
                from == dexPair
            ) {
                lastDexBuyAt[to] = block.timestamp;
                lastDexBuyBlock[to] = block.number;
            }

            // SELL
            if (to == dexPair) {
                _enforceEmergencyHalt();

                if (
                    pairActivatedAt != 0 &&
                    block.timestamp <= pairActivatedAt + DEX_PROTECTION_DURATION
                ) {
                    _enforceDexBuyerProtections(from);
                    _enforceMaxSell(sendAmount);
                }

                sendAmount = _applySellTax(from, sendAmount);
            }
        }

        super._transfer(from, to, sendAmount);
    }

    /*//////////////////////////////////////////////////////////////
                         LAUNCH ENFORCEMENT
    //////////////////////////////////////////////////////////////*/

    function _enforceLaunchRules(address from, address to) internal view {
        if (!_withinLaunchWindow()) return;

        if (!tradingEnabled) {
            if (from == dexPair) {
                require(whitelist[to], "Buy not whitelisted");
            } else if (to == dexPair) {
                require(whitelist[from], "Sell not whitelisted");
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        EMERGENCY ENFORCEMENT
    //////////////////////////////////////////////////////////////*/

    function _enforceEmergencyHalt() internal view {
        bool emergency;
        try emergencyGuard.emergencyActive() returns (bool active) {
            emergency = active;
        } catch {
            emergency = true;
        }
        require(!emergency, "Emergency: sells disabled");
    }

    /*//////////////////////////////////////////////////////////////
                    DEX BUYER-SPECIFIC PROTECTIONS
    //////////////////////////////////////////////////////////////*/

    function _enforceDexBuyerProtections(address seller) internal view {
        uint256 boughtAt = lastDexBuyAt[seller];
        if (boughtAt == 0) return;

        require(
            lastDexBuyBlock[seller] < block.number,
            "No buy+sell same block"
        );
        require(block.timestamp >= boughtAt + HOLD_TIME, "Hold time active");
    }

    /*//////////////////////////////////////////////////////////////
                         MAX SELL CAP (GLOBAL)
    //////////////////////////////////////////////////////////////*/

    function _enforceMaxSell(uint256 amount) internal view {
        if (pairActivatedAt == 0) return;

        uint256 maxBps;
        if (block.timestamp <= pairActivatedAt + 7 days) {
            maxBps = MAX_SELL_BPS_FIRST_7D;
        } else if (block.timestamp <= pairActivatedAt + 30 days) {
            maxBps = MAX_SELL_BPS_UNTIL_30D;
        } else {
            return;
        }

        require(dexPair != address(0), "Pair not set");

        IUniswapV2Pair p = IUniswapV2Pair(dexPair);
        (uint112 r0, uint112 r1, ) = p.getReserves();

        uint256 tokenReserve = p.token0() == address(this)
            ? uint256(r0)
            : uint256(r1);

        require(tokenReserve > 0, "No liquidity");

        uint256 cap = (tokenReserve * maxBps) / BPS_DENOMINATOR;
        require(amount <= cap, "Sell > max");
    }

    /*//////////////////////////////////////////////////////////////
                          TAX APPLICATION
    //////////////////////////////////////////////////////////////*/

    function _applySellTax(
        address seller,
        uint256 gross
    ) internal returns (uint256) {
        uint256 taxBps = currentSellTaxBps();
        if (taxBps == 0) return gross;

        uint256 taxAmount = (gross * taxBps) / BPS_DENOMINATOR;
        if (taxAmount == 0) return gross;

        uint256 treasuryShare = (taxAmount * 8000) / BPS_DENOMINATOR;
        uint256 devShare = taxAmount - treasuryShare;

        super._transfer(seller, treasury, treasuryShare);
        if (devShare > 0) {
            super._transfer(seller, devWallet, devShare);
        }

        emit SellTaxCollected(
            seller,
            gross,
            taxAmount,
            treasuryShare,
            devShare
        );

        return gross - taxAmount;
    }

    /*//////////////////////////////////////////////////////////////
                     TAX CLOCK FAILSAFE
    //////////////////////////////////////////////////////////////*/

    function _autoStartTaxClockIfMissed() internal {
        if (
            pairActivatedAt != 0 &&
            tradingEnabledAt == 0 &&
            block.timestamp > pairActivatedAt + LAUNCH_WINDOW_DURATION
        ) {
            tradingEnabledAt = pairActivatedAt + LAUNCH_WINDOW_DURATION;
            tradingEnabled = true;
            emit TradingEnabled(tradingEnabledAt);
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @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 {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "forge-std/=lib/forge-std/src/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "prague",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"},{"internalType":"address","name":"_launchAdmin","type":"address"},{"internalType":"address","name":"_emergencyGuard","type":"address"},{"internalType":"address","name":"_mintTo","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DexPairActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"DexPairSet","type":"event"},{"anonymous":false,"inputs":[],"name":"LaunchControlRenounced","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":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"grossAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"treasuryShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"devShare","type":"uint256"}],"name":"SellTaxCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"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":[],"name":"WhitelistDisabledForever","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"BPS_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEX_PROTECTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLD_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_WINDOW_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_BPS_FIRST_7D","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SELL_BPS_UNTIL_30D","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSellTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableWhitelistForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyGuard","outputs":[{"internalType":"contract IEmergencyGuard","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDexBuyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDexBuyBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchAdmin","outputs":[{"internalType":"address","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":"pairActivatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceLaunchControl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"setDexPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60e0604052346105ba576125ac80380380610019816105be565b928339810190610100818303126105ba5780516001600160401b0381116105ba57826100469183016105e3565b602082015190926001600160401b0382116105ba576100669183016105e3565b60408201519161007860608201610634565b9061008560808201610634565b9261009260a08301610634565b906100ab60e06100a460c08601610634565b9401610634565b875190976001600160401b0382116104b55760035490600182811c921680156105b0575b60208310146104975781601f84931161053a575b50602090601f83116001146104d4575f926104c9575b50508160011b915f199060031b1c1916176003555b8051906001600160401b0382116104b55760045490600182811c921680156104ab575b60208310146104975781601f849311610421575b50602090601f83116001146103bb575f926103b0575b50508160011b915f199060031b1c1916176004555b61017933610648565b600754906001600160a01b0384161561037b576001600160a01b0385161561034b576001600160a01b0316958615610312576001600160a01b03169586156102df57823b156102a557608084905260a094909452600161ff0160a01b03191692909217600160a81b176007556001600160a01b039190911660c0526101fd90610648565b600254908082018092116102915760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a3604051611f1b90816106918239608051818181610dfc015281816116420152611cdf015260a0518181816109770152611d39015260c051818181610f2601526116eb0152f35b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b815260206004820152601260248201527111dd585c99081b9bdd0818dbdb9d1c9858dd60721b6044820152606490fd5b60405162461bcd60e51b815260206004820152600b60248201526a4d696e74546f207a65726f60a81b6044820152606490fd5b60405162461bcd60e51b81526020600482015260116024820152704c61756e63682061646d696e207a65726f60781b6044820152606490fd5b60405162461bcd60e51b8152602060048201526008602482015267446576207a65726f60c01b6044820152606490fd5b60405162461bcd60e51b815260206004820152600d60248201526c5472656173757279207a65726f60981b6044820152606490fd5b015190505f8061015b565b60045f9081528281209350601f198516905b81811061040957509084600195949392106103f1575b505050811b01600455610170565b01515f1960f88460031b161c191690555f80806103e3565b929360206001819287860151815501950193016103cd565b828111156101455760045f52909150601f830160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6020851061048f575b849392601f0160051c82900391015f5b82811061047f575050610145565b5f81830155859450600101610471565b5f9150610461565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610131565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100f9565b60035f9081528281209350601f198516905b818110610522575090846001959493921061050a575b505050811b0160035561010e565b01515f1960f88460031b161c191690555f80806104fc565b929360206001819287860151815501950193016104e6565b828111156100e35760035f52909150601f830160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602085106105a8575b849392601f0160051c82900391015f5b8281106105985750506100e3565b5f8183015585945060010161058a565b5f915061057a565b91607f16916100cf565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176104b557604052565b81601f820112156105ba578051906001600160401b0382116104b557610612601f8301601f19166020016105be565b92828452602083830101116105ba57815f9260208093018386015e8301015290565b51906001600160a01b03821682036105ba57565b600580546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a356fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461113257508063075e3a0e1461111657806307a8e8f5146110fb578063095ea7b3146110d557806318160ddd146110b857806323684d241461101257806323b872dd14610f555780632d7e557d14610f11578063313ce56714610ef65780633950935114610e9457806346ed6ccf14610e6c5780634ada218b14610e475780635aa9f0ec14610e2b57806361d027b314610de757806370a0823114610db057806370c757ec14610d8b578063715018a614610d305780638a3bc68314610d135780638a8c523c14610c0f5780638ab1d68114610b8e5780638d8e7a6a146109ce5780638da5cb5b146109a65780638ea5220f146109625780638fdb2bfe146108f857806395d89b41146107f45780639b19251a146107b75780639be3c85b146107955780639f15b18814610778578063a457c2d7146106d5578063a9059cbb146106a4578063ae36f5c814610467578063aef5eb2d1461042f578063c31fe80a14610412578063ca4d6028146103da578063d7434e22146103bf578063dd62ed3e1461036f578063e1a4521814610353578063e43252d7146102c7578063f242ab411461029f5763f2fde38b146101d4575f80fd5b3461029b57602036600319011261029b576101ed611214565b6101f56118e8565b6001600160a01b0316801561024757600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b5f80fd5b3461029b575f36600319011261029b576006546040516001600160a01b039091168152602090f35b3461029b57602036600319011261029b576102e0611214565b6007546103079060ff906102fe336001600160a01b03831614611276565b60a81c166112f2565b60018060a01b0316805f52600860205260405f20600160ff198254161790557ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d602060405160018152a2005b3461029b575f36600319011261029b5760206040516127108152f35b3461029b57604036600319011261029b57610388611214565b61039061122a565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461029b575f36600319011261029b57602060405160328152f35b3461029b57602036600319011261029b576001600160a01b036103fb611214565b165f52600b602052602060405f2054604051908152f35b3461029b575f36600319011261029b576020600a54604051908152f35b3461029b57602036600319011261029b576001600160a01b03610450611214565b165f52600c602052602060405f2054604051908152f35b3461029b57602036600319011261029b57610480611214565b6104886118e8565b6001600160a01b038116908115610673576104a5308314156114ce565b3b1561063f57600654906001600160a01b038216610607576104c96009541561136e565b604051630dfe168160e01b8152602081600481855afa9081156105dd575f916105e8575b506001600160a01b031630148015610546575b90807fc3cd203585fbc28dcc1692611d2ebc4190312a5b189047df793c69b157aa0d299361052f6020946114ce565b6001600160a01b03191617600655604051908152a1005b5060405163d21220a760e01b815290602082600481845afa80156105dd577fc3cd203585fbc28dcc1692611d2ebc4190312a5b189047df793c69b157aa0d299361052f83926020955f916105b0575b509195509193506001600160a01b0316301491506105009050565b6105d09150863d88116105d6575b6105c88183611240565b8101906113f8565b87610595565b503d6105be565b6040513d5f823e3d90fd5b610601915060203d6020116105d6576105c88183611240565b836104ed565b60405162461bcd60e51b815260206004820152601060248201526f14185a5c88185b1c9958591e481cd95d60821b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b139bdd0818dbdb9d1c9858dd60a21b6044820152606490fd5b60405162461bcd60e51b815260206004820152600960248201526850616972207a65726f60b81b6044820152606490fd5b3461029b57604036600319011261029b576106ca6106c0611214565b6024359033611631565b602060405160018152f35b3461029b57604036600319011261029b576106ee611214565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610725576106ca92039033611509565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461029b575f36600319011261029b57602060405162278d008152f35b3461029b575f36600319011261029b5760206107af61145f565b604051908152f35b3461029b57602036600319011261029b576001600160a01b036107d8611214565b165f526008602052602060ff60405f2054166040519015158152f35b3461029b575f36600319011261029b576040515f6004548060011c906001811680156108ee575b6020831081146108da578285529081156108b65750600114610858575b6108548361084881850382611240565b604051918291826111ea565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b80821061089c57509091508101602001610848610838565b919260018160209254838588010152019101909291610884565b60ff191660208086019190915291151560051b840190910191506108489050610838565b634e487b7160e01b5f52602260045260245ffd5b91607f169161081b565b3461029b575f36600319011261029b5760075461091f336001600160a01b03831614611276565b61092f61092a61160d565b6112b5565b6001600160a01b0319166007557f3304a4eac4b1da51949262f91f8f924cd76c970f38971f658c21fce9613cdd9f5f80a1005b3461029b575f36600319011261029b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461029b575f36600319011261029b576005546040516001600160a01b039091168152602090f35b3461029b575f36600319011261029b576109e66118e8565b6006546001600160a01b03166109fd811515611333565b610a096009541561136e565b604051630240bc6b60e21b8152606081600481855afa9182156105dd575f915f93610b5a575b50604051630dfe168160e01b8152602081600481855afa9081156105dd575f91610b3b575b506001600160a01b03163003610b2c576001600160701b0382165b604051630dfe168160e01b815290602082600481865afa9182156105dd577e73c775b33e2d3383eb1bd6dc296dbde492c3a2800b77f08ba64d487c354c7195604095610ae8946001600160701b03935f91610b0d575b506001600160a01b03163003610b04575016905b15159081610afa575b50611417565b426009558151908152426020820152a1005b9050151585610ae2565b90501690610ad9565b610b26915060203d6020116105d6576105c88183611240565b89610ac5565b6001600160701b038316610a6f565b610b54915060203d6020116105d6576105c88183611240565b84610a54565b909250610b7f915060603d606011610b87575b610b778183611240565b8101906113c2565b509183610a2f565b503d610b6d565b3461029b57602036600319011261029b57610ba7611214565b600754610bc59060ff906102fe336001600160a01b03831614611276565b6001600160a01b03165f818152600860209081526040808320805460ff19169055519182527ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a2005b3461029b575f36600319011261029b57600754610c36336001600160a01b03831614611276565b610c4161092a61160d565b60ff8160a01c16610cdc5760095415610ca55760ff60a01b1916600160a01b17600755600a5415610c9c575b7fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9236020600a54604051908152a1005b42600a55610c6d565b60405162461bcd60e51b815260206004820152600f60248201526e50616972206e6f742061637469766560881b6044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606490fd5b3461029b575f36600319011261029b576020600954604051908152f35b3461029b575f36600319011261029b57610d486118e8565b600580546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461029b575f36600319011261029b57602060ff60075460a81c166040519015158152f35b3461029b57602036600319011261029b576001600160a01b03610dd1611214565b165f525f602052602060405f2054604051908152f35b3461029b575f36600319011261029b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461029b575f36600319011261029b57602060405161012c8152f35b3461029b575f36600319011261029b57602060ff60075460a01c166040519015158152f35b3461029b575f36600319011261029b576007546040516001600160a01b039091168152602090f35b3461029b57604036600319011261029b57610ead611214565b335f52600160205260405f2060018060a01b0382165f5260205260405f20546024358101809111610ee2576106ca9133611509565b634e487b7160e01b5f52601160045260245ffd5b3461029b575f36600319011261029b57602060405160128152f35b3461029b575f36600319011261029b576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461029b57606036600319011261029b57610f6e611214565b610f7661122a565b6001600160a01b0382165f908152600160208181526040808420338552909152909120549260443592918401610fb1575b6106ca9350611631565b828410610fcd57610fc8836106ca95033383611509565b610fa7565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461029b575f36600319011261029b57600754611039336001600160a01b03831614611276565b61104461092a61160d565b60ff8160a81c16156110805760ff60a81b19166007557f709efb522a4f233bb5eb68dce0aad3a8200badcf0a81efec1bd7b8f88d0886075f80a1005b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606490fd5b3461029b575f36600319011261029b576020600254604051908152f35b3461029b57604036600319011261029b576106ca6110f1611214565b6024359033611509565b3461029b575f36600319011261029b57602060405160648152f35b3461029b575f36600319011261029b5760206040516162708152f35b3461029b575f36600319011261029b575f6003548060011c906001811680156111e0575b6020831081146108da578285529081156108b65750600114611182576108548361084881850382611240565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b8082106111c657509091508101602001610848610838565b9192600181602092548385880101520191019092916111ae565b91607f1691611156565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361029b57565b602435906001600160a01b038216820361029b57565b90601f8019910116810190811067ffffffffffffffff82111761126257604052565b634e487b7160e01b5f52604160045260245ffd5b1561127d57565b60405162461bcd60e51b815260206004820152601060248201526f2737ba103630bab731b41030b236b4b760811b6044820152606490fd5b156112bc57565b60405162461bcd60e51b815260206004820152600e60248201526d13185d5b98da08195e1c1a5c995960921b6044820152606490fd5b156112f957565b60405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd08191a5cd8589b195960721b6044820152606490fd5b1561133a57565b60405162461bcd60e51b815260206004820152600c60248201526b14185a5c881b9bdd081cd95d60a21b6044820152606490fd5b1561137557565b60405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481858dd1a5d985d1959607a1b6044820152606490fd5b51906001600160701b038216820361029b57565b9081606091031261029b576113d6816113ae565b9160406113e5602084016113ae565b92015163ffffffff8116810361029b5790565b9081602091031261029b57516001600160a01b038116810361029b5790565b1561141e57565b60405162461bcd60e51b815260206004820152600c60248201526b4e6f206c697175696469747960a01b6044820152606490fd5b91908203918211610ee257565b600a5480156114c9576114729042611452565b62278d0081106114c257624f1a0081106114bb576283d60081106114b45762ed4e0081106114ad576301e13380116114a8575f90565b60fa90565b506101f490565b506102ee90565b506103e890565b506107d090565b505f90565b156114d557565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103830b4b960a11b6044820152606490fd5b6001600160a01b03169081156115bc576001600160a01b031691821561156c5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b600954801515908161161d575090565b90506162708101809111610ee25742111590565b8291906001600160a01b03808216907f0000000000000000000000000000000000000000000000000000000000000000168181141590816118d4575b50611680575b5061167e9350611d6f565b565b600954801515919082806118ca575b806118b6575b611861575b6116a48585611940565b82611847575b5081611832575b50611809575b6006546001600160a01b038381169116146116d3575b83611673565b60405163eddaa3ab60e01b81529092506020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa5f91816117cc575b506117c7575060015b611782576009548015159081611768575b5061167e9361174b91611751575b83611c6e565b916116cd565b61175a84611a3e565b61176381611b0c565b611745565b905062278d008101809111610ee25742111561167e611737565b60405162461bcd60e51b815260206004820152601960248201527f456d657267656e63793a2073656c6c732064697361626c6564000000000000006044820152606490fd5b611726565b9091506020813d602011611801575b816117e860209383611240565b8101031261029b5751801515810361029b57905f61171d565b3d91506117db565b60018060a01b038216805f52600b6020524260405f20555f52600c6020524360405f20556116b7565b6006546001600160a01b03161490505f6116b1565b90915062278d008101809111610ee257421115905f6116aa565b6162708101808211610ee257600a8190556007805460ff60a01b1916600160a01b1790556040519081527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390602090a161169a565b506162708101808211610ee2574211611695565b50600a541561168f565b6001600160a01b038516141590505f61166d565b6005546001600160a01b031633036118fc57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61194861160d565b15611a3a5760ff60075460a01c161561195f575050565b6006546001600160a01b0391821691168181036119d45750506001600160a01b03165f9081526008602052604090205460ff161561199957565b60405162461bcd60e51b8152602060048201526013602482015272109d5e481b9bdd081dda1a5d195b1a5cdd1959606a1b6044820152606490fd5b90916001600160a01b0316146119e8575b50565b5f52600860205260ff60405f205416156119fe57565b60405162461bcd60e51b815260206004820152601460248201527314d95b1b081b9bdd081dda1a5d195b1a5cdd195960621b6044820152606490fd5b5050565b6001600160a01b03165f818152600b6020526040902054908115611a3a575f52600c60205260405f2054431115611abb5761012c8101809111610ee2574210611a8357565b60405162461bcd60e51b815260206004820152601060248201526f486f6c642074696d652061637469766560801b6044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754e6f206275792b73656c6c2073616d6520626c6f636b60501b6044820152606490fd5b81810292918115918404141715610ee257565b6009548015611a3a5762093a808101808211610ee2574211611c54575060325b6006546001600160a01b031690611b44821515611333565b604051630240bc6b60e21b815290606082600481865afa9283156105dd575f925f94611c27575b50602060049160405192838092630dfe168160e01b82525afa9283156105dd5761271094611bc6946001600160701b03935f91611c08575b506001600160a01b03163003611c005750165b611bc1811515611417565b611af9565b0410611bce57565b60405162461bcd60e51b815260206004820152600a6024820152690a6cad8d8407c40dac2f60b31b6044820152606490fd5b905016611bb6565b611c21915060203d6020116105d6576105c88183611240565b5f611ba3565b600491945060209350611c489060603d606011610b8757610b778183611240565b50939093949150611b6b565b62278d008101809111610ee25742116119e5576064611b2c565b90611c7761145f565b8015611d6957611c8a6127109183611af9565b04908115611d6357611f40820292828404611f4003610ee2577f1177816916f9c1658850314999704de1236b4ce2f2ea904d8f508926ac32436f6080612710611d30960492611cd98487611452565b611d04857f000000000000000000000000000000000000000000000000000000000000000084611d6f565b80611d33575b604051948686528760208701526040860152606085015260018060a01b031692a2611452565b90565b611d5e817f000000000000000000000000000000000000000000000000000000000000000084611d6f565b611d0a565b91505090565b50905090565b6001600160a01b0316908115611e92576001600160a01b0316918215611e4157815f525f60205260405f2054818110611ded57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212208e6fb12265a593b3839aaa3f6b313c3dc694bacf19250054aae6b3efb96922e464736f6c6343000821003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000cecb8f27f4200f3a0000000000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a869680000000000000000000000003183bd5eb7222cdc2a7bcc93747a85414447736b0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a8696800000000000000000000000089db62998c1edcb96d3341fd9761cbf27bd599ca0000000000000000000000002f2ae6786e418d3c5f2f64277f211a3a13107a39000000000000000000000000000000000000000000000000000000000000000e48656c69786f204e6574776f726b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003484c580000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde031461113257508063075e3a0e1461111657806307a8e8f5146110fb578063095ea7b3146110d557806318160ddd146110b857806323684d241461101257806323b872dd14610f555780632d7e557d14610f11578063313ce56714610ef65780633950935114610e9457806346ed6ccf14610e6c5780634ada218b14610e475780635aa9f0ec14610e2b57806361d027b314610de757806370a0823114610db057806370c757ec14610d8b578063715018a614610d305780638a3bc68314610d135780638a8c523c14610c0f5780638ab1d68114610b8e5780638d8e7a6a146109ce5780638da5cb5b146109a65780638ea5220f146109625780638fdb2bfe146108f857806395d89b41146107f45780639b19251a146107b75780639be3c85b146107955780639f15b18814610778578063a457c2d7146106d5578063a9059cbb146106a4578063ae36f5c814610467578063aef5eb2d1461042f578063c31fe80a14610412578063ca4d6028146103da578063d7434e22146103bf578063dd62ed3e1461036f578063e1a4521814610353578063e43252d7146102c7578063f242ab411461029f5763f2fde38b146101d4575f80fd5b3461029b57602036600319011261029b576101ed611214565b6101f56118e8565b6001600160a01b0316801561024757600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b5f80fd5b3461029b575f36600319011261029b576006546040516001600160a01b039091168152602090f35b3461029b57602036600319011261029b576102e0611214565b6007546103079060ff906102fe336001600160a01b03831614611276565b60a81c166112f2565b60018060a01b0316805f52600860205260405f20600160ff198254161790557ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d602060405160018152a2005b3461029b575f36600319011261029b5760206040516127108152f35b3461029b57604036600319011261029b57610388611214565b61039061122a565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b3461029b575f36600319011261029b57602060405160328152f35b3461029b57602036600319011261029b576001600160a01b036103fb611214565b165f52600b602052602060405f2054604051908152f35b3461029b575f36600319011261029b576020600a54604051908152f35b3461029b57602036600319011261029b576001600160a01b03610450611214565b165f52600c602052602060405f2054604051908152f35b3461029b57602036600319011261029b57610480611214565b6104886118e8565b6001600160a01b038116908115610673576104a5308314156114ce565b3b1561063f57600654906001600160a01b038216610607576104c96009541561136e565b604051630dfe168160e01b8152602081600481855afa9081156105dd575f916105e8575b506001600160a01b031630148015610546575b90807fc3cd203585fbc28dcc1692611d2ebc4190312a5b189047df793c69b157aa0d299361052f6020946114ce565b6001600160a01b03191617600655604051908152a1005b5060405163d21220a760e01b815290602082600481845afa80156105dd577fc3cd203585fbc28dcc1692611d2ebc4190312a5b189047df793c69b157aa0d299361052f83926020955f916105b0575b509195509193506001600160a01b0316301491506105009050565b6105d09150863d88116105d6575b6105c88183611240565b8101906113f8565b87610595565b503d6105be565b6040513d5f823e3d90fd5b610601915060203d6020116105d6576105c88183611240565b836104ed565b60405162461bcd60e51b815260206004820152601060248201526f14185a5c88185b1c9958591e481cd95d60821b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b139bdd0818dbdb9d1c9858dd60a21b6044820152606490fd5b60405162461bcd60e51b815260206004820152600960248201526850616972207a65726f60b81b6044820152606490fd5b3461029b57604036600319011261029b576106ca6106c0611214565b6024359033611631565b602060405160018152f35b3461029b57604036600319011261029b576106ee611214565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f205491808310610725576106ca92039033611509565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461029b575f36600319011261029b57602060405162278d008152f35b3461029b575f36600319011261029b5760206107af61145f565b604051908152f35b3461029b57602036600319011261029b576001600160a01b036107d8611214565b165f526008602052602060ff60405f2054166040519015158152f35b3461029b575f36600319011261029b576040515f6004548060011c906001811680156108ee575b6020831081146108da578285529081156108b65750600114610858575b6108548361084881850382611240565b604051918291826111ea565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b80821061089c57509091508101602001610848610838565b919260018160209254838588010152019101909291610884565b60ff191660208086019190915291151560051b840190910191506108489050610838565b634e487b7160e01b5f52602260045260245ffd5b91607f169161081b565b3461029b575f36600319011261029b5760075461091f336001600160a01b03831614611276565b61092f61092a61160d565b6112b5565b6001600160a01b0319166007557f3304a4eac4b1da51949262f91f8f924cd76c970f38971f658c21fce9613cdd9f5f80a1005b3461029b575f36600319011261029b576040517f0000000000000000000000003183bd5eb7222cdc2a7bcc93747a85414447736b6001600160a01b03168152602090f35b3461029b575f36600319011261029b576005546040516001600160a01b039091168152602090f35b3461029b575f36600319011261029b576109e66118e8565b6006546001600160a01b03166109fd811515611333565b610a096009541561136e565b604051630240bc6b60e21b8152606081600481855afa9182156105dd575f915f93610b5a575b50604051630dfe168160e01b8152602081600481855afa9081156105dd575f91610b3b575b506001600160a01b03163003610b2c576001600160701b0382165b604051630dfe168160e01b815290602082600481865afa9182156105dd577e73c775b33e2d3383eb1bd6dc296dbde492c3a2800b77f08ba64d487c354c7195604095610ae8946001600160701b03935f91610b0d575b506001600160a01b03163003610b04575016905b15159081610afa575b50611417565b426009558151908152426020820152a1005b9050151585610ae2565b90501690610ad9565b610b26915060203d6020116105d6576105c88183611240565b89610ac5565b6001600160701b038316610a6f565b610b54915060203d6020116105d6576105c88183611240565b84610a54565b909250610b7f915060603d606011610b87575b610b778183611240565b8101906113c2565b509183610a2f565b503d610b6d565b3461029b57602036600319011261029b57610ba7611214565b600754610bc59060ff906102fe336001600160a01b03831614611276565b6001600160a01b03165f818152600860209081526040808320805460ff19169055519182527ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a2005b3461029b575f36600319011261029b57600754610c36336001600160a01b03831614611276565b610c4161092a61160d565b60ff8160a01c16610cdc5760095415610ca55760ff60a01b1916600160a01b17600755600a5415610c9c575b7fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9236020600a54604051908152a1005b42600a55610c6d565b60405162461bcd60e51b815260206004820152600f60248201526e50616972206e6f742061637469766560881b6044820152606490fd5b60405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606490fd5b3461029b575f36600319011261029b576020600954604051908152f35b3461029b575f36600319011261029b57610d486118e8565b600580546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461029b575f36600319011261029b57602060ff60075460a81c166040519015158152f35b3461029b57602036600319011261029b576001600160a01b03610dd1611214565b165f525f602052602060405f2054604051908152f35b3461029b575f36600319011261029b576040517f0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a869686001600160a01b03168152602090f35b3461029b575f36600319011261029b57602060405161012c8152f35b3461029b575f36600319011261029b57602060ff60075460a01c166040519015158152f35b3461029b575f36600319011261029b576007546040516001600160a01b039091168152602090f35b3461029b57604036600319011261029b57610ead611214565b335f52600160205260405f2060018060a01b0382165f5260205260405f20546024358101809111610ee2576106ca9133611509565b634e487b7160e01b5f52601160045260245ffd5b3461029b575f36600319011261029b57602060405160128152f35b3461029b575f36600319011261029b576040517f00000000000000000000000089db62998c1edcb96d3341fd9761cbf27bd599ca6001600160a01b03168152602090f35b3461029b57606036600319011261029b57610f6e611214565b610f7661122a565b6001600160a01b0382165f908152600160208181526040808420338552909152909120549260443592918401610fb1575b6106ca9350611631565b828410610fcd57610fc8836106ca95033383611509565b610fa7565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461029b575f36600319011261029b57600754611039336001600160a01b03831614611276565b61104461092a61160d565b60ff8160a81c16156110805760ff60a81b19166007557f709efb522a4f233bb5eb68dce0aad3a8200badcf0a81efec1bd7b8f88d0886075f80a1005b60405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e48191a5cd8589b195960821b6044820152606490fd5b3461029b575f36600319011261029b576020600254604051908152f35b3461029b57604036600319011261029b576106ca6110f1611214565b6024359033611509565b3461029b575f36600319011261029b57602060405160648152f35b3461029b575f36600319011261029b5760206040516162708152f35b3461029b575f36600319011261029b575f6003548060011c906001811680156111e0575b6020831081146108da578285529081156108b65750600114611182576108548361084881850382611240565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b8082106111c657509091508101602001610848610838565b9192600181602092548385880101520191019092916111ae565b91607f1691611156565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361029b57565b602435906001600160a01b038216820361029b57565b90601f8019910116810190811067ffffffffffffffff82111761126257604052565b634e487b7160e01b5f52604160045260245ffd5b1561127d57565b60405162461bcd60e51b815260206004820152601060248201526f2737ba103630bab731b41030b236b4b760811b6044820152606490fd5b156112bc57565b60405162461bcd60e51b815260206004820152600e60248201526d13185d5b98da08195e1c1a5c995960921b6044820152606490fd5b156112f957565b60405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd08191a5cd8589b195960721b6044820152606490fd5b1561133a57565b60405162461bcd60e51b815260206004820152600c60248201526b14185a5c881b9bdd081cd95d60a21b6044820152606490fd5b1561137557565b60405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481858dd1a5d985d1959607a1b6044820152606490fd5b51906001600160701b038216820361029b57565b9081606091031261029b576113d6816113ae565b9160406113e5602084016113ae565b92015163ffffffff8116810361029b5790565b9081602091031261029b57516001600160a01b038116810361029b5790565b1561141e57565b60405162461bcd60e51b815260206004820152600c60248201526b4e6f206c697175696469747960a01b6044820152606490fd5b91908203918211610ee257565b600a5480156114c9576114729042611452565b62278d0081106114c257624f1a0081106114bb576283d60081106114b45762ed4e0081106114ad576301e13380116114a8575f90565b60fa90565b506101f490565b506102ee90565b506103e890565b506107d090565b505f90565b156114d557565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103830b4b960a11b6044820152606490fd5b6001600160a01b03169081156115bc576001600160a01b031691821561156c5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b600954801515908161161d575090565b90506162708101809111610ee25742111590565b8291906001600160a01b03808216907f0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a86968168181141590816118d4575b50611680575b5061167e9350611d6f565b565b600954801515919082806118ca575b806118b6575b611861575b6116a48585611940565b82611847575b5081611832575b50611809575b6006546001600160a01b038381169116146116d3575b83611673565b60405163eddaa3ab60e01b81529092506020816004817f00000000000000000000000089db62998c1edcb96d3341fd9761cbf27bd599ca6001600160a01b03165afa5f91816117cc575b506117c7575060015b611782576009548015159081611768575b5061167e9361174b91611751575b83611c6e565b916116cd565b61175a84611a3e565b61176381611b0c565b611745565b905062278d008101809111610ee25742111561167e611737565b60405162461bcd60e51b815260206004820152601960248201527f456d657267656e63793a2073656c6c732064697361626c6564000000000000006044820152606490fd5b611726565b9091506020813d602011611801575b816117e860209383611240565b8101031261029b5751801515810361029b57905f61171d565b3d91506117db565b60018060a01b038216805f52600b6020524260405f20555f52600c6020524360405f20556116b7565b6006546001600160a01b03161490505f6116b1565b90915062278d008101809111610ee257421115905f6116aa565b6162708101808211610ee257600a8190556007805460ff60a01b1916600160a01b1790556040519081527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e92390602090a161169a565b506162708101808211610ee2574211611695565b50600a541561168f565b6001600160a01b038516141590505f61166d565b6005546001600160a01b031633036118fc57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61194861160d565b15611a3a5760ff60075460a01c161561195f575050565b6006546001600160a01b0391821691168181036119d45750506001600160a01b03165f9081526008602052604090205460ff161561199957565b60405162461bcd60e51b8152602060048201526013602482015272109d5e481b9bdd081dda1a5d195b1a5cdd1959606a1b6044820152606490fd5b90916001600160a01b0316146119e8575b50565b5f52600860205260ff60405f205416156119fe57565b60405162461bcd60e51b815260206004820152601460248201527314d95b1b081b9bdd081dda1a5d195b1a5cdd195960621b6044820152606490fd5b5050565b6001600160a01b03165f818152600b6020526040902054908115611a3a575f52600c60205260405f2054431115611abb5761012c8101809111610ee2574210611a8357565b60405162461bcd60e51b815260206004820152601060248201526f486f6c642074696d652061637469766560801b6044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754e6f206275792b73656c6c2073616d6520626c6f636b60501b6044820152606490fd5b81810292918115918404141715610ee257565b6009548015611a3a5762093a808101808211610ee2574211611c54575060325b6006546001600160a01b031690611b44821515611333565b604051630240bc6b60e21b815290606082600481865afa9283156105dd575f925f94611c27575b50602060049160405192838092630dfe168160e01b82525afa9283156105dd5761271094611bc6946001600160701b03935f91611c08575b506001600160a01b03163003611c005750165b611bc1811515611417565b611af9565b0410611bce57565b60405162461bcd60e51b815260206004820152600a6024820152690a6cad8d8407c40dac2f60b31b6044820152606490fd5b905016611bb6565b611c21915060203d6020116105d6576105c88183611240565b5f611ba3565b600491945060209350611c489060603d606011610b8757610b778183611240565b50939093949150611b6b565b62278d008101809111610ee25742116119e5576064611b2c565b90611c7761145f565b8015611d6957611c8a6127109183611af9565b04908115611d6357611f40820292828404611f4003610ee2577f1177816916f9c1658850314999704de1236b4ce2f2ea904d8f508926ac32436f6080612710611d30960492611cd98487611452565b611d04857f0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a8696884611d6f565b80611d33575b604051948686528760208701526040860152606085015260018060a01b031692a2611452565b90565b611d5e817f0000000000000000000000003183bd5eb7222cdc2a7bcc93747a85414447736b84611d6f565b611d0a565b91505090565b50905090565b6001600160a01b0316908115611e92576001600160a01b0316918215611e4157815f525f60205260405f2054818110611ded57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212208e6fb12265a593b3839aaa3f6b313c3dc694bacf19250054aae6b3efb96922e464736f6c63430008210033

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

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000cecb8f27f4200f3a0000000000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a869680000000000000000000000003183bd5eb7222cdc2a7bcc93747a85414447736b0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a8696800000000000000000000000089db62998c1edcb96d3341fd9761cbf27bd599ca0000000000000000000000002f2ae6786e418d3c5f2f64277f211a3a13107a39000000000000000000000000000000000000000000000000000000000000000e48656c69786f204e6574776f726b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003484c580000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Helixo Network
Arg [1] : symbol_ (string): HLX
Arg [2] : totalSupply_ (uint256): 250000000000000000000000000
Arg [3] : _treasury (address): 0x8bB799FaEa17C6E5ed475CD31A956a75c4A86968
Arg [4] : _devWallet (address): 0x3183Bd5eb7222cDc2a7BCc93747A85414447736b
Arg [5] : _launchAdmin (address): 0x8bB799FaEa17C6E5ed475CD31A956a75c4A86968
Arg [6] : _emergencyGuard (address): 0x89db62998c1EDCB96d3341fD9761CBF27bd599Ca
Arg [7] : _mintTo (address): 0x2F2Ae6786e418D3c5F2F64277f211a3A13107A39

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 000000000000000000000000000000000000000000cecb8f27f4200f3a000000
Arg [3] : 0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a86968
Arg [4] : 0000000000000000000000003183bd5eb7222cdc2a7bcc93747a85414447736b
Arg [5] : 0000000000000000000000008bb799faea17c6e5ed475cd31a956a75c4a86968
Arg [6] : 00000000000000000000000089db62998c1edcb96d3341fd9761cbf27bd599ca
Arg [7] : 0000000000000000000000002f2ae6786e418d3c5f2f64277f211a3a13107a39
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [9] : 48656c69786f204e6574776f726b000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [11] : 484c580000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.