ETH Price: $1,945.30 (-3.95%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Approve396796662025-12-19 12:51:1954 days ago1766148679IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.00000010.00220873
Approve393195412025-12-11 4:47:0962 days ago1765428429IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000004710.10078301
Approve381837192025-11-14 21:46:2588 days ago1763156785IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000130.00278738
Approve360861152025-09-27 8:26:17137 days ago1758961577IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.00000010.00214201
Approve326007632025-07-08 16:07:53218 days ago1751990873IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000490.01035371
Approve319593702025-06-23 19:48:07232 days ago1750708087IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000320.01059198
Approve319362612025-06-23 6:57:49233 days ago1750661869IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000120.00263721
Approve314883772025-06-12 22:08:21243 days ago1749766101IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000540.01159098
Approve314192192025-06-11 7:43:05245 days ago1749627785IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000330.00703085
Approve313249592025-06-09 3:21:05247 days ago1749439265IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000140.00314334
Approve312318922025-06-06 23:38:51249 days ago1749253131IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000090.00181204
Approve311005982025-06-03 22:42:23252 days ago1748990543IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000110.00246294
Approve307695182025-05-27 6:46:23260 days ago1748328383IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000110.00240836
Approve306818092025-05-25 6:02:45262 days ago1748152965IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000540.0117271
Approve301700162025-05-13 9:42:59274 days ago1747129379IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000480.0101093
Approve300093932025-05-09 16:28:53277 days ago1746808133IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000160.00306047
Approve300047082025-05-09 13:52:43278 days ago1746798763IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000210.00380584
Approve298626572025-05-06 6:57:41281 days ago1746514661IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000460.01
Approve298625262025-05-06 6:53:19281 days ago1746514399IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000560.0121
Approve298608162025-05-06 5:56:19281 days ago1746510979IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000330.0072
Approve298607012025-05-06 5:52:29281 days ago1746510749IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000320.007
Approve294079662025-04-25 18:21:19291 days ago1745605279IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000001310.0032019
Approve293934382025-04-25 10:17:03292 days ago1745576223IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000006240.10316838
Transfer293934122025-04-25 10:16:11292 days ago1745576171IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000001740.0042777
Approve293692592025-04-24 20:51:05292 days ago1745527865IN
0x08b2d6c3...6B0E1bD1F
0 ETH0.000000110.00238437
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
292794992025-04-22 18:59:05294 days ago1745348345
0x08b2d6c3...6B0E1bD1F
0.55206608 ETH
292794692025-04-22 18:58:05294 days ago1745348285
0x08b2d6c3...6B0E1bD1F
0.00000049 ETH
292794692025-04-22 18:58:05294 days ago1745348285
0x08b2d6c3...6B0E1bD1F
0.0000015 ETH
292794692025-04-22 18:58:05294 days ago1745348285
0x08b2d6c3...6B0E1bD1F
0.0001 ETH
292192462025-04-21 9:30:39296 days ago1745227839
0x08b2d6c3...6B0E1bD1F
0.00000021 ETH
292192462025-04-21 9:30:39296 days ago1745227839
0x08b2d6c3...6B0E1bD1F
0.00000066 ETH
290733512025-04-18 0:27:29299 days ago1744936049
0x08b2d6c3...6B0E1bD1F
0.00000021 ETH
290733512025-04-18 0:27:29299 days ago1744936049
0x08b2d6c3...6B0E1bD1F
0.00000066 ETH
290732942025-04-18 0:25:35299 days ago1744935935
0x08b2d6c3...6B0E1bD1F
0.00000034 ETH
290732942025-04-18 0:25:35299 days ago1744935935
0x08b2d6c3...6B0E1bD1F
0.00000105 ETH
290732942025-04-18 0:25:35299 days ago1744935935
0x08b2d6c3...6B0E1bD1F
0.00007 ETH
290456462025-04-17 9:03:59300 days ago1744880639
0x08b2d6c3...6B0E1bD1F
0.00000021 ETH
290456462025-04-17 9:03:59300 days ago1744880639
0x08b2d6c3...6B0E1bD1F
0.00000066 ETH
290455512025-04-17 9:00:49300 days ago1744880449
0x08b2d6c3...6B0E1bD1F
0.00000021 ETH
290455512025-04-17 9:00:49300 days ago1744880449
0x08b2d6c3...6B0E1bD1F
0.00000066 ETH
290428152025-04-17 7:29:37300 days ago1744874977
0x08b2d6c3...6B0E1bD1F
0.00000021 ETH
290428152025-04-17 7:29:37300 days ago1744874977
0x08b2d6c3...6B0E1bD1F
0.00000066 ETH
290349152025-04-17 3:06:17300 days ago1744859177
0x08b2d6c3...6B0E1bD1F
0.00000014 ETH
290349152025-04-17 3:06:17300 days ago1744859177
0x08b2d6c3...6B0E1bD1F
0.00000044 ETH
290348972025-04-17 3:05:41300 days ago1744859141
0x08b2d6c3...6B0E1bD1F
0.0000099 ETH
290348972025-04-17 3:05:41300 days ago1744859141
0x08b2d6c3...6B0E1bD1F
0.00003 ETH
290348972025-04-17 3:05:41300 days ago1744859141
0x08b2d6c3...6B0E1bD1F
0.002 ETH
290180762025-04-16 17:44:59300 days ago1744825499
0x08b2d6c3...6B0E1bD1F
0.00000049 ETH
290180762025-04-16 17:44:59300 days ago1744825499
0x08b2d6c3...6B0E1bD1F
0.0000015 ETH
290180762025-04-16 17:44:59300 days ago1744825499
0x08b2d6c3...6B0E1bD1F
0.0001 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x3eeE5446...156628886
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
IdeaToken

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;

import {ERC20} from "./ERC20.sol";
import {IWETH} from "../interfaces/IWETH.sol";
import {IIdeaFactory} from "../interfaces/IIdeaFactory.sol";
import {IOnlyUpToken} from "../interfaces/IOnlyUpToken.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title IdeaToken - A Self-Contained Liquidity Token
 * @notice A token that acts as its own liquidity pool before evolving to Uniswap V3
 * @dev Implements:
 *      1. Internal liquidity pool before evolution
 *      2. Configurable buy/sell taxes (max 25%)
 *      3. Fee distribution between owner (40%) and treasury (60%)
 *      4. Manual evolution to Uniswap V3 initiated by graduator
 *      5. Tax burning mechanism to benefit holders
 * @author Robert M.C. Forster, Chiranjibi Poudyal
 */
contract IdeaToken is ERC20, IOnlyUpToken, Ownable {
    /* ================================ CONSTANTS ================================ */
    uint256 constant DIVISOR = 10_000;
    uint256 constant BUFFER = 1e18;
    uint256 constant INITIAL_ETH_PER_TOKEN = 1e13;
    int24 constant TICK_SPACING = 200;
    uint256 constant INITIAL_LIQUIDITY_MINT_RATIO = 4;

    /* ================================ STATE VARIABLES ================================ */
    IWETH private weth;
    IIdeaFactory public factory;

    bool public disabled;
    uint256 public genesis;
    address public token0;
    address public token1;
    bool private locked;

    uint256 private reserve1;
    uint256 private reserve0;
    uint256 private blockTimestampLast;

    /* ================================ CONSTRUCTOR ================================ */

    /// @notice Initializes the contract with a owner, token name, and symbol.
    /// @dev Sets up initial references, disables airdrop and accumulation periods by default.
    /// @param _owner The address designated as the owner of the contract.
    /// @param _name The name of the ERC20 token.
    /// @param _symbol The symbol of the ERC20 token.
    /// @param _weth The address of the WETH contract.
    constructor(address _owner, string memory _name, string memory _symbol, address _weth)
        ERC20(_name, _symbol)
        Ownable(_owner)
    {
        factory = IIdeaFactory(msg.sender);
        genesis = block.timestamp;
        weth = IWETH(_weth);
        token0 = address(this);
        token1 = _weth;
    }

    /* ================================ MODIFIERS ================================ */

    /// @dev Reverts if the contract is disabled (after a certain period).
    modifier notDisabled() {
        if (disabled) revert MintingDisabled();
        _;
    }

    /// @dev Prevents reentrant calls.
    modifier nonReentrant() {
        if (locked) revert NoReentrancy();
        locked = true;
        _;
        locked = false;
    }

    /// @dev Prevents calls from anything other than the factory
    modifier onlyFactory() {
        if (msg.sender != address(factory)) revert OnlyFactory();
        _;
    }

    /* =========================== EXTERNAL - MAIN FUNCTIONS =========================== */

    /// @notice Buys tokens by depositing Ether or WETH, converting them into token shares.
    /// @dev Applies buy fees and updates reserves after minting shares.
    ///      If no Ether is sent, it uses excess WETH reserve in the contract as input.
    /// @param _receiver The address receiving the newly minted tokens.
    function mint(address _receiver) public payable notDisabled nonReentrant {
        uint256 value = msg.value;
        if (value > 0) weth.deposit{value: value}();

        uint256 ethAmount = weth.balanceOf(address(this)) - reserve1;

        uint256 fee = ethAmount * factory.tradeFee() / DIVISOR;
        uint256 ethAmtAfterFee = ethAmount - fee;
        _sendFees(fee);
        uint256 shares = convertToShares(ethAmtAfterFee);
        _mint(_receiver, shares);
        _updateReserves();

        emit Swap(msg.sender, 0, ethAmtAfterFee, shares, 0, _receiver);
    }

    /// @notice Redeems tokens for Ether or WETH, reducing the caller’s token balance.
    /// @dev Applies sell fees and taxes, then withdraws Ether if called directly or
    ///      transfers WETH if called via a router. Only works when the token is not disabled.
    /// @param _receiver The address receiving the redeemed Ether or WETH.
    /// @param _tokenAmount The amount of tokens to redeem. If zero, uses the contract’s token balance.
    function redeem(address _receiver, uint256 _tokenAmount) public nonReentrant notDisabled {
        uint256 tokenAmount = _tokenAmount > 0 ? _tokenAmount : balanceOf(address(this));
        address burnFrom = _tokenAmount == 0 ? address(this) : msg.sender;

        if (_receiver == address(this)) revert InvalidReceiver();
        if (tokenAmount == 0) revert InvalidTokenAmount();

        uint256 preTaxEthAmount = convertToAssets(tokenAmount);
        uint256 tax = (tokenAmount * factory.mainFromTax()) / DIVISOR;
        _burn(burnFrom, tax);

        uint256 tokenAmountAfterTax = tokenAmount - tax;

        // fee is based on the pre-tax eth amount
        uint256 fee = preTaxEthAmount * factory.tradeFee() / DIVISOR;
        _sendFees(fee);

        // actual eth amout to redeem
        uint256 ethAmount = convertToAssets(tokenAmountAfterTax);
        ethAmount -= fee;
        _burn(burnFrom, tokenAmount - tax);

        // helps with attackers
        ethAmount += weth.balanceOf(address(this)) + fee - reserve1;

        if (_tokenAmount == 0) {
            weth.transfer(_receiver, ethAmount);
        } else {
            weth.withdraw(ethAmount);
            payable(_receiver).transfer(ethAmount);
        }

        _updateReserves();
        emit Swap(msg.sender, tokenAmountAfterTax, 0, 0, ethAmount, _receiver);
    }

    /* =========================== EXTERNAL - UNI V2 COMPATIBILITY =========================== */

    /// @notice Uni V2 style swap function.
    /// @dev If amount1Out > 0 and amount0Out == 0, acts as a buy (mint). If reversed, acts as a sell (redeem).
    /// @param amount0Out The token amount (OnlyUpToken) to send out.
    /// @param amount1Out The token amount (Ether-based) to send out.
    /// @param to The address receiving the output tokens.
    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata) external payable {
        if (amount1Out > 0 && amount0Out == 0) {
            mint(to);
        } else if (amount0Out > 0 && amount1Out == 0) {
            redeem(to, amount0Out);
        } else {
            revert InvalidSwapParameters();
        }
    }

    receive() external payable {}

    /* ================================ VIEW FUNCTIONS ================================ */

    /// @notice Converts a given token amount into its underlying Ether value.
    /// @param _tokenAmount The amount of tokens.
    /// @return ethAmount The corresponding amount of Ether-based assets.
    function convertToAssets(uint256 _tokenAmount) public view returns (uint256 ethAmount) {
        uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : (reserve1 * BUFFER) / _totalSupply;
        ethAmount = (_tokenAmount * ethPerToken) / BUFFER;
    }

    /// @notice Converts a given Ether amount into token shares.
    /// @param _ethAmount The amount of Ether-based assets.
    /// @return tokenAmount The corresponding token share amount.
    function convertToShares(uint256 _ethAmount) public view returns (uint256 tokenAmount) {
        uint256 ethPerToken = _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : ((reserve1 * BUFFER) / _totalSupply);
        tokenAmount = (_ethAmount * BUFFER) / ethPerToken;
    }

    /// @notice Returns the current reserves and last block timestamp.
    /// @return _reserve0 The reserve of the main token supply.
    /// @return _reserve1 The reserve of the Ether-based asset (WETH).
    /// @return _blockTimestampLast The last timestamp the reserves were updated.
    function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = uint112(reserve0);
        _reserve1 = uint112(reserve1);
        _blockTimestampLast = uint32(blockTimestampLast);
    }

    /// @notice Calculates the tax amount for a token transfer between two addresses
    /// @dev This is a public wrapper around the internal _determineTax function
    function determineTax(address _from, address _to, uint256 _value) public view returns (uint256) {
        return _determineTax(_from, _to, _value);
    }

    /* =========================== VIEW - UNI V2 COMPATIBILITY =========================== */

    /// @notice Returns the output amount for a given input, emulating Uni V2 `getAmountOut`.
    /// @param _amountIn The input amount.
    /// @param _reserveIn The reserve corresponding to the input token.
    /// @return amountOut The output amount after taxes and fees.
    function getAmountOut(uint256 _amountIn, uint256 _reserveIn, uint256) public view returns (uint256 amountOut) {
        if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
        address tokenIn = _reserveIn == reserve1 ? address(weth) : address(this);

        if (tokenIn == address(this)) {
            uint256 preTaxEthAmount = convertToAssets(_amountIn);
            uint256 taxAmt = (_amountIn * factory.mainToTax()) / DIVISOR;
            uint256 actualAmt = _amountIn - taxAmt;
            uint256 ethPerToken =
                _totalSupply == 0 ? INITIAL_ETH_PER_TOKEN : (reserve1 * BUFFER) / (_totalSupply - taxAmt);
            uint256 ethAmount = (actualAmt * ethPerToken) / BUFFER;
            uint256 fee = (preTaxEthAmount * factory.tradeFee()) / DIVISOR;
            amountOut = ethAmount - fee;
        } else {
            uint256 taxAmt = (_amountIn * factory.mainFromTax()) / DIVISOR;
            uint256 actualAmt = _amountIn - taxAmt;
            uint256 tokenAmount = convertToShares(actualAmt); // converts WETH -> mainTokenShares
            uint256 fee = (tokenAmount * factory.tradeFee()) / DIVISOR;
            amountOut = tokenAmount - fee;
        }
    }

    /// @notice Returns the input amount required for a given output, emulating Uni V2 `getAmountIn`.
    /// @notice when tokenIn is Asset, the function overestimates the amountIn, else it's correct
    /// @notice (this function is just for uni v2 compatibility)
    /// @param _amountOut The desired output amount.
    /// @param _reserveIn The reserve corresponding to the input token.
    /// @return amountIn The input amount required to achieve the given output after taxes and fees.
    function getAmountIn(uint256 _amountOut, uint256 _reserveIn, uint256) public view returns (uint256 amountIn) {
        if (_reserveIn != reserve1 && _reserveIn != reserve0) revert InvalidReserveIn();
        address tokenIn = _reserveIn == reserve1 ? address(weth) : address(this);

        uint256 tradeFee = factory.tradeFee();
        uint256 mainFromTax = factory.mainFromTax();
        uint256 mainToTax = factory.mainToTax();

        if (tokenIn == address(this)) {
            uint256 assetsNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
            uint256 sharesNeeded = convertToShares(assetsNeeded); // converts WETH -> mainTokenShares
            amountIn = (sharesNeeded * DIVISOR) / (DIVISOR - mainToTax);
        } else {
            uint256 sharesNeeded = (_amountOut * DIVISOR) / (DIVISOR - tradeFee);
            uint256 assetsNeeded = convertToAssets(sharesNeeded); // converts mainTokenShares -> WETH
            amountIn = (assetsNeeded * DIVISOR) / (DIVISOR - mainFromTax);
        }
    }

    /* ================================ INTERNAL FUNCTIONS ================================ */

    /// @dev Sends fees to the owner and treasury according to the factory’s fee distribution.
    /// @param _amount The amount of Ether-based fees to distribute.
    function _sendFees(uint256 _amount) internal {
        weth.withdraw(_amount);
        (address treasury,, uint256 treasuryShare) = factory.feeShares();
        payable(treasury).transfer((_amount * treasuryShare) / DIVISOR);
    }

    /// @dev Updates the internal reserves and timestamp. Called after minting/burning.
    function _updateReserves() internal {
        reserve1 = weth.balanceOf(address(this));
        reserve0 = _totalSupply;
        blockTimestampLast = block.timestamp;
    }

    /// @dev Internal accounting hook overriding `_update` in ERC20. Applies taxes and points updates on transfers.
    /// @param from The sender address.
    /// @param to The recipient address.
    /// @param value The transferred amount.
    function _update(address from, address to, uint256 value) internal virtual override {
        uint256 tax;
        if (!disabled) {
            tax = _determineTax(from, to, value);
            // burn the taxes so that holders get benefited from the tax
            if (tax > 0) {
                _awardTaxes(from, tax);
            }
        }
        // Final value to be received by address.
        uint256 receiveValue = value - tax;
        if (from == address(0)) {
            _totalSupply += receiveValue;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < receiveValue) revert ERC20InsufficientBalance(from, fromBalance, receiveValue);
            unchecked {
                _balances[from] = fromBalance - receiveValue;
            }
        }

        if (to == address(0)) {
            unchecked {
                _totalSupply -= receiveValue;
            }
        } else {
            unchecked {
                _balances[to] += receiveValue;
            }
        }

        emit Transfer(from, to, receiveValue);
    }

    /// @dev Determines the tax amount for a given transfer.
    /// @param _from The sender address.
    /// @param _to The recipient address.
    /// @param _value The transfer amount.
    /// @return taxAmount The calculated tax.
    function _determineTax(address _from, address _to, uint256 _value) internal view returns (uint256 taxAmount) {
        if (_to == address(this)) return 0;
        (uint256 fromTax, uint256 toTax) = factory.getTaxes(_from, _to);
        taxAmount += (_value * fromTax) / DIVISOR;
        taxAmount += (_value * toTax) / DIVISOR;
    }

    /// @dev Burns the taxed amount and updates reserves, benefiting holders by increasing asset per share.
    /// @param _from The address from which tax is collected.
    /// @param _amount The tax amount to burn.
    function _awardTaxes(address _from, uint256 _amount) internal {
        address to = address(this);
        if (_from != address(0)) {
            _balances[_from] -= _amount;
            _totalSupply -= _amount;
            emit Transfer(_from, to, _amount);
            emit Transfer(to, _from, _amount);
        } else {
            emit Transfer(address(0), to, _amount);
            emit Transfer(to, address(0), _amount);
        }
    }

    /// @notice Simplified buyback and burn mechanism. Converts Ether to WETH and updates reserves.
    function buybackAndBurn() external payable onlyOwner {
        if (msg.value > 0) weth.deposit{value: msg.value}();
        _updateReserves();
    }

    /**
     * @notice Graduates token to Uniswap V3 liquidity positions
     * @dev External function that:
     *      1. Disables further minting/redeeming
     *      2. Mints additional supply based on graduationMintRatio
     *      3. Sends collected fees to the builder
     *      4. Transfers all WETH to factory
     *      5. Creates two Uniswap V3 positions:
     *         - Token-only position with price buffer
     *         - WETH-only position for concentrated liquidity
     * @param _builder The address to send the fees to
     * @param _builderGraduationMintShare The percentage of the minted tokens to send to the builder
     * @param _ideaPersonGraduationMintShare The percentage of the minted tokens to send to the idea person
     */
    function graduate(
        address payable _builder,
        uint256 _builderGraduationMintShare,
        uint256 _ideaPersonGraduationMintShare
    ) external onlyFactory {
        disabled = true;
        emit Disable(address(this), block.timestamp);

        // send all `eth` balance of this contract to the builder
        (bool success,) = _builder.call{value: address(this).balance}("");
        if (!success) revert BuilderTransferFailed();

        uint256 mintAmount = (_totalSupply * factory.graduationMintRatio()) / DIVISOR;
        uint256 ideaPersonAmount = (mintAmount * _ideaPersonGraduationMintShare) / DIVISOR;
        uint256 builderAmount = (mintAmount * _builderGraduationMintShare) / DIVISOR;
        uint256 liquidityAmount = mintAmount - ideaPersonAmount - builderAmount;

        // mint graduationMintRatio * current supply to factory
        _mint(address(factory), liquidityAmount);
        _mint(owner(), ideaPersonAmount);
        _mint(_builder, builderAmount);

        // add liquidity to Sushiswap V3 Pool
        uint256 wethAmount = weth.balanceOf(address(this));
        weth.transfer(address(factory), wethAmount);
        factory.addInitialLiquidity(mintAmount, wethAmount, _builder);

        // renounce ownership
        _transferOwnership(address(0));
        emit Evolve(address(this), block.timestamp);
    }
}

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

