S Price: $0.431426 (-1.33%)

Token

Moonshot (MSHOT)

Overview

Max Total Supply

1,000,000,000 MSHOT

Holders

1

Total Transfers

-

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
MoonshotToken

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 11 : MoonshotToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {ERC20Burnable} from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";

import {IRouter03} from "./interfaces/IRouter03.sol";
import {IPairFactory} from "./interfaces/IPairFactory.sol";
import {IMoonshotToken} from "./interfaces/IMoonshotToken.sol";

contract MoonshotToken is ERC20Burnable, IMoonshotToken, ReentrancyGuard {
    CurveType public constant curveType = CurveType.ConstantProductV1;

    uint256 public initalTokenSupply;
    uint256 public virtualTokenReserves;
    uint256 public virtualCollateralReserves;
    uint256 public immutable virtualCollateralReservesInitial;

    uint256 public immutable feeBPS;
    uint256 public immutable dexFeeBPS;

    uint256 public immutable mcLowerLimit;
    uint256 public immutable mcUpperLimit;
    uint256 public immutable tokensMigrationThreshold;

    uint256 public immutable fixedMigrationFee;
    uint256 public immutable poolCreationFee;

    address public immutable creator;
    address public immutable treasury;
    address public immutable dexTreasury;
    address public immutable factory;

    bool public tradingStopped;
    bool public sendingToPairNotAllowed = true;

    uint256 public constant MAX_BPS = 10_000;

    IRouter03 public immutable solidlyRouter;

    modifier buyChecks() {
        if (tradingStopped) revert TradingStopped();
        _;
        _checkMcLower();
        _checkMcUpperLimit();
    }

    modifier sellChecks() {
        if (tradingStopped) revert TradingStopped();
        _;
    }

    modifier onlyFactory() {
        if (msg.sender != factory) revert OnlyFactory();
        _;
    }

    constructor(ConstructorParams memory _params) ERC20(_params.name, _params.symbol) {
        _mint(address(this), _params.totalSupply);

        initalTokenSupply = _params.totalSupply;
        virtualCollateralReserves = _params.virtualCollateralReserves;
        virtualCollateralReservesInitial = _params.virtualCollateralReserves;
        virtualTokenReserves = _params.virtualTokenReserves;

        creator = _params.creator;

        feeBPS = _params.feeBasisPoints;
        dexFeeBPS = _params.dexFeeBasisPoints;

        treasury = _params.treasury;
        dexTreasury = _params.dexTreasury;

        fixedMigrationFee = _params.migrationFeeFixed;
        poolCreationFee = _params.poolCreationFee;

        mcLowerLimit = _params.mcLowerLimit;
        mcUpperLimit = _params.mcUpperLimit;
        tokensMigrationThreshold = _params.tokensMigrationThreshold;

        solidlyRouter = IRouter03(_params.solidlyRouter);
        factory = msg.sender;
    }

    /**
     * @dev Buys tokenAmount of tokens for eth, refunding excess eth
     *
     * @param _tokenAmount - amount of tokens to buy
     * @param _maxCollateralAmount - maximum amount of collateral a caller is willing to spend
     */
    function buyExactOut(
        uint256 _tokenAmount,
        uint256 _maxCollateralAmount
    )
        external
        payable
        onlyFactory
        buyChecks
        returns (uint256 collateralToPayWithFee, uint256 helioFee, uint256 dexFee)
    {
        if (balanceOf(address(this)) <= _tokenAmount) revert InsufficientTokenReserves();

        uint256 collateralToSpend = (_tokenAmount * virtualCollateralReserves) / (virtualTokenReserves - _tokenAmount);
        (helioFee, dexFee) = _calculateFee(collateralToSpend);

        collateralToPayWithFee = collateralToSpend + helioFee + dexFee;

        if (collateralToPayWithFee > _maxCollateralAmount) revert SlippageCheckFailed();
        _transferCollateral(treasury, helioFee);
        _transferCollateral(dexTreasury, dexFee);

        virtualTokenReserves -= _tokenAmount;
        virtualCollateralReserves += collateralToSpend;

        uint256 refund;
        if (msg.value > collateralToPayWithFee) {
            // refund the user
            refund = msg.value - collateralToPayWithFee;
            _transferCollateral(msg.sender, refund);
        } else if (msg.value < collateralToPayWithFee) {
            revert NotEnoughtETHToBuyTokens();
        }

        _transfer(address(this), msg.sender, _tokenAmount);
    }

    /**
     * @dev Buys tokens specifing minimal amount of tokens a caller gets
     *
     * @param _amountOutMin - minimal amount of tokens a caller will get
     */
    function buyExactIn(
        uint256 _amountOutMin
    )
        external
        payable
        onlyFactory
        buyChecks
        returns (uint256 collateralToPayWithFee, uint256 helioFee, uint256 dexFee)
    {
        if (balanceOf(address(this)) <= _amountOutMin) revert InsufficientTokenReserves();

        collateralToPayWithFee = msg.value;
        (helioFee, dexFee) = _calculateFee(collateralToPayWithFee);
        uint256 collateralToSpendMinusFee = collateralToPayWithFee - helioFee - dexFee;

        _transferCollateral(treasury, helioFee);
        _transferCollateral(dexTreasury, dexFee);

        uint256 tokensOut = (collateralToSpendMinusFee * virtualTokenReserves) /
            (virtualCollateralReserves + collateralToSpendMinusFee);

        if (tokensOut < _amountOutMin) revert SlippageCheckFailed();

        virtualTokenReserves -= tokensOut;
        virtualCollateralReserves += collateralToSpendMinusFee;

        _transfer(address(this), msg.sender, tokensOut);
    }

    /**
     * @dev Sells given amount of tokens for eth
     *
     * @param _tokenAmount - amount of tokens a caller wants to sell
     * @param _amountCollateralMin - minimum amount of collateral a seller will get
     */
    function sellExactIn(
        uint256 _tokenAmount,
        uint256 _amountCollateralMin
    )
        external
        payable
        onlyFactory
        sellChecks
        returns (uint256 collateralToReceiveMinusFee, uint256 helioFee, uint256 dexFee)
    {
        uint256 collaterallToReceive = (_tokenAmount * virtualCollateralReserves) /
            (virtualTokenReserves + _tokenAmount);
        (helioFee, dexFee) = _calculateFee(collaterallToReceive);
        collateralToReceiveMinusFee = collaterallToReceive - helioFee - dexFee;
        _transferCollateral(treasury, helioFee);
        _transferCollateral(dexTreasury, dexFee);

        if (collateralToReceiveMinusFee < _amountCollateralMin) revert SlippageCheckFailed();

        virtualTokenReserves += _tokenAmount;
        virtualCollateralReserves -= collaterallToReceive;

        _transferCollateral(msg.sender, collateralToReceiveMinusFee);
        _transfer(msg.sender, address(this), _tokenAmount);
    }

    /**
     * @dev Sells given amount of tokens for eth
     *
     * @param _tokenAmountMax - max amount of tokens a caller wants to sell
     */
    function sellExactOut(
        uint256 _tokenAmountMax,
        uint256 _amountCollateral
    )
        external
        payable
        onlyFactory
        sellChecks
        returns (uint256 collateralToReceiveMinusFee, uint256 tokensOut, uint256 helioFee, uint256 dexFee)
    {
        (helioFee, dexFee) = _calculateFee(_amountCollateral);
        collateralToReceiveMinusFee = _amountCollateral - helioFee - dexFee;

        _transferCollateral(treasury, helioFee);
        _transferCollateral(dexTreasury, dexFee);

        tokensOut = (_amountCollateral * virtualTokenReserves) / (virtualCollateralReserves - _amountCollateral);

        if (tokensOut > _tokenAmountMax) revert SlippageCheckFailed();
        _transfer(msg.sender, address(this), tokensOut);

        virtualTokenReserves += tokensOut;
        virtualCollateralReserves -= _amountCollateral;

        _transferCollateral(msg.sender, collateralToReceiveMinusFee);
    }

    /**
     * @dev Calculates amountOut for a given amountIn
     *
     * @param _amountIn - amount in which will be transfered to the contract
     * @param _reserveIn - reserve in
     * @param _reserveOut - reserve out
     * @param _paymentTokenIsIn - if token in is a collateral token
     */
    function getAmountOutAndFee(
        uint256 _amountIn,
        uint256 _reserveIn,
        uint256 _reserveOut,
        bool _paymentTokenIsIn
    ) external view returns (uint256 amountOut, uint256 fee) {
        if (_paymentTokenIsIn) {
            (uint256 helioFee, uint256 dexFee) = _calculateFee(_amountIn);
            fee = helioFee + dexFee;

            amountOut = (_amountIn * _reserveOut) / (_reserveIn + _amountIn);
        } else {
            amountOut = (_amountIn * _reserveOut) / (_reserveIn + _amountIn);

            (uint256 helioFee, uint256 dexFee) = _calculateFee(amountOut);
            fee = helioFee + dexFee;
        }
    }

    /**
     * @dev Calculates amountIn for a given amountOut
     *
     * @param _amountOut - amount out which will be transfered from the contract
     * @param _reserveIn - reserve in
     * @param _reserveOut - reserve out
     * @param _paymentTokenIsOut - if token out is a payment token
     */
    function getAmountInAndFee(
        uint256 _amountOut,
        uint256 _reserveIn,
        uint256 _reserveOut,
        bool _paymentTokenIsOut
    ) external view returns (uint256 amountIn, uint256 fee) {
        if (_paymentTokenIsOut) {
            (uint256 helioFee, uint256 dexFee) = _calculateFee(_amountOut);
            fee = helioFee + dexFee;

            amountIn = (_amountOut * _reserveIn) / (_reserveOut - _amountOut);
        } else {
            amountIn = (_amountOut * _reserveIn) / (_reserveOut - _amountOut);
            (uint256 helioFee, uint256 dexFee) = _calculateFee(amountIn);

            fee = helioFee + dexFee;
        }
    }

    /**
     * @dev migrates tokens and collateral to uniswap-v2 and burns LP tokens
     */
    function migrate()
        external
        onlyFactory
        returns (uint256 tokensToMigrate, uint256 tokensToBurn, uint256 collateralAmount, address pair)
    {
        sendingToPairNotAllowed = false;

        uint256 tokensRemaining = balanceOf(address(this));
        this.approve(address(solidlyRouter), tokensRemaining);

        tokensToMigrate = _tokensToMigrate();
        tokensToBurn = tokensRemaining - tokensToMigrate;

        _burn(address(this), tokensToBurn);

        (uint256 treasuryFee, uint256 dexFee) = _splitFee(fixedMigrationFee);
        _transferCollateral(treasury, treasuryFee + poolCreationFee);
        _transferCollateral(dexTreasury, dexFee);

        collateralAmount =
            virtualCollateralReserves -
            virtualCollateralReservesInitial -
            treasuryFee -
            dexFee -
            poolCreationFee;

        (, , uint256 liquidity) = solidlyRouter.addLiquidityETH{value: collateralAmount}(
            address(this),
            false,
            tokensToMigrate,
            tokensToMigrate,
            collateralAmount,
            address(this),
            block.timestamp + 120 // 2 minutes
        );

        pair = IPairFactory(solidlyRouter.factory()).getPair(address(this), solidlyRouter.weth(), false);
        if (pair == address(0)) revert PairNotCreated();

        if (address(this).balance > 0) {
            _transferCollateral(treasury, address(this).balance);
        }

        IERC20(pair).transfer(address(0), liquidity);
    }

    function getMarketCap() public view returns (uint256) {
        uint256 mc = (virtualCollateralReserves * 10 ** 18 * totalSupply()) / virtualTokenReserves;
        return mc / 10 ** 18;
    }

    function getCurveProgressBps() external view returns (uint256) {
        uint256 progress = ((initalTokenSupply - balanceOf(address(this))) * MAX_BPS) / tokensMigrationThreshold;
        return progress < 100 ? 100 : (progress > MAX_BPS ? MAX_BPS : progress);
    }

    function _tokensToMigrate() internal view returns (uint256) {
        uint256 collateralDeductedFee = address(this).balance - fixedMigrationFee - poolCreationFee;
        return (virtualTokenReserves * collateralDeductedFee) / virtualCollateralReserves;
    }

    function _calculateFee(uint256 _amount) internal view returns (uint256 treasuryFee, uint256 dexFee) {
        treasuryFee = (_amount * feeBPS) / MAX_BPS;
        dexFee = (treasuryFee * dexFeeBPS) / MAX_BPS;
        treasuryFee -= dexFee;
    }

    function _splitFee(uint256 _feeAmount) internal view returns (uint256 treasuryFee, uint256 dexFee) {
        dexFee = (_feeAmount * dexFeeBPS) / MAX_BPS;
        treasuryFee = _feeAmount - dexFee;
    }

    function _transferCollateral(address _to, uint256 _amount) internal {
        (bool sent, ) = _to.call{value: _amount}("");
        if (!sent) revert FailedToSendETH();
    }

    function _checkMcUpperLimit() internal view {
        uint256 mc = getMarketCap();

        if (mc > mcUpperLimit) revert MarketcapThresholdReached();
    }

    function _checkMcLower() internal {
        uint256 mc = getMarketCap();

        if (mc > mcLowerLimit) {
            tradingStopped = true;
        }
    }
}

