Source Code
Overview
S Balance
0 S
Token Holdings
More Info
ContractCreator
TokenTracker
Loading...
Loading
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
Contract Source Code (Solidity Standard Json-Input format)
// 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 {IRouter02} from "./interfaces/IRouter02.sol"; import {IBaseV1Factory} from "./interfaces/IBaseV1Factory.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; IRouter02 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 = IRouter02(_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; if (IBaseV1Factory(solidlyRouter.factory()).getPair(address(this), solidlyRouter.weth(), false) == address(0)) { IBaseV1Factory(solidlyRouter.factory()).createPair(address(this), solidlyRouter.weth(), false); } pair = IBaseV1Factory(solidlyRouter.factory()).getPair(address(this), solidlyRouter.weth(), false); if (pair == address(0)) revert PairNotCreated(); uint256 tokensRemaining = balanceOf(address(this)); this.approve(address(solidlyRouter), tokensRemaining); tokensToMigrate = _tokensToMigrate(); tokensToBurn = tokensRemaining - tokensToMigrate; (uint256 treasuryFee, uint256 dexFee) = _splitFee(fixedMigrationFee); _transferCollateral(treasury, treasuryFee + poolCreationFee); _transferCollateral(dexTreasury, dexFee); _burn(address(this), tokensToBurn); collateralAmount = virtualCollateralReserves - virtualCollateralReservesInitial - treasuryFee - dexFee - poolCreationFee; (, , uint256 liquidity) = solidlyRouter.addLiquidityETH{value: collateralAmount}( address(this), false, tokensToMigrate, tokensToMigrate, collateralAmount, address(this), block.timestamp + 10 ); 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 transfer(address _to, uint256 _value) public override(ERC20, IERC20) returns (bool) { if (sendingToPairNotAllowed) { if (IBaseV1Factory(solidlyRouter.factory()).isPair(_to)) revert SendingToPairIsNotAllowedBeforeMigration(); } return super.transfer(_to, _value); } function transferFrom(address from, address to, uint256 amount) public override(ERC20, IERC20) returns (bool) { if (sendingToPairNotAllowed) { if (IBaseV1Factory(solidlyRouter.factory()).isPair(to)) revert SendingToPairIsNotAllowedBeforeMigration(); } return super.transferFrom(from, to, amount); } 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; } } }
// 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); }
// 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); } } } }
// 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); } }
// 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); }
// 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); }
// 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; } }
// 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; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.23; interface IBaseV1Factory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IRouter02 { struct Route { address from; address to; bool stable; } function factory() external view returns (address); function weth() 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; }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
[{"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 IRouter02","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":"amount","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"}]
Contract Creation Code
610220604052346200072b5762002724803803806200001e8162000730565b92833981016020828203126200072b5781516001600160401b0381116200072b576102008184018303126200072b576040519161020083016001600160401b038111848210176200060a57604052838201516001600160401b0381116200072b57816200008f918487010162000756565b835283820160200151916001600160401b0383116200072b57620000bf6101e0926200017b948388010162000756565b94856020860152620000d6604083830101620007c8565b6040860152808201606081810151908701526080808201519087015260a0808201519087015260c0808201519087015260e080820151908701526101008082015190870152610120808201519087015261014080820151908701526101608082015190870152610180808201519087015262000156906101a001620007c8565b6101a08601526200016d6101c083830101620007c8565b6101c08601520101620007c8565b6101e0820152805180519092906001600160401b0381116200060a57600354600181811c9116801562000720575b6020821014620005e957601f8111620006b6575b506020601f82116001146200062c578192939460009262000620575b50508160011b916000199060031b1c1916176003555b8051906001600160401b0382116200060a5760045490600182811c92168015620005ff575b6020831014620005e95781601f84931162000577575b50602090601f8311600114620004e857600092620004dc575b50508160011b916000199060031b1c1916176004555b600160055561010061ff0019600954161760095560608101513015620004c3576002548181018111620004ad578101600255306000526000602052604060002081815401905560405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a3606081015160065560a08101518060085560805260808101516007556101c060018060a01b0391826040820151166101805260c081015160a05260e081015160c052826101a0820151166101a052826101e0820151168252610100810151610140526101208101516101605261014081015160e052610160810151610100526101808101516101205201511661020052336101e052604051611f469081620007de82396080518181816105590152610adc015260a05181818161170c0152611b6d015260c051818181610a4001528181610eee0152611b99015260e0518181816110a10152611bd30152610100518181816112c80152611c120152610120518181816101f3015261168d01526101405181818161049f01526109b501526101605181818161051e01526109f30152610180518161196b01526101a0518181816102e601528181610a6f01528181610f79015281816110d9015281816111cb015261144101526101c05181818161031001528181610aa601528181610e7101528181610fa3015281816111f5015261146b01526101e051818181610266015281816104d70152818161080701528181610f200152818161116001526113ab0152610200518181816105da015281816108480152818161111d01526115870152f35b634e487b7160e01b600052601160045260246000fd5b60405163ec442f0560e01b815260006004820152602490fd5b01519050388062000243565b6004600090815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91905b601f19841685106200055b576001945083601f1981161062000541575b505050811b0160045562000259565b015160001960f88460031b161c1916905538808062000532565b8181015183556020948501946001909301929091019062000515565b60046000529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810160208510620005e1575b90849392915b601f830160051c82018110620005d15750506200022a565b60008155859450600101620005b9565b5080620005b3565b634e487b7160e01b600052602260045260246000fd5b91607f169162000214565b634e487b7160e01b600052604160045260246000fd5b015190503880620001d9565b600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190601f198416905b8181106200069d5750958360019596971062000683575b505050811b01600355620001ef565b015160001960f88460031b161c1916905538808062000674565b9192602060018192868b0151815501940192016200065d565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c8101916020841062000715575b601f0160051c01905b818110620007085750620001bd565b60008155600101620006f9565b9091508190620006f0565b90607f1690620001a9565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200060a57604052565b919080601f840112156200072b5782516001600160401b0381116200060a576020906200078c601f8201601f1916830162000730565b928184528282870101116200072b5760005b818110620007b457508260009394955001015290565b85810183015184820184015282016200079e565b51906001600160a01b03821682036200072b5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826302d05d3f146119575750816306fdde0314611860578163095ea7b3146117b6578163152044811461176d5781631655bc621461174e57816318160ddd1461172f5781631a1c6e53146116f45781632368da321461164457816323b872dd1461151a57816325e17b5714611399578163313ce5671461137d57816342966c681461135f57816349a30246146112eb5781634c7766b5146112b05781634fb3fbe71461114c57816361b381551461110857816361d027b3146110c45781636d04eb9f1461108957816370a08231146110525781637187631814610f1157816371ea0d8e14610ed657816379cc679014610ea057816385f377ca14610e5c5781638fd3ab80146107ea57816390825c28146107c657816395d89b41146106c5578163a9059cbb1461057c578163b026a12114610541578163be74615f14610506578163c45a0155146104c2578163c48afe1614610487578163c6d8b77814610460578163c78d0b0e14610441578163d3728de414610426578163dd62ed3e146103dd578163e8e70c4c146103be578163e98d5cd51461025957508063fd62bcd714610236578063fd967f471461021a5763fe94c269146101dd57600080fd5b34610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b5034610216578160031936011261021657602090516127108152f35b503461021657816003193601126102165760209060ff6009541690519015158152f35b8261026336611a3b565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036103af5760ff600954166103a0576102bf6102ad60085484611a89565b6102b984600754611ab2565b90611abf565b916102c983611b5e565b9390956102df856102da8985611adf565b611adf565b9561030a887f0000000000000000000000000000000000000000000000000000000000000000611c4a565b610334867f0000000000000000000000000000000000000000000000000000000000000000611c4a565b861061039257508161035f6103739261035461038e979695600754611ab2565b600755600854611adf565b60085561036c8633611c4a565b3033611cc0565b51938493846040919493926060820195825260208201520152565b0390f35b8351630a1c173f60e41b8152fd5b5163058aab2d60e21b81528390fd5b51630636a15760e11b81528390fd5b5050346102165781600319360112610216576020906008549051908152f35b505034610216578060031936011261021657806020926103fb6119e3565b6104036119fe565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50503461021657816003193601126102165751908152602090f35b5050346102165781600319360112610216576020906006549051908152f35b50503461021657816003193601126102165760209060ff60095460081c1690519015158152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b9050346106c157816003193601126106c1576105966119e3565b9260ff60095460081c166105bc575b6020836105b56024358733611cc0565b5160018152f35b825163c45a015560e01b81526001600160a01b0390602090818186817f000000000000000000000000000000000000000000000000000000000000000087165afa9081156106b757908291859161068a575b50602487518095819363e5e31b1360e01b8352818c168a840152165afa92831561067f5792610652575b505061064457806105a5565b9051633b95747f60e21b8152fd5b6106719250803d10610678575b6106698183611a51565b810190611b0b565b3880610638565b503d61065f565b8551903d90823e3d90fd5b6106aa9150823d84116106b0575b6106a28183611a51565b810190611aec565b3861060e565b503d610698565b86513d86823e3d90fd5b8280fd5b83833461021657816003193601126102165780519180938054916001908360011c92600185169485156107bc575b60209586861081146107a957858952908115610785575060011461072d575b61038e8787610723828c0383611a51565b519182918261199a565b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410610772575050508261038e9461072392820101948680610712565b8054868501880152928601928101610754565b60ff19168887015250505050151560051b83010192506107238261038e8680610712565b634e487b7160e01b845260228352602484fd5b93607f16936106f3565b5050346102165781600319360112610216576020906107e3611b23565b9051908152f35b9050346106c157826003193601126106c1576001600160a01b03917f000000000000000000000000000000000000000000000000000000000000000083163303610e4f576009805461ff0019169055805163c45a015560e01b8082527f00000000000000000000000000000000000000000000000000000000000000008516948694939260209190828187818b5afa908115610e45578791610e28575b508451633fc8cef360e01b8082529094848689818d5afa958615610e1e5790899392918497610dff575b5087518681876306801cc360e41b968783528d30908401528160249c168c84015260449e8f84015216815a91606492fa908115610d8b57918688928e95948891610de2575b501615610ce5575b8a8a518095819382525afa918215610cbc578b93929187918693610cc6575b508a8a518096819382525afa928315610cbc5791858a9288948796610c98575b50606493949596828c51988997889687523090870152168b8501528d840152165afa908115610c8e578991610c71575b5016938415610c6357308852878252838820549584519763095ea7b360e01b895280838a015287858a0152838983818d305af1988915610c5957610aa0979899610c3c575b507f000000000000000000000000000000000000000000000000000000000000000094610b016109e28747611adf565b6102da610a31610a2a610a21610a197f00000000000000000000000000000000000000000000000000000000000000008096611adf565b600754611a89565b60085490611abf565b809e611adf565b986102da610a6d612710610a657f000000000000000000000000000000000000000000000000000000000000000085611a89565b048093611adf565b7f00000000000000000000000000000000000000000000000000000000000000009d8e610a9a8784611ab2565b90611c4a565b610aca837f0000000000000000000000000000000000000000000000000000000000000000611c4a565b610ad48c30611d9e565b6102da6008547f000000000000000000000000000000000000000000000000000000000000000090611adf565b97600a4201804211610c2a579060608d969594939260e48e8d8d5197889485936302df835360e61b8552308d8601528d8a860152808c86015260648501528260848501523060a485015260c48401525af1928315610c2057908795949392918793610be3575b5047610bd2575b50885195869463a9059cbb60e01b8652850152830152818b8a5af18015610bc85760809850610bab575b5082519586528501528301526060820152f35b610bc190823d8411610678576106698183611a51565b5038610b98565b84513d8a823e3d90fd5b610bdd904790611c4a565b38610b6e565b955091506060853d606011610c18575b81610c0060609383611a51565b81010312610c145788879501519138610b67565b8580fd5b3d9150610bf3565b89513d88823e3d90fd5b634e487b7160e01b8d5260118652828dfd5b610c5290853d8711610678576106698183611a51565b50386109b2565b86513d8c823e3d90fd5b835163c6bcf59960e01b8152fd5b610c889150833d85116106b0576106a28183611a51565b3861096d565b85513d8b823e3d90fd5b859650610cb490606495963d89116106b0576106a28183611a51565b95949361093d565b88513d86823e3d90fd5b610cde919350823d84116106b0576106a28183611a51565b913861091d565b9192908a918a51928380928682525afa908115610d8b57908a918691610dc5575b50878d8b51938480928882525afa918215610dbb5787928c888f8c958f95918f89938597610d95575b5090849160649798519a8b998a986320b7f73960e21b8a5230908a01521690870152850152165af18015610d8b579187918d9493610d6e575b506108fe565b610d8490833d85116106b0576106a28183611a51565b5038610d68565b89513d87823e3d90fd5b6064975090610db28693928b3d8d116106b0576106a28183611a51565b97509091610d2f565b8a513d88823e3d90fd5b610ddc9150883d8a116106b0576106a28183611a51565b38610d06565b610df99150843d86116106b0576106a28183611a51565b386108f6565b610e17919750863d88116106b0576106a28183611a51565b95386108b1565b87513d8b823e3d90fd5b610e3f9150833d85116106b0576106a28183611a51565b38610887565b85513d89823e3d90fd5b51630636a15760e11b8152fd5b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50503461021657366003190112610ed357610ed0610ebc6119e3565b60243590610ecb823383611e3d565b611d9e565b80f35b80fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b9050610f1c36611a3b565b92907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036110445760ff6009541661103657610f6184611b5e565b929091610f72846102da8589611adf565b94610f9d847f0000000000000000000000000000000000000000000000000000000000000000611c4a565b610fc7857f0000000000000000000000000000000000000000000000000000000000000000611c4a565b610fe2610fd660075489611a89565b6102b989600854611adf565b9182116110285750611007608096610ffb833033611cc0565b61035483600754611ab2565b6008556110148533611c4a565b815194855260208501528301526060820152f35b8251630a1c173f60e41b8152fd5b505163058aab2d60e21b8152fd5b5051630636a15760e11b8152fd5b5050346102165760203660031901126102165760209181906001600160a01b0361107a6119e3565b16815280845220549051908152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610216578160031936011261021657517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b91905060203660031901126106c1578135927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036110445760ff600954166110365781849130815280602052205411156112a3576111b334611b5e565b9390926111c4856102da8634611adf565b906111ef857f0000000000000000000000000000000000000000000000000000000000000000611c4a565b611219867f0000000000000000000000000000000000000000000000000000000000000000611c4a565b6007546112268184611a89565b91611238600854936102b98686611ab2565b948510611295575061126992849261125761038e979661125f94611adf565b600755611ab2565b6008553330611cc0565b611271611bc9565b611279611c08565b5192839234846040919493926060820195825260208201520152565b8551630a1c173f60e41b8152fd5b5163904db1ff60e01b8152fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b828434610ed3576112fb36611a14565b91935091901561133d57906102b98261132961132261131c61132f96611b5e565b90611ab2565b9582611a89565b92611adf565b905b82519182526020820152f35b8061132961134e946102b993611a89565b61135a61131c82611b5e565b611331565b83903461021657602036600319011261021657610ed0903533611d9e565b5050346102165781600319360112610216576020905160128152f35b90506113a436611a3b565b90939092907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036110445760ff600954166110365781859130815280602052205411156112a35761141061140460085486611a89565b6102b986600754611adf565b9361141a85611b5e565b9390956114308561142b8984611ab2565b611ab2565b95861161150b576114a690611465887f0000000000000000000000000000000000000000000000000000000000000000611c4a565b61148f867f0000000000000000000000000000000000000000000000000000000000000000611c4a565b61149b84600754611adf565b600755600854611ab2565b6008558434116000146114e75750906114d761038e93926114d06114ca8734611adf565b33611c4a565b3330611cc0565b6114df611bc9565b610373611c08565b8434106114fd5750906114d761038e93926114d0565b82516367c45b4f60e11b8152fd5b508251630a1c173f60e41b8152fd5b9050346106c15760603660031901126106c1576115356119e3565b61153d6119fe565b916044359460ff60095460081c16611569575b6020856105b5888787611564833383611e3d565b611cc0565b845163c45a015560e01b81526001600160a01b0390602090818186817f000000000000000000000000000000000000000000000000000000000000000087165afa908115610cbc579082918591611627575b50602489518095819363e5e31b1360e01b8352818c168a840152165afa92831561161c57926115ff575b50506115f15780611550565b8351633b95747f60e21b8152fd5b6116159250803d10610678576106698183611a51565b38806115e5565b8751903d90823e3d90fd5b61163e9150823d84116106b0576106a28183611a51565b386115bb565b828434610ed35780600319360112610ed35761166d600654308352826020528383205490611adf565b9061271091828102908082048414901517156116e157602094506116b2907f000000000000000000000000000000000000000000000000000000000000000090611abf565b9060648210156116c9575050506064905b51908152f35b50818111156116da57505b906116c3565b90506116d4565b634e487b7160e01b825260118552602482fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102165781600319360112610216576020906002549051908152f35b5050346102165781600319360112610216576020906007549051908152f35b828434610ed35761177d36611a14565b909350909190156117a557906102b98261179f61132261131c61132f96611b5e565b92611ab2565b8061179f61134e946102b993611a89565b9050346106c157816003193601126106c1576117d06119e3565b602435903315611849576001600160a01b031691821561183257508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b919050346106c157826003193601126106c15780519183600354906001908260011c9260018116801561194d575b602095868610821461193a575084885290811561191857506001146118bf575b61038e8686610723828b0383611a51565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410611905575050508261038e946107239282010194386118ae565b80548685018801529286019281016118e8565b60ff191687860152505050151560051b83010192506107238261038e386118ae565b634e487b7160e01b845260229052602483fd5b93607f169361188e565b8490346102165781600319360112610216577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6020808252825181830181905290939260005b8281106119cf57505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016119ad565b600435906001600160a01b03821682036119f957565b600080fd5b602435906001600160a01b03821682036119f957565b60809060031901126119f95760043590602435906044359060643580151581036119f95790565b60409060031901126119f9576004359060243590565b90601f8019910116810190811067ffffffffffffffff821117611a7357604052565b634e487b7160e01b600052604160045260246000fd5b81810292918115918404141715611a9c57565b634e487b7160e01b600052601160045260246000fd5b91908201809211611a9c57565b8115611ac9570490565b634e487b7160e01b600052601260045260246000fd5b91908203918211611a9c57565b908160209103126119f957516001600160a01b03811681036119f95790565b908160209103126119f9575180151581036119f95790565b600854670de0b6b3a76400009081810290808204831490151715611a9c57611b51611b5a9160025490611a89565b60075490611abf565b0490565b611bc6611b92916127109283917f000000000000000000000000000000000000000000000000000000000000000090611a89565b0491611bbe7f000000000000000000000000000000000000000000000000000000000000000084611a89565b048092611adf565b91565b611bd1611b23565b7f000000000000000000000000000000000000000000000000000000000000000010611bf957565b600160ff196009541617600955565b611c10611b23565b7f000000000000000000000000000000000000000000000000000000000000000010611c3857565b6040516353dfa97560e01b8152600490fd5b60008080809481945af1903d15611cba573d9067ffffffffffffffff8211611ca65760405191611c84601f8201601f191660200184611a51565b825260203d92013e5b15611c9457565b6040516338822c1360e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b50611c8d565b916001600160a01b03808416928315611d855716928315611d6c5760009083825281602052604082205490838210611d3a575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b906001600160a01b038216908115611d855760009282845283602052604084205490828210611e0b5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b9160018060a01b038093169160009383855260016020526040938486209183169182875260205284862054926000198403611e7c575b50505050505050565b848410611ee057508015611ec8578115611eb057855260016020528385209085526020520391205538808080808080611e73565b8451634a1406b160e11b815260048101879052602490fd5b845163e602df0560e01b815260048101879052602490fd5b8551637dc7a0d960e11b81526001600160a01b039190911660048201526024810184905260448101859052606490fdfea26469706673582212209a74b311730e917319e2b340893566f12d3b33c7a9275b849905bcf523c03fb364736f6c6343000817003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000036ccfbb244887eea40000000000000000000000000000000000000000000000000001043561a882930000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000001043561a88293000000000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000fe1c215e8f838e000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000c380f8e0bc1c7ed49f840000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e1590000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d805903200000000000000000000000000000000000000000000000000000000000000084d6f6f6e73686f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d53484f54000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060408181526004918236101561001657600080fd5b600092833560e01c91826302d05d3f146119575750816306fdde0314611860578163095ea7b3146117b6578163152044811461176d5781631655bc621461174e57816318160ddd1461172f5781631a1c6e53146116f45781632368da321461164457816323b872dd1461151a57816325e17b5714611399578163313ce5671461137d57816342966c681461135f57816349a30246146112eb5781634c7766b5146112b05781634fb3fbe71461114c57816361b381551461110857816361d027b3146110c45781636d04eb9f1461108957816370a08231146110525781637187631814610f1157816371ea0d8e14610ed657816379cc679014610ea057816385f377ca14610e5c5781638fd3ab80146107ea57816390825c28146107c657816395d89b41146106c5578163a9059cbb1461057c578163b026a12114610541578163be74615f14610506578163c45a0155146104c2578163c48afe1614610487578163c6d8b77814610460578163c78d0b0e14610441578163d3728de414610426578163dd62ed3e146103dd578163e8e70c4c146103be578163e98d5cd51461025957508063fd62bcd714610236578063fd967f471461021a5763fe94c269146101dd57600080fd5b34610216578160031936011261021657602090517f000000000000000000000000000000000000000000c380f8e0bc1c7ed49f84008152f35b5080fd5b5034610216578160031936011261021657602090516127108152f35b503461021657816003193601126102165760209060ff6009541690519015158152f35b8261026336611a3b565b917f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b031633036103af5760ff600954166103a0576102bf6102ad60085484611a89565b6102b984600754611ab2565b90611abf565b916102c983611b5e565b9390956102df856102da8985611adf565b611adf565b9561030a887f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611c4a565b610334867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611c4a565b861061039257508161035f6103739261035461038e979695600754611ab2565b600755600854611adf565b60085561036c8633611c4a565b3033611cc0565b51938493846040919493926060820195825260208201520152565b0390f35b8351630a1c173f60e41b8152fd5b5163058aab2d60e21b81528390fd5b51630636a15760e11b81528390fd5b5050346102165781600319360112610216576020906008549051908152f35b505034610216578060031936011261021657806020926103fb6119e3565b6104036119fe565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50503461021657816003193601126102165751908152602090f35b5050346102165781600319360112610216576020906006549051908152f35b50503461021657816003193601126102165760209060ff60095460081c1690519015158152f35b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000001043561a88293000008152f35b505034610216578160031936011261021657517f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000000056bc75e2d631000008152f35b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000001043561a882930000008152f35b9050346106c157816003193601126106c1576105966119e3565b9260ff60095460081c166105bc575b6020836105b56024358733611cc0565b5160018152f35b825163c45a015560e01b81526001600160a01b0390602090818186817f0000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e159087165afa9081156106b757908291859161068a575b50602487518095819363e5e31b1360e01b8352818c168a840152165afa92831561067f5792610652575b505061064457806105a5565b9051633b95747f60e21b8152fd5b6106719250803d10610678575b6106698183611a51565b810190611b0b565b3880610638565b503d61065f565b8551903d90823e3d90fd5b6106aa9150823d84116106b0575b6106a28183611a51565b810190611aec565b3861060e565b503d610698565b86513d86823e3d90fd5b8280fd5b83833461021657816003193601126102165780519180938054916001908360011c92600185169485156107bc575b60209586861081146107a957858952908115610785575060011461072d575b61038e8787610723828c0383611a51565b519182918261199a565b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b828410610772575050508261038e9461072392820101948680610712565b8054868501880152928601928101610754565b60ff19168887015250505050151560051b83010192506107238261038e8680610712565b634e487b7160e01b845260228352602484fd5b93607f16936106f3565b5050346102165781600319360112610216576020906107e3611b23565b9051908152f35b9050346106c157826003193601126106c1576001600160a01b03917f00000000000000000000000056c4f0504f577a283073ab780b6850fec412138983163303610e4f576009805461ff0019169055805163c45a015560e01b8082527f0000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e15908516948694939260209190828187818b5afa908115610e45578791610e28575b508451633fc8cef360e01b8082529094848689818d5afa958615610e1e5790899392918497610dff575b5087518681876306801cc360e41b968783528d30908401528160249c168c84015260449e8f84015216815a91606492fa908115610d8b57918688928e95948891610de2575b501615610ce5575b8a8a518095819382525afa918215610cbc578b93929187918693610cc6575b508a8a518096819382525afa928315610cbc5791858a9288948796610c98575b50606493949596828c51988997889687523090870152168b8501528d840152165afa908115610c8e578991610c71575b5016938415610c6357308852878252838820549584519763095ea7b360e01b895280838a015287858a0152838983818d305af1988915610c5957610aa0979899610c3c575b507f00000000000000000000000000000000000000000000001043561a882930000094610b016109e28747611adf565b6102da610a31610a2a610a21610a197f0000000000000000000000000000000000000000000000056bc75e2d631000008096611adf565b600754611a89565b60085490611abf565b809e611adf565b986102da610a6d612710610a657f000000000000000000000000000000000000000000000000000000000000177085611a89565b048093611adf565b7f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213899d8e610a9a8784611ab2565b90611c4a565b610aca837f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611c4a565b610ad48c30611d9e565b6102da6008547f0000000000000000000000000000000000000000000001043561a8829300000090611adf565b97600a4201804211610c2a579060608d969594939260e48e8d8d5197889485936302df835360e61b8552308d8601528d8a860152808c86015260648501528260848501523060a485015260c48401525af1928315610c2057908795949392918793610be3575b5047610bd2575b50885195869463a9059cbb60e01b8652850152830152818b8a5af18015610bc85760809850610bab575b5082519586528501528301526060820152f35b610bc190823d8411610678576106698183611a51565b5038610b98565b84513d8a823e3d90fd5b610bdd904790611c4a565b38610b6e565b955091506060853d606011610c18575b81610c0060609383611a51565b81010312610c145788879501519138610b67565b8580fd5b3d9150610bf3565b89513d88823e3d90fd5b634e487b7160e01b8d5260118652828dfd5b610c5290853d8711610678576106698183611a51565b50386109b2565b86513d8c823e3d90fd5b835163c6bcf59960e01b8152fd5b610c889150833d85116106b0576106a28183611a51565b3861096d565b85513d8b823e3d90fd5b859650610cb490606495963d89116106b0576106a28183611a51565b95949361093d565b88513d86823e3d90fd5b610cde919350823d84116106b0576106a28183611a51565b913861091d565b9192908a918a51928380928682525afa908115610d8b57908a918691610dc5575b50878d8b51938480928882525afa918215610dbb5787928c888f8c958f95918f89938597610d95575b5090849160649798519a8b998a986320b7f73960e21b8a5230908a01521690870152850152165af18015610d8b579187918d9493610d6e575b506108fe565b610d8490833d85116106b0576106a28183611a51565b5038610d68565b89513d87823e3d90fd5b6064975090610db28693928b3d8d116106b0576106a28183611a51565b97509091610d2f565b8a513d88823e3d90fd5b610ddc9150883d8a116106b0576106a28183611a51565b38610d06565b610df99150843d86116106b0576106a28183611a51565b386108f6565b610e17919750863d88116106b0576106a28183611a51565b95386108b1565b87513d8b823e3d90fd5b610e3f9150833d85116106b0576106a28183611a51565b38610887565b85513d89823e3d90fd5b51630636a15760e11b8152fd5b505034610216578160031936011261021657517f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d80590326001600160a01b03168152602090f35b50503461021657366003190112610ed357610ed0610ebc6119e3565b60243590610ecb823383611e3d565b611d9e565b80f35b80fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000017708152f35b9050610f1c36611a3b565b92907f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b031633036110445760ff6009541661103657610f6184611b5e565b929091610f72846102da8589611adf565b94610f9d847f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611c4a565b610fc7857f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611c4a565b610fe2610fd660075489611a89565b6102b989600854611adf565b9182116110285750611007608096610ffb833033611cc0565b61035483600754611ab2565b6008556110148533611c4a565b815194855260208501528301526060820152f35b8251630a1c173f60e41b8152fd5b505163058aab2d60e21b8152fd5b5051630636a15760e11b8152fd5b5050346102165760203660031901126102165760209181906001600160a01b0361107a6119e3565b16815280845220549051908152f35b505034610216578160031936011261021657602090517f000000000000000000000000000000000000000000000fe1c215e8f838e000008152f35b505034610216578160031936011261021657517f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b505034610216578160031936011261021657517f0000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e15906001600160a01b03168152602090f35b91905060203660031901126106c1578135927f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b031633036110445760ff600954166110365781849130815280602052205411156112a3576111b334611b5e565b9390926111c4856102da8634611adf565b906111ef857f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611c4a565b611219867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611c4a565b6007546112268184611a89565b91611238600854936102b98686611ab2565b948510611295575061126992849261125761038e979661125f94611adf565b600755611ab2565b6008553330611cc0565b611271611bc9565b611279611c08565b5192839234846040919493926060820195825260208201520152565b8551630a1c173f60e41b8152fd5b5163904db1ff60e01b8152fd5b505034610216578160031936011261021657602090517f0000000000000000000000000000000000000000000010f0cf064dd5920000008152f35b828434610ed3576112fb36611a14565b91935091901561133d57906102b98261132961132261131c61132f96611b5e565b90611ab2565b9582611a89565b92611adf565b905b82519182526020820152f35b8061132961134e946102b993611a89565b61135a61131c82611b5e565b611331565b83903461021657602036600319011261021657610ed0903533611d9e565b5050346102165781600319360112610216576020905160128152f35b90506113a436611a3b565b90939092907f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b031633036110445760ff600954166110365781859130815280602052205411156112a35761141061140460085486611a89565b6102b986600754611adf565b9361141a85611b5e565b9390956114308561142b8984611ab2565b611ab2565b95861161150b576114a690611465887f00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389611c4a565b61148f867f000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032611c4a565b61149b84600754611adf565b600755600854611ab2565b6008558434116000146114e75750906114d761038e93926114d06114ca8734611adf565b33611c4a565b3330611cc0565b6114df611bc9565b610373611c08565b8434106114fd5750906114d761038e93926114d0565b82516367c45b4f60e11b8152fd5b508251630a1c173f60e41b8152fd5b9050346106c15760603660031901126106c1576115356119e3565b61153d6119fe565b916044359460ff60095460081c16611569575b6020856105b5888787611564833383611e3d565b611cc0565b845163c45a015560e01b81526001600160a01b0390602090818186817f0000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e159087165afa908115610cbc579082918591611627575b50602489518095819363e5e31b1360e01b8352818c168a840152165afa92831561161c57926115ff575b50506115f15780611550565b8351633b95747f60e21b8152fd5b6116159250803d10610678576106698183611a51565b38806115e5565b8751903d90823e3d90fd5b61163e9150823d84116106b0576106a28183611a51565b386115bb565b828434610ed35780600319360112610ed35761166d600654308352826020528383205490611adf565b9061271091828102908082048414901517156116e157602094506116b2907f000000000000000000000000000000000000000000c380f8e0bc1c7ed49f840090611abf565b9060648210156116c9575050506064905b51908152f35b50818111156116da57505b906116c3565b90506116d4565b634e487b7160e01b825260118552602482fd5b505034610216578160031936011261021657602090517f00000000000000000000000000000000000000000000000000000000000000648152f35b5050346102165781600319360112610216576020906002549051908152f35b5050346102165781600319360112610216576020906007549051908152f35b828434610ed35761177d36611a14565b909350909190156117a557906102b98261179f61132261131c61132f96611b5e565b92611ab2565b8061179f61134e946102b993611a89565b9050346106c157816003193601126106c1576117d06119e3565b602435903315611849576001600160a01b031691821561183257508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b919050346106c157826003193601126106c15780519183600354906001908260011c9260018116801561194d575b602095868610821461193a575084885290811561191857506001146118bf575b61038e8686610723828b0383611a51565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b828410611905575050508261038e946107239282010194386118ae565b80548685018801529286019281016118e8565b60ff191687860152505050151560051b83010192506107238261038e386118ae565b634e487b7160e01b845260229052602483fd5b93607f169361188e565b8490346102165781600319360112610216577f00000000000000000000000056c4f0504f577a283073ab780b6850fec41213896001600160a01b03168152602090f35b6020808252825181830181905290939260005b8281106119cf57505060409293506000838284010152601f8019910116010190565b8181018601518482016040015285016119ad565b600435906001600160a01b03821682036119f957565b600080fd5b602435906001600160a01b03821682036119f957565b60809060031901126119f95760043590602435906044359060643580151581036119f95790565b60409060031901126119f9576004359060243590565b90601f8019910116810190811067ffffffffffffffff821117611a7357604052565b634e487b7160e01b600052604160045260246000fd5b81810292918115918404141715611a9c57565b634e487b7160e01b600052601160045260246000fd5b91908201809211611a9c57565b8115611ac9570490565b634e487b7160e01b600052601260045260246000fd5b91908203918211611a9c57565b908160209103126119f957516001600160a01b03811681036119f95790565b908160209103126119f9575180151581036119f95790565b600854670de0b6b3a76400009081810290808204831490151715611a9c57611b51611b5a9160025490611a89565b60075490611abf565b0490565b611bc6611b92916127109283917f000000000000000000000000000000000000000000000000000000000000006490611a89565b0491611bbe7f000000000000000000000000000000000000000000000000000000000000177084611a89565b048092611adf565b91565b611bd1611b23565b7f000000000000000000000000000000000000000000000fe1c215e8f838e0000010611bf957565b600160ff196009541617600955565b611c10611b23565b7f0000000000000000000000000000000000000000000010f0cf064dd59200000010611c3857565b6040516353dfa97560e01b8152600490fd5b60008080809481945af1903d15611cba573d9067ffffffffffffffff8211611ca65760405191611c84601f8201601f191660200184611a51565b825260203d92013e5b15611c9457565b6040516338822c1360e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b50611c8d565b916001600160a01b03808416928315611d855716928315611d6c5760009083825281602052604082205490838210611d3a575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b906001600160a01b038216908115611d855760009282845283602052604084205490828210611e0b5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fd5b9160018060a01b038093169160009383855260016020526040938486209183169182875260205284862054926000198403611e7c575b50505050505050565b848410611ee057508015611ec8578115611eb057855260016020528385209085526020520391205538808080808080611e73565b8451634a1406b160e11b815260048101879052602490fd5b845163e602df0560e01b815260048101879052602490fd5b8551637dc7a0d960e11b81526001600160a01b039190911660048201526024810184905260448101859052606490fdfea26469706673582212209a74b311730e917319e2b340893566f12d3b33c7a9275b849905bcf523c03fb364736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000024000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000036ccfbb244887eea40000000000000000000000000000000000000000000000000001043561a882930000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000001043561a88293000000000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000000000000000000000000fe1c215e8f838e000000000000000000000000000000000000000000000000010f0cf064dd592000000000000000000000000000000000000000000000000c380f8e0bc1c7ed49f840000000000000000000000000056c4f0504f577a283073ab780b6850fec41213890000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e1590000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d805903200000000000000000000000000000000000000000000000000000000000000084d6f6f6e73686f7400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054d53484f54000000000000000000000000000000000000000000000000000000
-----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] : 000000000000000000000000000000000000000000000fe1c215e8f838e00000
Arg [12] : 0000000000000000000000000000000000000000000010f0cf064dd592000000
Arg [13] : 000000000000000000000000000000000000000000c380f8e0bc1c7ed49f8400
Arg [14] : 00000000000000000000000056c4f0504f577a283073ab780b6850fec4121389
Arg [15] : 0000000000000000000000009f3a7410229510e45eced62db58ce4fb4a3e1590
Arg [16] : 000000000000000000000000377cee6040c7300c6b31ab0f17d3a6e5d8059032
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [18] : 4d6f6f6e73686f74000000000000000000000000000000000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [20] : 4d53484f54000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.