pragma solidity 0.8.20;

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

interface IERC20Errors {
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
    error ERC20InsufficientBalance(address owner, uint256 balance, uint256 value);
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 value);
}

/**
 * @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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) internal _balances;

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

    uint256 internal _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}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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:
     *
     * ```solidity
     * 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
pragma solidity 0.8.20;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;

    function balanceOf(address) external view returns (uint256);
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.20;

interface IIdeaFactory {
    function createToken(string memory name, string memory symbol) external returns (address token);
    function tradeFee() external view returns (uint256);
    function mainToTax() external view returns (uint256);
    function mainFromTax() external view returns (uint256);
    function creatorShare() external view returns (uint256);
    function treasuryShare() external view returns (uint256);
    function ownerGraduationMintShare() external view returns (uint256);
    function feeShares() external view returns (address treasury, uint256 creatorShare, uint256 treasuryShare);
    function getTaxes(address _from, address _to) external view returns (uint256 fromTax, uint256 toTax);
    function addInitialLiquidity(uint256 _reserve0, uint256 _reserve1, address _builder) external;
    function tokenPriceBuffer() external view returns (int256);
    function graduationMintRatio() external view returns (uint256);
    function minWethToGraduate() external view returns (uint256);
}

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;

interface IOnlyUpToken {
    /// @notice Thrown when minting is disabled
    error MintingDisabled();

    /// @notice Thrown when reentrancy is detected
    error NoReentrancy();

    /// @notice Thrown when token is not yet eligible for disabling
    error DisableTimeNotReached();

    /// @notice Thrown when airdrop token is invalid
    error InvalidAirdropToken();

    /// @notice Thrown when token must be disabled before airdrop
    error TokenNotDisabled();

    /// @notice Thrown when token amount is invalid
    error InvalidTokenAmount();

    /// @notice Thrown when minimum amount of WETH to graduate is not met
    error MinWethToGraduate();

    /// @notice Thrown when receiver is invalid
    error InvalidReceiver();

    /// @notice Thrown when swap parameters are invalid
    error InvalidSwapParameters();

    /// @notice Thrown when airdrop is not initiated
    error AirdropNotInitiated();

    /// @notice Thrown when transfer is restricted
    error RestrictedTransfer();

    /// @notice Thrown when airdrop period is invalid
    error InvalidAirdropPeriod();

    /// @notice Thrown when reserve is invalid
    error InvalidReserveIn();

    /// @notice Thrown when sender is invalid
    error InvalidSender();

    /// @notice thrown when caller is not the factory
    error OnlyFactory();

    /// @notice Thrown when builder transfer fails
    error BuilderTransferFailed();

    /* ================================ EVENTS ================================ */
    /// @notice Emitted when the owner burns tokens.
    /// @param sender The address that initiated the burn.
    /// @param amount The amount of tokens burned.
    event OwnerBurn(address indexed sender, uint256 amount);

    /// @notice Emitted when the token evolves to a normal ERC20.
    /// @param token The address of the token.
    /// @param timestamp The timestamp of the evolve.
    event Evolve(address indexed token, uint256 timestamp);

    /// @notice Emitted on swaps, mimicking a Uni V2 pool interface.
    /// @param sender The address initiating the swap.
    /// @param amount0In The amount of Ether-based asset input.
    /// @param amount1In The amount of token input.
    /// @param amount0Out The amount of Ether-based asset output.
    /// @param amount1Out The amount of token output.
    /// @param to The recipient address of the output.
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    /// @notice Emitted when liquidity is minted (not traditionally used here, but for Uni V2 compatibility).
    /// @param sender The address minting liquidity.
    /// @param amount0 The amount of Ether-based liquidity added.
    /// @param amount1 The amount of token liquidity added.
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);

    /// @notice Emitted when liquidity is burned (not traditionally used here, but for Uni V2 compatibility).
    /// @param sender The address burning liquidity.
    /// @param amount0 The amount of Ether-based liquidity removed.
    /// @param amount1 The amount of token liquidity removed.
    event Burn(address indexed sender, uint256 amount0, uint256 amount1);

    /// @notice Emitted when the token is disabled.
    /// @param sender The address that initiated the disable.
    /// @param timestamp The timestamp of the disable.
    event Disable(address indexed sender, uint256 timestamp);

    /* ================================ FUNCTIONS ================================ */

    /// @notice Mints new tokens by depositing ETH or WETH
    /// @dev Converts the input ETH/WETH to token shares based on current ratio
    /// @param _receiver The address that will receive the minted tokens
    function mint(address _receiver) external payable;

    /// @notice Redeems tokens for ETH/WETH
    /// @dev Burns tokens and returns corresponding ETH/WETH amount minus fees
    /// @param _receiver The address that will receive the ETH/WETH
    /// @param _tokenAmount The amount of tokens to redeem
    function redeem(address _receiver, uint256 _tokenAmount) external;

    /// @notice Performs a swap operation (UniswapV2 compatibility)
    /// @dev Handles both token minting and redemption based on output parameters
    /// @param amount0Out The amount of ETH/WETH to output
    /// @param amount1Out The amount of tokens to output
    /// @param to The recipient address
    /// @param data Additional calldata (unused, for V2 compatibility)
    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external payable;

    /// @notice Calculates the tax amount for a transfer
    /// @dev Uses factory tax settings to determine the tax
    /// @param _from Source address
    /// @param _to Destination address
    /// @param _value Transfer amount
    /// @return The calculated tax amount
    function determineTax(address _from, address _to, uint256 _value) external view returns (uint256);

    /// @notice Gets the current reserves of the token and WETH
    /// @dev Used for price calculations and V2 compatibility
    /// @return reserve0 The token reserve
    /// @return reserve1 The WETH reserve
    /// @return blockTimestampLast The timestamp of the last update
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    /// @notice Calculates the amount of tokens to receive for a given ETH input
    /// @param _amountIn The amount of ETH to swap
    /// @param _reserve0 Current token reserve
    /// @param _reserve1 Current WETH reserve
    /// @return The amount of tokens to receive
    function getAmountOut(uint256 _amountIn, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);

    /// @notice Calculates the amount of ETH needed for a given token output
    /// @param _amountOut The desired amount of tokens
    /// @param _reserve0 Current token reserve
    /// @param _reserve1 Current WETH reserve
    /// @return The amount of ETH needed
    function getAmountIn(uint256 _amountOut, uint256 _reserve0, uint256 _reserve1) external view returns (uint256);
}

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