File 2 of 11 : 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 3 of 11 : 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 4 of 11 : 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 5 of 11 : 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 6 of 11 : 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 7 of 11 : 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 8 of 11 : 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 9 of 11 : IMoonshotToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IMoonshotToken is IERC20 {
    enum CurveType {
        ConstantProductV1
    }

    struct ConstructorParams {
        string name;
        string symbol;
        address creator;
        uint256 totalSupply;
        uint256 virtualTokenReserves;
        uint256 virtualCollateralReserves;
        uint256 feeBasisPoints;
        uint256 dexFeeBasisPoints;
        uint256 migrationFeeFixed;
        uint256 poolCreationFee;
        uint256 mcLowerLimit;
        uint256 mcUpperLimit;
        uint256 tokensMigrationThreshold;
        address treasury;
        address solidlyRouter;
        address dexTreasury;
    }

    error NotEnoughETHReserves();
    error InsufficientTokenReserves();
    error FailedToSendETH();
    error NotEnoughtETHToBuyTokens();
    error SlippageCheckFailed();
    error MarketcapThresholdReached();
    error SendingToPairIsNotAllowedBeforeMigration();
    error PairNotCreated();
    error TradingStopped();
    error OnlyFactory();

    function buyExactOut(
        uint256 _tokenAmount,
        uint256 _maxCollateralAmount
    ) external payable returns (uint256 collateralToPayWithFee, uint256 helioFee, uint256 dexFee);

    function buyExactIn(
        uint256 _amountOutMin
    ) external payable returns (uint256 collateralToPayWithFee, uint256 helioFee, uint256 dexFee);

    function sellExactIn(
        uint256 _tokenAmount,
        uint256 _amountOutMin
    ) external payable returns (uint256 collateralToReceiveMinusFee, uint256 helioFee, uint256 dexFee);

    function sellExactOut(
        uint256 _tokenAmountMax,
        uint256 _amountCollateral
    )
        external
        payable
        returns (uint256 collateralToReceiveMinusFee, uint256 tokensOut, uint256 helioFee, uint256 dexFee);

    function getAmountOutAndFee(
        uint256 _amountIn,
        uint256 _reserveIn,
        uint256 _reserveOut,
        bool _paymentTokenIsIn
    ) external view returns (uint256 amountOut, uint256 fee);

    function getAmountInAndFee(
        uint256 _amountOut,
        uint256 _reserveIn,
        uint256 _reserveOut,
        bool _paymentTokenIsOut
    ) external view returns (uint256 amountIn, uint256 fee);

    function migrate()
        external
        returns (uint256 tokensToMigrate, uint256 tokensToBurn, uint256 collateralAmount, address pair);

    function getCurveProgressBps() external view returns (uint256);

    function getMarketCap() external view returns (uint256);
}

File 10 of 11 : IPairFactory.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.23;
interface IPairFactory {
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function isPaused() external view returns (bool);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function getInitializable() external view returns (address, address, bool);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

File 11 of 11 : IRouter03.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IRouter03 {
    struct Route {
        address from;
        address to;
        bool stable;
    }

    function factory() external view returns (address);
    function weth() external view returns (address);
    function pairCodeHash() external view returns (bytes32);
    function voter() external view returns (address);

    function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair);
    function getReserves(
        address tokenA,
        address tokenB,
        bool stable
    ) external view returns (uint reserveA, uint reserveB);
    function getAmountOut(
        uint amountIn,
        address tokenIn,
        address tokenOut
    ) external view returns (uint amount, bool stable);
    function getAmountOut(
        uint amountIn,
        address tokenIn,
        address tokenOut,
        bool stable
    ) external view returns (uint amount);
    function getAmountsOut(uint amountIn, Route[] memory routes) external view returns (uint[] memory amounts);
    function isPair(address pair) external view returns (bool);

    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity);
    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB);

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        bool stable,
        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,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        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,
        bool stable,
        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 removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        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 swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        Route[] calldata routes,
        address to,
        uint deadline
    ) external returns (uint[] memory);

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"virtualTokenReserves","type":"uint256"},{"internalType":"uint256","name":"virtualCollateralReserves","type":"uint256"},{"internalType":"uint256","name":"feeBasisPoints","type":"uint256"},{"internalType":"uint256","name":"dexFeeBasisPoints","type":"uint256"},{"internalType":"uint256","name":"migrationFeeFixed","type":"uint256"},{"internalType":"uint256","name":"poolCreationFee","type":"uint256"},{"internalType":"uint256","name":"mcLowerLimit","type":"uint256"},{"internalType":"uint256","name":"mcUpperLimit","type":"uint256"},{"internalType":"uint256","name":"tokensMigrationThreshold","type":"uint256"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"solidlyRouter","type":"address"},{"internalType":"address","name":"dexTreasury","type":"address"}],"internalType":"struct IMoonshotToken.ConstructorParams","name":"_params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedToSendETH","type":"error"},{"inputs":[],"name":"InsufficientTokenReserves","type":"error"},{"inputs":[],"name":"MarketcapThresholdReached","type":"error"},{"inputs":[],"name":"NotEnoughETHReserves","type":"error"},{"inputs":[],"name":"NotEnoughtETHToBuyTokens","type":"error"},{"inputs":[],"name":"OnlyFactory","type":"error"},{"inputs":[],"name":"PairNotCreated","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SendingToPairIsNotAllowedBeforeMigration","type":"error"},{"inputs":[],"name":"SlippageCheckFailed","type":"error"},{"inputs":[],"name":"TradingStopped","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"inputs":[],"name":"MAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"buyExactIn","outputs":[{"internalType":"uint256","name":"collateralToPayWithFee","type":"uint256"},{"internalType":"uint256","name":"helioFee","type":"uint256"},{"internalType":"uint256","name":"dexFee","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"_maxCollateralAmount","type":"uint256"}],"name":"buyExactOut","outputs":[{"internalType":"uint256","name":"collateralToPayWithFee","type":"uint256"},{"internalType":"uint256","name":"helioFee","type":"uint256"},{"internalType":"uint256","name":"dexFee","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curveType","outputs":[{"internalType":"enum IMoonshotToken.CurveType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fixedMigrationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"_reserveOut","type":"uint256"},{"internalType":"bool","name":"_paymentTokenIsOut","type":"bool"}],"name":"getAmountInAndFee","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"_reserveOut","type":"uint256"},{"internalType":"bool","name":"_paymentTokenIsIn","type":"bool"}],"name":"getAmountOutAndFee","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurveProgressBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initalTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcLowerLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcUpperLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[{"internalType":"uint256","name":"tokensToMigrate","type":"uint256"},{"internalType":"uint256","name":"tokensToBurn","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCreationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint256","name":"_amountCollateralMin","type":"uint256"}],"name":"sellExactIn","outputs":[{"internalType":"uint256","name":"collateralToReceiveMinusFee","type":"uint256"},{"internalType":"uint256","name":"helioFee","type":"uint256"},{"internalType":"uint256","name":"dexFee","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmountMax","type":"uint256"},{"internalType":"uint256","name":"_amountCollateral","type":"uint256"}],"name":"sellExactOut","outputs":[{"internalType":"uint256","name":"collateralToReceiveMinusFee","type":"uint256"},{"internalType":"uint256","name":"tokensOut","type":"uint256"},{"internalType":"uint256","name":"helioFee","type":"uint256"},{"internalType":"uint256","name":"dexFee","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"sendingToPairNotAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"solidlyRouter","outputs":[{"internalType":"contract IRouter03","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMigrationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStopped","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":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualCollateralReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualCollateralReservesInitial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtualTokenReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

610220604052346200071d576200232b803803806200001e8162000722565b92833981016020828203126200071d5781516001600160401b0381116200071d576102008184018303126200071d576040519161020083016001600160401b03811184821017620005fc57604052838201516001600160401b0381116200071d57816200008f918487010162000748565b835283820160200151916001600160401b0383116200071d57620000bf6101e0926200017b948388010162000748565b94856020860152620000d6604083830101620007ba565b6040860152808201606081810151908701526080808201519087015260a0808201519087015260c0808201519087015260e080820151908701526101008082015190870152610120808201519087015261014080820151908701526101608082015190870152610180808201519087015262000156906101a001620007ba565b6101a08601526200016d6101c083830101620007ba565b6101c08601520101620007ba565b6101e0820152805180519092906001600160401b038111620005fc57600354600181811c9116801562000712575b6020821014620005db57601f8111620006a8575b506020601f82116001146200061e578192939460009262000612575b50508160011b916000199060031b1c1916176003555b8051906001600160401b038211620005fc5760045490600182811c92168015620005f1575b6020831014620005db5781601f84931162000569575b50602090601f8311600114620004da57600092620004ce575b50508160011b916000199060031b1c1916176004555b600160055561010061ff0019600954161760095560608101513015620004b55760025481810181116200049f578101600255306000526000602052604060002081815401905560405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a3606081015160065560a08101518060085560805260808101516007556101c060018060a01b0391826040820151166101805260c081015160a05260e081015160c052826101a0820151166101a052826101e0820151168252610100810151610140526101208101516101605261014081015160e052610160810151610100526101808101516101205201511661020052336101e052604051611b5b9081620007d0823960805181818161055901526108ac015260a0518181816113210152611782015260c05181818161081301528181610bf001526117ae015260e051818181610da30152611999015261010051818181610fca01526119d80152610120518181816101f301526112a201526101405181818161049f015261078001526101605181818161051e01526107bc0152610180518161158001526101a0518181816102e60152818161084601528181610c7b01528181610ddb01528181610ecd015261114301526101c0518181816103100152818161088001528181610b7301528181610ca501528181610ef7015261116d01526101e051818181610266015281816104d7015281816106ee01528181610c2201528181610e6201526110ad0152610200518181816107310152610e1f0152f35b634e487b7160e01b600052601160045260246000fd5b60405163ec442f0560e01b815260006004820152602490fd5b01519050388062000243565b6004600090815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91905b601f19841685106200054d576001945083601f1981161062000533575b505050811b0160045562000259565b015160001960f88460031b161c1916905538808062000524565b8181015183556020948501946001909301929091019062000507565b60046000529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810160208510620005d3575b90849392915b601f830160051c82018110620005c35750506200022a565b60008155859450600101620005ab565b5080620005a5565b634e487b7160e01b600052602260045260246000fd5b91607f169162000214565b634e487b7160e01b600052604160045260246000fd5b015190503880620001d9565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190601f198416905b8181106200068f5750958360019596971062000675575b505050811b01600355620001ef565b015160001960f88460031b161c1916905538808062000666565b9192602060018192868b0151815501940192016200064f565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c8101916020841062000707575b601f0160051c01905b818110620006fa5750620001bd565b60008155600101620006eb565b9091508190620006e2565b90607f1690620001a9565b600080fd5b6040519190601f01601f191682016001600160401b03811183821017620005fc57604052565b919080601f840112156200071d5782516001600160401b038111620005fc576020906200077e601f8201601f1916830162000722565b928184528282870101116200071d5760005b818110620007a657508260009394955001015290565b858101830151848201840152820162000790565b51906001600160a01b03821682036200071d5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826302d05d3f1461156c5750816306fdde0314611475578163095ea7b3146113cb57816315204481146113825781631655bc621461136357816318160ddd146113445781631a1c6e53146113095781632368da321461125957816323b872dd1461121c57816325e17b571461109b578163313ce5671461107f57816342966c681461106157816349a3024614610fed5781634c7766b514610fb25781634fb3fbe714610e4e57816361b3815514610e0a57816361d027b314610dc65781636d04eb9f14610d8b57816370a0823114610d545781637187631814610c1357816371ea0d8e14610bd857816379cc679014610ba257816385f377ca14610b5e5781638fd3ab80146106d257816390825c28146106ae57816395d89b41146105ad578163a9059cbb1461057c578163b026a12114610541578163be74615f14610506578163c45a0155146104c2578163c48afe1614610487578163c6d8b77814610460578163c78d0b0e14610441578163d3728de414610426578163dd62ed3e146103dd578163e8e70c4c146103be578163e98d5cd51461025957508063fd62bcd714610236578063fd967f471461021a5763fe94c269146101dd57600080fd5b34610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b5034610216578160031936011261021657602090516127108152f35b503461021657816003193601126102165760209060ff6009541690519015158152f35b8261026336611650565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036103af5760ff600954166103a0576102bf6102ad6008548461169e565b6102b9846007546116c7565b906116d4565b916102c983611773565b9390956102df856102da89856116f4565b6116f4565b9561030a887f0000000000000000000000000000000000000000000000000000000000000000611a10565b610334867f0000000000000000000000000000000000000000000000000000000000000000611a10565b861061039257508161035f6103739261035461038e9796956007546116c7565b6007556008546116f4565b60085561036c8633611a10565b30336118b1565b51938493846040919493926060820195825260208201520152565b0390f35b8351630a1c173f60e41b8152fd5b5163058aab2d60e21b81528390fd5b51630636a15760e11b81528390fd5b5050346102165781600319360112610216576020906008549051908152f35b505034610216578060031936011261021657806020926103fb6115f8565b610403611613565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50503461021657816003193601126102165751908152602090f35b5050346102165781600319360112610216576020906006549051908152f35b50503461021657816003193601126102165760209060ff60095460081c1690519015158152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102165780600319360112610216576020906105a661059c6115f8565b60243590336118b1565b5160018152f35b83833461021657816003193601126102165780519180938054916001908360011c92600185169485156106a4575b60209586861081146106915785895290811561066d5750600114610615575b61038e878761060b828c0383611666565b51918291826115af565b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b82841061065a575050508261038e9461060b928201019486806105fa565b805486850188015292860192810161063c565b60ff19168887015250505050151560051b830101925061060b8261038e86806105fa565b634e487b7160e01b845260228352602484fd5b93607f16936105db565b5050346102165781600319360112610216576020906106cb611738565b9051908152f35b905034610b5a5782600319360112610b5a576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081163303610b4b5761ff0019600954166009553084526020928484528085205493827f00000000000000000000000000000000000000000000000000000000000000001690825163095ea7b360e01b8152828682015286602482015281816044818b305af18015610a3157610b2e575b507f0000000000000000000000000000000000000000000000000000000000000000946107aa86476116f4565b926108d16107fa6107f36107ea6107e27f000000000000000000000000000000000000000000000000000000000000000080996116f4565b60075461169e565b600854906116d4565b809a6116f4565b946108058630611a86565b6102da6108406127106108387f00000000000000000000000000000000000000000000000000000000000000008d61169e565b04809b6116f4565b996102da7f00000000000000000000000000000000000000000000000000000000000000009b61087a8d61087487846116c7565b90611a10565b6108a4837f0000000000000000000000000000000000000000000000000000000000000000611a10565b6102da6008547f0000000000000000000000000000000000000000000000000000000000000000906116f4565b956078420191824211610b1b578a908751936302df835360e61b855230868601528260248601528b60448601528b60648601528960848601523060a486015260c485015260608460e4818c855af1938415610b11578294610adb575b50875163c45a015560e01b81529086828781845afa918215610ab25786929188918593610abc575b508a51633fc8cef360e01b815293849182905afa918215610ab25787928580936064938793610a93575b508c5196879586946306801cc360e41b8652308d8701521660248501526044840152165afa908115610a89578b91610a5c575b5016968715610a4c5747610a3b575b50845163a9059cbb60e01b8152918201899052602482015281816044818b8a5af18015610a315760809850610a04575b5082519586528501528301526060820152f35b610a2390823d8411610a2a575b610a1b8183611666565b810190611701565b50386109f1565b503d610a11565b84513d8a823e3d90fd5b610a46904790611a10565b386109c1565b855163c6bcf59960e01b81528390fd5b610a7c9150853d8711610a82575b610a748183611666565b810190611719565b386109b2565b503d610a6a565b87513d8d823e3d90fd5b610aab919350863d8811610a8257610a748183611666565b913861097f565b89513d85823e3d90fd5b610ad4919350823d8411610a8257610a748183611666565b9138610955565b9093506060813d606011610b09575b81610af760609383611666565b8101031261021657870151923861092d565b3d9150610aea565b88513d84823e3d90fd5b634e487b7160e01b8b526011845260248bfd5b610b4490823d8411610a2a57610a1b8183611666565b503861077d565b509051630636a15760e11b8152fd5b8280fd5b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50503461021657366003190112610bd557610bd2610bbe6115f8565b60243590610bcd8233836117de565b611a86565b80f35b80fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b9050610c1e36611650565b92907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610d465760ff60095416610d3857610c6384611773565b929091610c74846102da85896116f4565b94610c9f847f0000000000000000000000000000000000000000000000000000000000000000611a10565b610cc9857f0000000000000000000000000000000000000000000000000000000000000000611a10565b610ce4610cd86007548961169e565b6102b9896008546116f4565b918211610d2a5750610d09608096610cfd8330336118b1565b610354836007546116c7565b600855610d168533611a10565b815194855260208501528301526060820152f35b8251630a1c173f60e41b8152fd5b505163058aab2d60e21b8152fd5b5051630636a15760e11b8152fd5b5050346102165760203660031901126102165760209181906001600160a01b03610d7c6115f8565b16815280845220549051908152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9190506020366003190112610b5a578135927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610d465760ff60095416610d38578184913081528060205220541115610fa557610eb534611773565b939092610ec6856102da86346116f4565b90610ef1857f0000000000000000000000000000000000000000000000000000000000000000611a10565b610f1b867f0000000000000000000000000000000000000000000000000000000000000000611a10565b600754610f28818461169e565b91610f3a600854936102b986866116c7565b948510610f975750610f6b928492610f5961038e9796610f61946116f4565b6007556116c7565b60085533306118b1565b610f7361198f565b610f7b6119ce565b5192839234846040919493926060820195825260208201520152565b8551630a1c173f60e41b8152fd5b5163904db1ff60e01b8152fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b828434610bd557610ffd36611629565b91935091901561103f57906102b98261102b61102461101e61103196611773565b906116c7565b958261169e565b926116f4565b905b82519182526020820152f35b8061102b611050946102b99361169e565b61105c61101e82611773565b611033565b83903461021657602036600319011261021657610bd2903533611a86565b5050346102165781600319360112610216576020905160128152f35b90506110a636611650565b90939092907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610d465760ff60095416610d38578185913081528060205220541115610fa5576111126111066008548661169e565b6102b9866007546116f4565b9361111c85611773565b9390956111328561112d89846116c7565b6116c7565b95861161120d576111a890611167887f0000000000000000000000000000000000000000000000000000000000000000611a10565b611191867f0000000000000000000000000000000000000000000000000000000000000000611a10565b61119d846007546116f4565b6007556008546116c7565b6008558434116000146111e95750906111d961038e93926111d26111cc87346116f4565b33611a10565b33306118b1565b6111e161198f565b6103736119ce565b8434106111ff5750906111d961038e93926111d2565b82516367c45b4f60e11b8152fd5b508251630a1c173f60e41b8152fd5b505034610216576060366003190112610216576020906105a661123d6115f8565b611245611613565b604435916112548333836117de565b6118b1565b828434610bd55780600319360112610bd5576112826006543083528260205283832054906116f4565b9061271091828102908082048414901517156112f657602094506112c7907f0000000000000000000000000000000000000000000000000000000000000000906116d4565b9060648210156112de575050506064905b51908152f35b50818111156112ef57505b906112d8565b90506112e9565b634e487b7160e01b825260118552602482fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102165781600319360112610216576020906002549051908152f35b5050346102165781600319360112610216576020906007549051908152f35b828434610bd55761139236611629565b909350909190156113ba57906102b9826113b461102461101e61103196611773565b926116c7565b806113b4611050946102b99361169e565b905034610b5a5781600319360112610b5a576113e56115f8565b60243590331561145e576001600160a01b031691821561144757508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b91905034610b5a5782600319360112610b5a5780519183600354906001908260011c92600181168015611562575b602095868610821461154f575084885290811561152d57506001146114d4575b61038e868661060b828b0383611666565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061151a575050508261038e9461060b9282010194386114c3565b80548685018801529286019281016114fd565b60ff191687860152505050151560051b830101925061060b8261038e386114c3565b634e487b7160e01b845260229052602483fd5b93607f16936114a3565b8490346102165781600319360112610216577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6020808252825181830181905290939260005b8281106115e457505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016115c2565b600435906001600160a01b038216820361160e57565b600080fd5b602435906001600160a01b038216820361160e57565b608090600319011261160e57600435906024359060443590606435801515810361160e5790565b604090600319011261160e576004359060243590565b90601f8019910116810190811067ffffffffffffffff82111761168857604052565b634e487b7160e01b600052604160045260246000fd5b818102929181159184041417156116b157565b634e487b7160e01b600052601160045260246000fd5b919082018092116116b157565b81156116de570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116116b157565b9081602091031261160e5751801515810361160e5790565b9081602091031261160e57516001600160a01b038116810361160e5790565b600854670de0b6b3a764000090818102908082048314901517156116b15761176661176f916002549061169e565b600754906116d4565b0490565b6117db6117a7916127109283917f00000000000000000000000000000000000000000000000000000000000000009061169e565b04916117d37f00000000000000000000000000000000000000000000000000000000000000008461169e565b0480926116f4565b91565b9160018060a01b03809316916000938385526001602052604093848620918316918287526020528486205492600019840361181d575b50505050505050565b8484106118815750801561186957811561185157855260016020528385209085526020520391205538808080808080611814565b8451634a1406b160e11b815260048101879052602490fd5b845163e602df0560e01b815260048101879052602490fd5b8551637dc7a0d960e11b81526001600160a01b039190911660048201526024810184905260448101859052606490fd5b916001600160a01b03808416928315611976571692831561195d576000908382528160205260408220549083821061192b575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b611997611738565b7f0000000000000000000000000000000000000000000000000000000000000000106119bf57565b600160ff196009541617600955565b6119d6611738565b7f0000000000000000000000000000000000000000000000000000000000000000106119fe57565b6040516353dfa97560e01b8152600490fd5b60008080809481945af1903d15611a80573d9067ffffffffffffffff8211611a6c5760405191611a4a601f8201601f191660200184611666565b825260203d92013e5b15611a5a57565b6040516338822c1360e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b50611a53565b906001600160a01b0382169081156119765760009282845283602052604084205490828210611af35750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fdfea26469706673582212205c7701526c567d41e360a9217898a429269a3823cc13033e1a59a5f3ac2e251364736f6c6343000817003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000036ccfbb244887eea40000000000000000000000000000000000000000000000000001043561a882930000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000001043561a88293000000000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000001969368974c05b000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000c380f8e0bc1c7ed0d305ab00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389000000000000000000000000cc6169aa1e879d3a4227536671f85afdb2d23fad000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d805903200000000000000000000000000000000000000000000000000000000000000084d6f6f6e73686f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d53484f54000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060408181526004918236101561001657600080fd5b600092833560e01c91826302d05d3f1461156c5750816306fdde0314611475578163095ea7b3146113cb57816315204481146113825781631655bc621461136357816318160ddd146113445781631a1c6e53146113095781632368da321461125957816323b872dd1461121c57816325e17b571461109b578163313ce5671461107f57816342966c681461106157816349a3024614610fed5781634c7766b514610fb25781634fb3fbe714610e4e57816361b3815514610e0a57816361d027b314610dc65781636d04eb9f14610d8b57816370a0823114610d545781637187631814610c1357816371ea0d8e14610bd857816379cc679014610ba257816385f377ca14610b5e5781638fd3ab80146106d257816390825c28146106ae57816395d89b41146105ad578163a9059cbb1461057c578163b026a12114610541578163be74615f14610506578163c45a0155146104c2578163c48afe1614610487578163c6d8b77814610460578163c78d0b0e14610441578163d3728de414610426578163dd62ed3e146103dd578163e8e70c4c146103be578163e98d5cd51461025957508063fd62bcd714610236578063fd967f471461021a5763fe94c269146101dd57600080fd5b34610216578160031936011261021657602090517f000000000000000000000000000000000000000000c380f8e0bc1c7ed0d305ab8152f35b5080fd5b5034610216578160031936011261021657602090516127108152f35b503461021657816003193601126102165760209060ff6009541690519015158152f35b8261026336611650565b917f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b031633036103af5760ff600954166103a0576102bf6102ad6008548461169e565b6102b9846007546116c7565b906116d4565b916102c983611773565b9390956102df856102da89856116f4565b6116f4565b9561030a887f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611a10565b610334867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611a10565b861061039257508161035f6103739261035461038e9796956007546116c7565b6007556008546116f4565b60085561036c8633611a10565b30336118b1565b51938493846040919493926060820195825260208201520152565b0390f35b8351630a1c173f60e41b8152fd5b5163058aab2d60e21b81528390fd5b51630636a15760e11b81528390fd5b5050346102165781600319360112610216576020906008549051908152f35b505034610216578060031936011261021657806020926103fb6115f8565b610403611613565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50503461021657816003193601126102165751908152602090f35b5050346102165781600319360112610216576020906006549051908152f35b50503461021657816003193601126102165760209060ff60095460081c1690519015158152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000001043561a88293000008152f35b505034610216578160031936011261021657517f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000000056bc75e2d631000008152f35b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000001043561a882930000008152f35b5050346102165780600319360112610216576020906105a661059c6115f8565b60243590336118b1565b5160018152f35b83833461021657816003193601126102165780519180938054916001908360011c92600185169485156106a4575b60209586861081146106915785895290811561066d5750600114610615575b61038e878761060b828c0383611666565b51918291826115af565b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b82841061065a575050508261038e9461060b928201019486806105fa565b805486850188015292860192810161063c565b60ff19168887015250505050151560051b830101925061060b8261038e86806105fa565b634e487b7160e01b845260228352602484fd5b93607f16936105db565b5050346102165781600319360112610216576020906106cb611738565b9051908152f35b905034610b5a5782600319360112610b5a576001600160a01b037f00000000000000000000000056c4f0504f577a283073ab780b6850fec412138981163303610b4b5761ff0019600954166009553084526020928484528085205493827f000000000000000000000000cc6169aa1e879d3a4227536671f85afdb2d23fad1690825163095ea7b360e01b8152828682015286602482015281816044818b305af18015610a3157610b2e575b507f00000000000000000000000000000000000000000000001043561a8829300000946107aa86476116f4565b926108d16107fa6107f36107ea6107e27f0000000000000000000000000000000000000000000000056bc75e2d6310000080996116f4565b60075461169e565b600854906116d4565b809a6116f4565b946108058630611a86565b6102da6108406127106108387f00000000000000000000000000000000000000000000000000000000000017708d61169e565b04809b6116f4565b996102da7f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213899b61087a8d61087487846116c7565b90611a10565b6108a4837f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611a10565b6102da6008547f0000000000000000000000000000000000000000000001043561a88293000000906116f4565b956078420191824211610b1b578a908751936302df835360e61b855230868601528260248601528b60448601528b60648601528960848601523060a486015260c485015260608460e4818c855af1938415610b11578294610adb575b50875163c45a015560e01b81529086828781845afa918215610ab25786929188918593610abc575b508a51633fc8cef360e01b815293849182905afa918215610ab25787928580936064938793610a93575b508c5196879586946306801cc360e41b8652308d8701521660248501526044840152165afa908115610a89578b91610a5c575b5016968715610a4c5747610a3b575b50845163a9059cbb60e01b8152918201899052602482015281816044818b8a5af18015610a315760809850610a04575b5082519586528501528301526060820152f35b610a2390823d8411610a2a575b610a1b8183611666565b810190611701565b50386109f1565b503d610a11565b84513d8a823e3d90fd5b610a46904790611a10565b386109c1565b855163c6bcf59960e01b81528390fd5b610a7c9150853d8711610a82575b610a748183611666565b810190611719565b386109b2565b503d610a6a565b87513d8d823e3d90fd5b610aab919350863d8811610a8257610a748183611666565b913861097f565b89513d85823e3d90fd5b610ad4919350823d8411610a8257610a748183611666565b9138610955565b9093506060813d606011610b09575b81610af760609383611666565b8101031261021657870151923861092d565b3d9150610aea565b88513d84823e3d90fd5b634e487b7160e01b8b526011845260248bfd5b610b4490823d8411610a2a57610a1b8183611666565b503861077d565b509051630636a15760e11b8152fd5b8280fd5b505034610216578160031936011261021657517f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d80590326001600160a01b03168152602090f35b50503461021657366003190112610bd557610bd2610bbe6115f8565b60243590610bcd8233836117de565b611a86565b80f35b80fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000017708152f35b9050610c1e36611650565b92907f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03163303610d465760ff60095416610d3857610c6384611773565b929091610c74846102da85896116f4565b94610c9f847f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611a10565b610cc9857f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611a10565b610ce4610cd86007548961169e565b6102b9896008546116f4565b918211610d2a5750610d09608096610cfd8330336118b1565b610354836007546116c7565b600855610d168533611a10565b815194855260208501528301526060820152f35b8251630a1c173f60e41b8152fd5b505163058aab2d60e21b8152fd5b5051630636a15760e11b8152fd5b5050346102165760203660031901126102165760209181906001600160a01b03610d7c6115f8565b16815280845220549051908152f35b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000001969368974c05b000008152f35b505034610216578160031936011261021657517f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b505034610216578160031936011261021657517f000000000000000000000000cc6169aa1e879d3a4227536671f85afdb2d23fad6001600160a01b03168152602090f35b9190506020366003190112610b5a578135927f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03163303610d465760ff60095416610d38578184913081528060205220541115610fa557610eb534611773565b939092610ec6856102da86346116f4565b90610ef1857f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611a10565b610f1b867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611a10565b600754610f28818461169e565b91610f3a600854936102b986866116c7565b948510610f975750610f6b928492610f5961038e9796610f61946116f4565b6007556116c7565b60085533306118b1565b610f7361198f565b610f7b6119ce565b5192839234846040919493926060820195825260208201520152565b8551630a1c173f60e41b8152fd5b5163904db1ff60e01b8152fd5b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000010f0cf064dd5920000008152f35b828434610bd557610ffd36611629565b91935091901561103f57906102b98261102b61102461101e61103196611773565b906116c7565b958261169e565b926116f4565b905b82519182526020820152f35b8061102b611050946102b99361169e565b61105c61101e82611773565b611033565b83903461021657602036600319011261021657610bd2903533611a86565b5050346102165781600319360112610216576020905160128152f35b90506110a636611650565b90939092907f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03163303610d465760ff60095416610d38578185913081528060205220541115610fa5576111126111066008548661169e565b6102b9866007546116f4565b9361111c85611773565b9390956111328561112d89846116c7565b6116c7565b95861161120d576111a890611167887f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611a10565b611191867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611a10565b61119d846007546116f4565b6007556008546116c7565b6008558434116000146111e95750906111d961038e93926111d26111cc87346116f4565b33611a10565b33306118b1565b6111e161198f565b6103736119ce565b8434106111ff5750906111d961038e93926111d2565b82516367c45b4f60e11b8152fd5b508251630a1c173f60e41b8152fd5b505034610216576060366003190112610216576020906105a661123d6115f8565b611245611613565b604435916112548333836117de565b6118b1565b828434610bd55780600319360112610bd5576112826006543083528260205283832054906116f4565b9061271091828102908082048414901517156112f657602094506112c7907f000000000000000000000000000000000000000000c380f8e0bc1c7ed0d305ab906116d4565b9060648210156112de575050506064905b51908152f35b50818111156112ef57505b906112d8565b90506112e9565b634e487b7160e01b825260118552602482fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000648152f35b5050346102165781600319360112610216576020906002549051908152f35b5050346102165781600319360112610216576020906007549051908152f35b828434610bd55761139236611629565b909350909190156113ba57906102b9826113b461102461101e61103196611773565b926116c7565b806113b4611050946102b99361169e565b905034610b5a5781600319360112610b5a576113e56115f8565b60243590331561145e576001600160a01b031691821561144757508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b91905034610b5a5782600319360112610b5a5780519183600354906001908260011c92600181168015611562575b602095868610821461154f575084885290811561152d57506001146114d4575b61038e868661060b828b0383611666565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82841061151a575050508261038e9461060b9282010194386114c3565b80548685018801529286019281016114fd565b60ff191687860152505050151560051b830101925061060b8261038e386114c3565b634e487b7160e01b845260229052602483fd5b93607f16936114a3565b8490346102165781600319360112610216577f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b6020808252825181830181905290939260005b8281106115e457505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016115c2565b600435906001600160a01b038216820361160e57565b600080fd5b602435906001600160a01b038216820361160e57565b608090600319011261160e57600435906024359060443590606435801515810361160e5790565b604090600319011261160e576004359060243590565b90601f8019910116810190811067ffffffffffffffff82111761168857604052565b634e487b7160e01b600052604160045260246000fd5b818102929181159184041417156116b157565b634e487b7160e01b600052601160045260246000fd5b919082018092116116b157565b81156116de570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116116b157565b9081602091031261160e5751801515810361160e5790565b9081602091031261160e57516001600160a01b038116810361160e5790565b600854670de0b6b3a764000090818102908082048314901517156116b15761176661176f916002549061169e565b600754906116d4565b0490565b6117db6117a7916127109283917f00000000000000000000000000000000000000000000000000000000000000649061169e565b04916117d37f00000000000000000000000000000000000000000000000000000000000017708461169e565b0480926116f4565b91565b9160018060a01b03809316916000938385526001602052604093848620918316918287526020528486205492600019840361181d575b50505050505050565b8484106118815750801561186957811561185157855260016020528385209085526020520391205538808080808080611814565b8451634a1406b160e11b815260048101879052602490fd5b845163e602df0560e01b815260048101879052602490fd5b8551637dc7a0d960e11b81526001600160a01b039190911660048201526024810184905260448101859052606490fd5b916001600160a01b03808416928315611976571692831561195d576000908382528160205260408220549083821061192b575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b611997611738565b7f0000000000000000000000000000000000000000000001969368974c05b00000106119bf57565b600160ff196009541617600955565b6119d6611738565b7f0000000000000000000000000000000000000000000010f0cf064dd592000000106119fe57565b6040516353dfa97560e01b8152600490fd5b60008080809481945af1903d15611a80573d9067ffffffffffffffff8211611a6c5760405191611a4a601f8201601f191660200184611666565b825260203d92013e5b15611a5a57565b6040516338822c1360e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b50611a53565b906001600160a01b0382169081156119765760009282845283602052604084205490828210611af35750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fdfea26469706673582212205c7701526c567d41e360a9217898a429269a3823cc13033e1a59a5f3ac2e251364736f6c63430008170033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000036ccfbb244887eea40000000000000000000000000000000000000000000000000001043561a882930000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000001043561a88293000000000000000000000000000000000000000000000000000056bc75e2d631000000000000000000000000000000000000000000000000001969368974c05b000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000c380f8e0bc1c7ed0d305ab00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389000000000000000000000000cc6169aa1e879d3a4227536671f85afdb2d23fad000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d805903200000000000000000000000000000000000000000000000000000000000000084d6f6f6e73686f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d53484f54000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _params (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
21 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [3] : 00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389
Arg [4] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [5] : 0000000000000000000000000000000000000000036ccfbb244887eea4000000
Arg [6] : 0000000000000000000000000000000000000000000001043561a88293000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [8] : 0000000000000000000000000000000000000000000000000000000000001770
Arg [9] : 00000000000000000000000000000000000000000000001043561a8829300000
Arg [10] : 0000000000000000000000000000000000000000000000056bc75e2d63100000
Arg [11] : 0000000000000000000000000000000000000000000001969368974c05b00000
Arg [12] : 0000000000000000000000000000000000000000000010f0cf064dd592000000
Arg [13] : 000000000000000000000000000000000000000000c380f8e0bc1c7ed0d305ab
Arg [14] : 00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389
Arg [15] : 000000000000000000000000cc6169aa1e879d3a4227536671f85afdb2d23fad
Arg [16] : 000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [18] : 4d6f6f6e73686f74000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [20] : 4d53484f54000000000000000000000000000000000000000000000000000000


[ 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.