pragma solidity ^0.8.20;

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

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

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

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

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

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

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

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

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

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

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

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

// 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.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.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;
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AirdropNotInitiated","type":"error"},{"inputs":[],"name":"BuilderTransferFailed","type":"error"},{"inputs":[],"name":"DisableTimeNotReached","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"value","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":"InvalidAirdropPeriod","type":"error"},{"inputs":[],"name":"InvalidAirdropToken","type":"error"},{"inputs":[],"name":"InvalidReceiver","type":"error"},{"inputs":[],"name":"InvalidReserveIn","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"InvalidSwapParameters","type":"error"},{"inputs":[],"name":"InvalidTokenAmount","type":"error"},{"inputs":[],"name":"MinWethToGraduate","type":"error"},{"inputs":[],"name":"MintingDisabled","type":"error"},{"inputs":[],"name":"NoReentrancy","type":"error"},{"inputs":[],"name":"OnlyFactory","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"RestrictedTransfer","type":"error"},{"inputs":[],"name":"TokenNotDisabled","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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Disable","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Evolve","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OwnerBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","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":[{"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":[],"name":"buybackAndBurn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"determineTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IIdeaFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesis","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":"","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_reserveIn","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_builder","type":"address"},{"internalType":"uint256","name":"_builderGraduationMintShare","type":"uint256"},{"internalType":"uint256","name":"_ideaPersonGraduationMintShare","type":"uint256"}],"name":"graduate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x608060405234801562000010575f80fd5b50604051620027ca380380620027ca83398101604081905262000033916200020b565b838383600362000044838262000322565b50600462000053828262000322565b5050506001600160a01b0381166200008457604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200008f81620000e0565b50600780546001600160a01b0319908116331790915542600855600680546001600160a01b03939093169282168317905560098054821630179055600a8054909116909117905550620003ea915050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b80516001600160a01b038116811462000148575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011262000171575f80fd5b81516001600160401b03808211156200018e576200018e6200014d565b604051601f8301601f19908116603f01168101908282118183101715620001b957620001b96200014d565b81604052838152602092508683858801011115620001d5575f80fd5b5f91505b83821015620001f85785820183015181830184015290820190620001d9565b5f93810190920192909252949350505050565b5f805f80608085870312156200021f575f80fd5b6200022a8562000131565b60208601519094506001600160401b038082111562000247575f80fd5b620002558883890162000161565b945060408701519150808211156200026b575f80fd5b506200027a8782880162000161565b9250506200028b6060860162000131565b905092959194509250565b600181811c90821680620002ab57607f821691505b602082108103620002ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200031d575f81815260208120601f850160051c81016020861015620002f85750805b601f850160051c820191505b81811015620003195782815560010162000304565b5050505b505050565b81516001600160401b038111156200033e576200033e6200014d565b62000356816200034f845462000296565b84620002d0565b602080601f8311600181146200038c575f8415620003745750858301515b5f19600386901b1c1916600185901b17855562000319565b5f85815260208120601f198616915b82811015620003bc578886015182559484019460019091019084016200039b565b5085821015620003da57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6123d280620003f85f395ff3fe6080604052600436106101b2575f3560e01c806385f8c259116100e7578063c6e6f59211610087578063dd62ed3e11610062578063dd62ed3e146104d9578063ee0708051461051d578063f2fde38b1461053d578063fb210b201461055c575f80fd5b8063c6e6f5921461047c578063cff733f61461049b578063d21220a7146104ba575f80fd5b80639ca31bfb116100c25780639ca31bfb1461040a578063a7f0b3de14610429578063a9059cbb1461043e578063c45a01551461045d575f80fd5b806385f8c259146103ba5780638da5cb5b146103d957806395d89b41146103f6575f80fd5b806318160ddd11610152578063313ce5671161012d578063313ce567146103445780636a6278421461035f57806370a0823114610372578063715018a6146103a6575f80fd5b806318160ddd146102f25780631e9a69501461030657806323b872dd14610325575f80fd5b806307a2d13a1161018d57806307a2d13a146102255780630902f1ac14610244578063095ea7b31461028c5780630dfe1681146102bb575f80fd5b8063022c0d9f146101bd578063054d50d4146101d257806306fdde0314610204575f80fd5b366101b957005b5f80fd5b6101d06101cb366004612043565b610564565b005b3480156101dd575f80fd5b506101f16101ec3660046120d1565b6105c0565b6040519081526020015b60405180910390f35b34801561020f575f80fd5b50610218610923565b6040516101fb91906120fa565b348015610230575f80fd5b506101f161023f366004612145565b6109b3565b34801561024f575f80fd5b50600c54600b54600d54604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff16908201526060016101fb565b348015610297575f80fd5b506102ab6102a636600461215c565b610a14565b60405190151581526020016101fb565b3480156102c6575f80fd5b506009546102da906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b3480156102fd575f80fd5b506002546101f1565b348015610311575f80fd5b506101d061032036600461215c565b610a2d565b348015610330575f80fd5b506102ab61033f366004612186565b610e8f565b34801561034f575f80fd5b50604051601281526020016101fb565b6101d061036d3660046121c4565b610eb2565b34801561037d575f80fd5b506101f161038c3660046121c4565b6001600160a01b03165f9081526020819052604090205490565b3480156103b1575f80fd5b506101d061112b565b3480156103c5575f80fd5b506101f16103d43660046120d1565b61113e565b3480156103e4575f80fd5b506005546001600160a01b03166102da565b348015610401575f80fd5b506102186113c4565b348015610415575f80fd5b506101f1610424366004612186565b6113d3565b348015610434575f80fd5b506101f160085481565b348015610449575f80fd5b506102ab61045836600461215c565b6113e7565b348015610468575f80fd5b506007546102da906001600160a01b031681565b348015610487575f80fd5b506101f1610496366004612145565b6113f4565b3480156104a6575f80fd5b506101d06104b53660046121df565b611444565b3480156104c5575f80fd5b50600a546102da906001600160a01b031681565b3480156104e4575f80fd5b506101f16104f3366004612211565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610528575f80fd5b506007546102ab90600160a01b900460ff1681565b348015610548575f80fd5b506101d06105573660046121c4565b6117db565b6101d061181d565b5f84118015610571575084155b156105845761057f83610eb2565b6105b9565b5f85118015610591575083155b156105a05761057f8386610a2d565b604051635adaa95f60e01b815260040160405180910390fd5b5050505050565b5f600b5483141580156105d55750600c548314155b156105f3576040516308aea2cb60e11b815260040160405180910390fd5b5f600b5484146106035730610610565b6006546001600160a01b03165b9050306001600160a01b038216036107d5575f61062c866109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190612248565b6106b09089612273565b6106ba919061228a565b90505f6106c782896122a9565b90505f6002545f1461070657826002546106e191906122a9565b670de0b6b3a7640000600b546106f79190612273565b610701919061228a565b61070e565b6509184e72a0005b90505f670de0b6b3a76400006107248385612273565b61072e919061228a565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190612248565b6107b29088612273565b6107bc919061228a565b90506107c881836122a9565b975050505050505061091b565b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190612248565b6108579088612273565b610861919061228a565b90505f61086e82886122a9565b90505f61087a826113f4565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f49190612248565b6108fe9084612273565b610908919061228a565b905061091481836122a9565b9550505050505b509392505050565b606060038054610932906122bc565b80601f016020809104026020016040519081016040528092919081815260200182805461095e906122bc565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806002545f146109e657600254670de0b6b3a7640000600b546109d79190612273565b6109e1919061228a565b6109ee565b6509184e72a0005b9050670de0b6b3a7640000610a038285612273565b610a0d919061228a565b9392505050565b5f33610a21818585611898565b60019150505b92915050565b600a54600160a01b900460ff1615610a5857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b9081179091556007540460ff1615610a935760405163af79b43760e01b815260040160405180910390fd5b5f808211610aaf57305f90815260208190526040902054610ab1565b815b90505f8215610ac05733610ac2565b305b9050306001600160a01b03851603610aed57604051631e4ec46b60e01b815260040160405180910390fd5b815f03610b0d57604051632160733960e01b815260040160405180910390fd5b5f610b17836109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b919190612248565b610b9b9086612273565b610ba5919061228a565b9050610bb183826118aa565b5f610bbc82866122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c369190612248565b610c409086612273565b610c4a919061228a565b9050610c55816118e2565b5f610c5f836109b3565b9050610c6b82826122a9565b9050610c8086610c7b868a6122a9565b6118aa565b600b546006546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ced9190612248565b610cf791906122f4565b610d0191906122a9565b610d0b90826122f4565b9050875f03610d8e5760065460405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190612307565b50610e1c565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015610dd1575f80fd5b505af1158015610de3573d5f803e3d5ffd5b50506040516001600160a01b038c16925083156108fc02915083905f818181858888f19350505050158015610e1a573d5f803e3d5ffd5b505b610e24611a07565b604080518481525f60208201819052818301526060810183905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050505050565b5f33610e9c858285611a80565b610ea7858585611af5565b506001949350505050565b600754600160a01b900460ff1615610edd5760405163af79b43760e01b815260040160405180910390fd5b600a54600160a01b900460ff1615610f0857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b179055348015610f875760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b50505050505b600b546006546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff59190612248565b610fff91906122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611055573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110799190612248565b6110839084612273565b61108d919061228a565b90505f61109a82846122a9565b90506110a5826118e2565b5f6110af826113f4565b90506110bb8682611b52565b6110c3611a07565b604080515f80825260208201859052818301849052606082015290516001600160a01b0388169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050565b611133611b86565b61113c5f611bb3565b565b5f600b5483141580156111535750600c548314155b15611171576040516308aea2cb60e11b815260040160405180910390fd5b5f600b548414611181573061118e565b6006546001600160a01b03165b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112059190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c9190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f39190612248565b9050306001600160a01b03851603611361575f611312846127106122a9565b61131e6127108b612273565b611328919061228a565b90505f611334826113f4565b9050611342836127106122a9565b61134e61271083612273565b611358919061228a565b965050506113b9565b5f61136e846127106122a9565b61137a6127108b612273565b611384919061228a565b90505f611390826109b3565b905061139e846127106122a9565b6113aa61271083612273565b6113b4919061228a565b965050505b505050509392505050565b606060048054610932906122bc565b5f6113df848484611c04565b949350505050565b5f33610a21818585611af5565b5f806002545f1461142757600254670de0b6b3a7640000600b546114189190612273565b611422919061228a565b61142f565b6509184e72a0005b905080610a03670de0b6b3a764000085612273565b6007546001600160a01b0316331461146f57604051630636a15760e11b815260040160405180910390fd5b6007805460ff60a01b1916600160a01b17905560405130907f4f0f085b63912ac6b8aebbd52cd6afde1dc2091bb7ebaabf1baf300237bff27d906114b69042815260200190565b60405180910390a25f836001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611507576040519150601f19603f3d011682016040523d82523d5f602084013e61150c565b606091505b505090508061152e576040516341688c3b60e11b815260040160405180910390fd5b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663a512583a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a69190612248565b6002546115b39190612273565b6115bd919061228a565b90505f6127106115cd8584612273565b6115d7919061228a565b90505f6127106115e78785612273565b6115f1919061228a565b90505f816115ff84866122a9565b61160991906122a9565b600754909150611622906001600160a01b031682611b52565b61163d6116376005546001600160a01b031690565b84611b52565b6116478883611b52565b6006546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561168d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190612248565b60065460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117299190612307565b506007546040516311d0decd60e11b815260048101879052602481018390526001600160a01b038b81166044830152909116906323a1bd9a906064015f604051808303815f87803b15801561177c575f80fd5b505af115801561178e573d5f803e3d5ffd5b5050505061179b5f611bb3565b60405142815230907fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d9060200160405180910390a2505050505050505050565b6117e3611b86565b6001600160a01b03811661181157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61181a81611bb3565b50565b611825611b86565b34156118905760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611878575f80fd5b505af115801561188a573d5f803e3d5ffd5b50505050505b61113c611a07565b6118a58383836001611ce5565b505050565b6001600160a01b0382166118d357604051634b637e8f60e11b81525f6004820152602401611808565b6118de825f83611db7565b5050565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611925575f80fd5b505af1158015611937573d5f803e3d5ffd5b505050505f8060075f9054906101000a90046001600160a01b03166001600160a01b031663caf6cbd56040518163ffffffff1660e01b8152600401606060405180830381865afa15801561198d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b19190612326565b9250509150816001600160a01b03166108fc61271083866119d29190612273565b6119dc919061228a565b6040518115909202915f818181858888f19350505050158015611a01573d5f803e3d5ffd5b50505050565b6006546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a719190612248565b600b55600254600c5542600d55565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611a015781811015611ae757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611808565b611a0184848484035f611ce5565b6001600160a01b038316611b1e57604051634b637e8f60e11b81525f6004820152602401611808565b6001600160a01b038216611b475760405163ec442f0560e01b81525f6004820152602401611808565b6118a5838383611db7565b6001600160a01b038216611b7b5760405163ec442f0560e01b81525f6004820152602401611808565b6118de5f8383611db7565b6005546001600160a01b0316331461113c5760405163118cdaa760e01b8152336004820152602401611808565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f306001600160a01b03841603611c1c57505f610a0d565b60075460405163752e068b60e11b81526001600160a01b03868116600483015285811660248301525f92839291169063ea5c0d16906044016040805180830381865afa158015611c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c92919061235a565b9092509050612710611ca48386612273565b611cae919061228a565b611cb890846122f4565b9250612710611cc78286612273565b611cd1919061228a565b611cdb90846122f4565b9695505050505050565b6001600160a01b038416611d0e5760405163e602df0560e01b81525f6004820152602401611808565b6001600160a01b038316611d3757604051634a1406b160e11b81525f6004820152602401611808565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611a0157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611da991815260200190565b60405180910390a350505050565b6007545f90600160a01b900460ff16611de757611dd5848484611c04565b90508015611de757611de78482611f09565b5f611df282846122a9565b90506001600160a01b038516611e1e578060025f828254611e1391906122f4565b90915550611e8e9050565b6001600160a01b0385165f9081526020819052604090205481811015611e705760405163391434e360e21b81526001600160a01b03871660048201526024810182905260448101839052606401611808565b6001600160a01b0386165f9081526020819052604090209082900390555b6001600160a01b038416611eaa57600280548290039055611ec8565b6001600160a01b0384165f9081526020819052604090208054820190555b836001600160a01b0316856001600160a01b03165f8051602061237d83398151915283604051611efa91815260200190565b60405180910390a35050505050565b306001600160a01b03831615611fd8576001600160a01b0383165f9081526020819052604081208054849290611f409084906122a9565b925050819055508160025f828254611f5891906122a9565b92505081905550806001600160a01b0316836001600160a01b03165f8051602061237d83398151915284604051611f9191815260200190565b60405180910390a3826001600160a01b0316816001600160a01b03165f8051602061237d83398151915284604051611fcb91815260200190565b60405180910390a3505050565b6040518281526001600160a01b038216905f905f8051602061237d8339815191529060200160405180910390a36040518281525f906001600160a01b038316905f8051602061237d83398151915290602001611fcb565b6001600160a01b038116811461181a575f80fd5b5f805f805f60808688031215612057575f80fd5b853594506020860135935060408601356120708161202f565b9250606086013567ffffffffffffffff8082111561208c575f80fd5b818801915088601f83011261209f575f80fd5b8135818111156120ad575f80fd5b8960208285010111156120be575f80fd5b9699959850939650602001949392505050565b5f805f606084860312156120e3575f80fd5b505081359360208301359350604090920135919050565b5f6020808352835180828501525f5b8181101561212557858101830151858201604001528201612109565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612155575f80fd5b5035919050565b5f806040838503121561216d575f80fd5b82356121788161202f565b946020939093013593505050565b5f805f60608486031215612198575f80fd5b83356121a38161202f565b925060208401356121b38161202f565b929592945050506040919091013590565b5f602082840312156121d4575f80fd5b8135610a0d8161202f565b5f805f606084860312156121f1575f80fd5b83356121fc8161202f565b95602085013595506040909401359392505050565b5f8060408385031215612222575f80fd5b823561222d8161202f565b9150602083013561223d8161202f565b809150509250929050565b5f60208284031215612258575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a2761225f565b5f826122a457634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a2757610a2761225f565b600181811c908216806122d057607f821691505b6020821081036122ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610a2757610a2761225f565b5f60208284031215612317575f80fd5b81518015158114610a0d575f80fd5b5f805f60608486031215612338575f80fd5b83516123438161202f565b602085015160409095015190969495509392505050565b5f806040838503121561236b575f80fd5b50508051602090910151909290915056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207f4bd5f13f1dda29a14528faa154e86d1177ed559a0e816613d7f973664aa12d64736f6c63430008140033000000000000000000000000fa760444a229e78a50ca9b3779f4ce4cce10e170000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000d4d75736520496e666f20426f740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d49420000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b2575f3560e01c806385f8c259116100e7578063c6e6f59211610087578063dd62ed3e11610062578063dd62ed3e146104d9578063ee0708051461051d578063f2fde38b1461053d578063fb210b201461055c575f80fd5b8063c6e6f5921461047c578063cff733f61461049b578063d21220a7146104ba575f80fd5b80639ca31bfb116100c25780639ca31bfb1461040a578063a7f0b3de14610429578063a9059cbb1461043e578063c45a01551461045d575f80fd5b806385f8c259146103ba5780638da5cb5b146103d957806395d89b41146103f6575f80fd5b806318160ddd11610152578063313ce5671161012d578063313ce567146103445780636a6278421461035f57806370a0823114610372578063715018a6146103a6575f80fd5b806318160ddd146102f25780631e9a69501461030657806323b872dd14610325575f80fd5b806307a2d13a1161018d57806307a2d13a146102255780630902f1ac14610244578063095ea7b31461028c5780630dfe1681146102bb575f80fd5b8063022c0d9f146101bd578063054d50d4146101d257806306fdde0314610204575f80fd5b366101b957005b5f80fd5b6101d06101cb366004612043565b610564565b005b3480156101dd575f80fd5b506101f16101ec3660046120d1565b6105c0565b6040519081526020015b60405180910390f35b34801561020f575f80fd5b50610218610923565b6040516101fb91906120fa565b348015610230575f80fd5b506101f161023f366004612145565b6109b3565b34801561024f575f80fd5b50600c54600b54600d54604080516dffffffffffffffffffffffffffff948516815293909216602084015263ffffffff16908201526060016101fb565b348015610297575f80fd5b506102ab6102a636600461215c565b610a14565b60405190151581526020016101fb565b3480156102c6575f80fd5b506009546102da906001600160a01b031681565b6040516001600160a01b0390911681526020016101fb565b3480156102fd575f80fd5b506002546101f1565b348015610311575f80fd5b506101d061032036600461215c565b610a2d565b348015610330575f80fd5b506102ab61033f366004612186565b610e8f565b34801561034f575f80fd5b50604051601281526020016101fb565b6101d061036d3660046121c4565b610eb2565b34801561037d575f80fd5b506101f161038c3660046121c4565b6001600160a01b03165f9081526020819052604090205490565b3480156103b1575f80fd5b506101d061112b565b3480156103c5575f80fd5b506101f16103d43660046120d1565b61113e565b3480156103e4575f80fd5b506005546001600160a01b03166102da565b348015610401575f80fd5b506102186113c4565b348015610415575f80fd5b506101f1610424366004612186565b6113d3565b348015610434575f80fd5b506101f160085481565b348015610449575f80fd5b506102ab61045836600461215c565b6113e7565b348015610468575f80fd5b506007546102da906001600160a01b031681565b348015610487575f80fd5b506101f1610496366004612145565b6113f4565b3480156104a6575f80fd5b506101d06104b53660046121df565b611444565b3480156104c5575f80fd5b50600a546102da906001600160a01b031681565b3480156104e4575f80fd5b506101f16104f3366004612211565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610528575f80fd5b506007546102ab90600160a01b900460ff1681565b348015610548575f80fd5b506101d06105573660046121c4565b6117db565b6101d061181d565b5f84118015610571575084155b156105845761057f83610eb2565b6105b9565b5f85118015610591575083155b156105a05761057f8386610a2d565b604051635adaa95f60e01b815260040160405180910390fd5b5050505050565b5f600b5483141580156105d55750600c548314155b156105f3576040516308aea2cb60e11b815260040160405180910390fd5b5f600b5484146106035730610610565b6006546001600160a01b03165b9050306001600160a01b038216036107d5575f61062c866109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a69190612248565b6106b09089612273565b6106ba919061228a565b90505f6106c782896122a9565b90505f6002545f1461070657826002546106e191906122a9565b670de0b6b3a7640000600b546106f79190612273565b610701919061228a565b61070e565b6509184e72a0005b90505f670de0b6b3a76400006107248385612273565b61072e919061228a565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a89190612248565b6107b29088612273565b6107bc919061228a565b90506107c881836122a9565b975050505050505061091b565b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190612248565b6108579088612273565b610861919061228a565b90505f61086e82886122a9565b90505f61087a826113f4565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f49190612248565b6108fe9084612273565b610908919061228a565b905061091481836122a9565b9550505050505b509392505050565b606060038054610932906122bc565b80601f016020809104026020016040519081016040528092919081815260200182805461095e906122bc565b80156109a95780601f10610980576101008083540402835291602001916109a9565b820191905f5260205f20905b81548152906001019060200180831161098c57829003601f168201915b5050505050905090565b5f806002545f146109e657600254670de0b6b3a7640000600b546109d79190612273565b6109e1919061228a565b6109ee565b6509184e72a0005b9050670de0b6b3a7640000610a038285612273565b610a0d919061228a565b9392505050565b5f33610a21818585611898565b60019150505b92915050565b600a54600160a01b900460ff1615610a5857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b9081179091556007540460ff1615610a935760405163af79b43760e01b815260040160405180910390fd5b5f808211610aaf57305f90815260208190526040902054610ab1565b815b90505f8215610ac05733610ac2565b305b9050306001600160a01b03851603610aed57604051631e4ec46b60e01b815260040160405180910390fd5b815f03610b0d57604051632160733960e01b815260040160405180910390fd5b5f610b17836109b3565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b919190612248565b610b9b9086612273565b610ba5919061228a565b9050610bb183826118aa565b5f610bbc82866122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c369190612248565b610c409086612273565b610c4a919061228a565b9050610c55816118e2565b5f610c5f836109b3565b9050610c6b82826122a9565b9050610c8086610c7b868a6122a9565b6118aa565b600b546006546040516370a0823160e01b815230600482015284916001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ced9190612248565b610cf791906122f4565b610d0191906122a9565b610d0b90826122f4565b9050875f03610d8e5760065460405163a9059cbb60e01b81526001600160a01b038b81166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af1158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190612307565b50610e1c565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015610dd1575f80fd5b505af1158015610de3573d5f803e3d5ffd5b50506040516001600160a01b038c16925083156108fc02915083905f818181858888f19350505050158015610e1a573d5f803e3d5ffd5b505b610e24611a07565b604080518481525f60208201819052818301526060810183905290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050505050565b5f33610e9c858285611a80565b610ea7858585611af5565b506001949350505050565b600754600160a01b900460ff1615610edd5760405163af79b43760e01b815260040160405180910390fd5b600a54600160a01b900460ff1615610f0857604051632c1ff44360e11b815260040160405180910390fd5b600a805460ff60a01b1916600160a01b179055348015610f875760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015610f6f575f80fd5b505af1158015610f81573d5f803e3d5ffd5b50505050505b600b546006546040516370a0823160e01b81523060048201525f92916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fd1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff59190612248565b610fff91906122a9565b90505f61271060075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611055573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110799190612248565b6110839084612273565b61108d919061228a565b90505f61109a82846122a9565b90506110a5826118e2565b5f6110af826113f4565b90506110bb8682611b52565b6110c3611a07565b604080515f80825260208201859052818301849052606082015290516001600160a01b0388169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a35050600a805460ff60a01b1916905550505050565b611133611b86565b61113c5f611bb3565b565b5f600b5483141580156111535750600c548314155b15611171576040516308aea2cb60e11b815260040160405180910390fd5b5f600b548414611181573061118e565b6006546001600160a01b03165b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166324bcdfbd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112059190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b03166372417fc26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611258573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127c9190612248565b90505f60075f9054906101000a90046001600160a01b03166001600160a01b031663d55deabb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f39190612248565b9050306001600160a01b03851603611361575f611312846127106122a9565b61131e6127108b612273565b611328919061228a565b90505f611334826113f4565b9050611342836127106122a9565b61134e61271083612273565b611358919061228a565b965050506113b9565b5f61136e846127106122a9565b61137a6127108b612273565b611384919061228a565b90505f611390826109b3565b905061139e846127106122a9565b6113aa61271083612273565b6113b4919061228a565b965050505b505050509392505050565b606060048054610932906122bc565b5f6113df848484611c04565b949350505050565b5f33610a21818585611af5565b5f806002545f1461142757600254670de0b6b3a7640000600b546114189190612273565b611422919061228a565b61142f565b6509184e72a0005b905080610a03670de0b6b3a764000085612273565b6007546001600160a01b0316331461146f57604051630636a15760e11b815260040160405180910390fd5b6007805460ff60a01b1916600160a01b17905560405130907f4f0f085b63912ac6b8aebbd52cd6afde1dc2091bb7ebaabf1baf300237bff27d906114b69042815260200190565b60405180910390a25f836001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611507576040519150601f19603f3d011682016040523d82523d5f602084013e61150c565b606091505b505090508061152e576040516341688c3b60e11b815260040160405180910390fd5b5f61271060075f9054906101000a90046001600160a01b03166001600160a01b031663a512583a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611582573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a69190612248565b6002546115b39190612273565b6115bd919061228a565b90505f6127106115cd8584612273565b6115d7919061228a565b90505f6127106115e78785612273565b6115f1919061228a565b90505f816115ff84866122a9565b61160991906122a9565b600754909150611622906001600160a01b031682611b52565b61163d6116376005546001600160a01b031690565b84611b52565b6116478883611b52565b6006546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa15801561168d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190612248565b60065460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303815f875af1158015611705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117299190612307565b506007546040516311d0decd60e11b815260048101879052602481018390526001600160a01b038b81166044830152909116906323a1bd9a906064015f604051808303815f87803b15801561177c575f80fd5b505af115801561178e573d5f803e3d5ffd5b5050505061179b5f611bb3565b60405142815230907fc09feda7adb0a8bbe69c92dbe769d478537a966979f11dff2dda8bc034dba19d9060200160405180910390a2505050505050505050565b6117e3611b86565b6001600160a01b03811661181157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61181a81611bb3565b50565b611825611b86565b34156118905760065f9054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611878575f80fd5b505af115801561188a573d5f803e3d5ffd5b50505050505b61113c611a07565b6118a58383836001611ce5565b505050565b6001600160a01b0382166118d357604051634b637e8f60e11b81525f6004820152602401611808565b6118de825f83611db7565b5050565b600654604051632e1a7d4d60e01b8152600481018390526001600160a01b0390911690632e1a7d4d906024015f604051808303815f87803b158015611925575f80fd5b505af1158015611937573d5f803e3d5ffd5b505050505f8060075f9054906101000a90046001600160a01b03166001600160a01b031663caf6cbd56040518163ffffffff1660e01b8152600401606060405180830381865afa15801561198d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b19190612326565b9250509150816001600160a01b03166108fc61271083866119d29190612273565b6119dc919061228a565b6040518115909202915f818181858888f19350505050158015611a01573d5f803e3d5ffd5b50505050565b6006546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a719190612248565b600b55600254600c5542600d55565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114611a015781811015611ae757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611808565b611a0184848484035f611ce5565b6001600160a01b038316611b1e57604051634b637e8f60e11b81525f6004820152602401611808565b6001600160a01b038216611b475760405163ec442f0560e01b81525f6004820152602401611808565b6118a5838383611db7565b6001600160a01b038216611b7b5760405163ec442f0560e01b81525f6004820152602401611808565b6118de5f8383611db7565b6005546001600160a01b0316331461113c5760405163118cdaa760e01b8152336004820152602401611808565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f306001600160a01b03841603611c1c57505f610a0d565b60075460405163752e068b60e11b81526001600160a01b03868116600483015285811660248301525f92839291169063ea5c0d16906044016040805180830381865afa158015611c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c92919061235a565b9092509050612710611ca48386612273565b611cae919061228a565b611cb890846122f4565b9250612710611cc78286612273565b611cd1919061228a565b611cdb90846122f4565b9695505050505050565b6001600160a01b038416611d0e5760405163e602df0560e01b81525f6004820152602401611808565b6001600160a01b038316611d3757604051634a1406b160e11b81525f6004820152602401611808565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015611a0157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611da991815260200190565b60405180910390a350505050565b6007545f90600160a01b900460ff16611de757611dd5848484611c04565b90508015611de757611de78482611f09565b5f611df282846122a9565b90506001600160a01b038516611e1e578060025f828254611e1391906122f4565b90915550611e8e9050565b6001600160a01b0385165f9081526020819052604090205481811015611e705760405163391434e360e21b81526001600160a01b03871660048201526024810182905260448101839052606401611808565b6001600160a01b0386165f9081526020819052604090209082900390555b6001600160a01b038416611eaa57600280548290039055611ec8565b6001600160a01b0384165f9081526020819052604090208054820190555b836001600160a01b0316856001600160a01b03165f8051602061237d83398151915283604051611efa91815260200190565b60405180910390a35050505050565b306001600160a01b03831615611fd8576001600160a01b0383165f9081526020819052604081208054849290611f409084906122a9565b925050819055508160025f828254611f5891906122a9565b92505081905550806001600160a01b0316836001600160a01b03165f8051602061237d83398151915284604051611f9191815260200190565b60405180910390a3826001600160a01b0316816001600160a01b03165f8051602061237d83398151915284604051611fcb91815260200190565b60405180910390a3505050565b6040518281526001600160a01b038216905f905f8051602061237d8339815191529060200160405180910390a36040518281525f906001600160a01b038316905f8051602061237d83398151915290602001611fcb565b6001600160a01b038116811461181a575f80fd5b5f805f805f60808688031215612057575f80fd5b853594506020860135935060408601356120708161202f565b9250606086013567ffffffffffffffff8082111561208c575f80fd5b818801915088601f83011261209f575f80fd5b8135818111156120ad575f80fd5b8960208285010111156120be575f80fd5b9699959850939650602001949392505050565b5f805f606084860312156120e3575f80fd5b505081359360208301359350604090920135919050565b5f6020808352835180828501525f5b8181101561212557858101830151858201604001528201612109565b505f604082860101526040601f19601f8301168501019250505092915050565b5f60208284031215612155575f80fd5b5035919050565b5f806040838503121561216d575f80fd5b82356121788161202f565b946020939093013593505050565b5f805f60608486031215612198575f80fd5b83356121a38161202f565b925060208401356121b38161202f565b929592945050506040919091013590565b5f602082840312156121d4575f80fd5b8135610a0d8161202f565b5f805f606084860312156121f1575f80fd5b83356121fc8161202f565b95602085013595506040909401359392505050565b5f8060408385031215612222575f80fd5b823561222d8161202f565b9150602083013561223d8161202f565b809150509250929050565b5f60208284031215612258575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a2757610a2761225f565b5f826122a457634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610a2757610a2761225f565b600181811c908216806122d057607f821691505b6020821081036122ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b80820180821115610a2757610a2761225f565b5f60208284031215612317575f80fd5b81518015158114610a0d575f80fd5b5f805f60608486031215612338575f80fd5b83516123438161202f565b602085015160409095015190969495509392505050565b5f806040838503121561236b575f80fd5b50508051602090910151909290915056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207f4bd5f13f1dda29a14528faa154e86d1177ed559a0e816613d7f973664aa12d64736f6c63430008140033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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