ETH Price: $3,464.43 (+0.26%)
Gas: 10 Gwei

Contract

0xC929bA60ef82fE55De3bC848dd9453B3b12a0c30
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Release Seed203282392024-07-17 19:08:3517 hrs ago1721243315IN
0xC929bA60...3b12a0c30
0 ETH0.000850338.04970827
Release Wl203245732024-07-17 6:51:5929 hrs ago1721199119IN
0xC929bA60...3b12a0c30
0 ETH0.000587728.10883479
Release Seed203152232024-07-15 23:34:592 days ago1721086499IN
0xC929bA60...3b12a0c30
0 ETH0.00043086.03063613
Release Seed203152222024-07-15 23:34:472 days ago1721086487IN
0xC929bA60...3b12a0c30
0 ETH0.000426075.96445871
Release Seed203152202024-07-15 23:34:232 days ago1721086463IN
0xC929bA60...3b12a0c30
0 ETH0.000398365.57651866
Release Seed203133772024-07-15 17:23:232 days ago1721064203IN
0xC929bA60...3b12a0c30
0 ETH0.0020624428.87128303
Release Seed203133762024-07-15 17:23:112 days ago1721064191IN
0xC929bA60...3b12a0c30
0 ETH0.0019182826.85325189
Release Seed203133762024-07-15 17:23:112 days ago1721064191IN
0xC929bA60...3b12a0c30
0 ETH0.0019182826.85325189
Release Seed203133742024-07-15 17:22:472 days ago1721064167IN
0xC929bA60...3b12a0c30
0 ETH0.0025856429.204458
Release Seed203118712024-07-15 12:20:112 days ago1721046011IN
0xC929bA60...3b12a0c30
0 ETH0.000295263.33491884
Release Wl203116212024-07-15 11:29:593 days ago1721042999IN
0xC929bA60...3b12a0c30
0 ETH0.00021983.03261231
Release Seed203105632024-07-15 7:56:593 days ago1721030219IN
0xC929bA60...3b12a0c30
0 ETH0.000387454.37624296
Release Seed203070372024-07-14 20:09:353 days ago1720987775IN
0xC929bA60...3b12a0c30
0 ETH0.000255763.58039487
Release Seed203070342024-07-14 20:08:593 days ago1720987739IN
0xC929bA60...3b12a0c30
0 ETH0.000320693.62223703
Release Seed203025562024-07-14 5:08:594 days ago1720933739IN
0xC929bA60...3b12a0c30
0 ETH0.000189472.652414
Release Seed202922892024-07-12 18:42:475 days ago1720809767IN
0xC929bA60...3b12a0c30
0 ETH0.00028772.72356565
Release Wl202860572024-07-11 21:48:596 days ago1720734539IN
0xC929bA60...3b12a0c30
0 ETH0.00026173.61075917
Release Wl202860542024-07-11 21:48:236 days ago1720734503IN
0xC929bA60...3b12a0c30
0 ETH0.000294684.06513414
Release Wl202860532024-07-11 21:48:116 days ago1720734491IN
0xC929bA60...3b12a0c30
0 ETH0.000279863.86064439
Release Wl202860512024-07-11 21:47:476 days ago1720734467IN
0xC929bA60...3b12a0c30
0 ETH0.000286723.95600207
Release Wl202860462024-07-11 21:46:476 days ago1720734407IN
0xC929bA60...3b12a0c30
0 ETH0.000281263.88000168
Release Seed202813452024-07-11 6:03:117 days ago1720677791IN
0xC929bA60...3b12a0c30
0 ETH0.000151392.11927144
Release Ibo202790392024-07-10 22:19:117 days ago1720649951IN
0xC929bA60...3b12a0c30
0 ETH0.000654036.39791829
Release Ibo202790312024-07-10 22:17:357 days ago1720649855IN
0xC929bA60...3b12a0c30
0 ETH0.000608125.94872221
Release Seed202772352024-07-10 16:16:477 days ago1720628207IN
0xC929bA60...3b12a0c30
0 ETH0.0010715415
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VestingCvg

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 250 runs

Other Settings:
default evmVersion
File 1 of 11 : VestingCvg.sol
// SPDX-License-Identifier: MIT
/**
 _____
/  __ \
| /  \/ ___  _ ____   _____ _ __ __ _  ___ _ __   ___ ___
| |    / _ \| '_ \ \ / / _ \ '__/ _` |/ _ \ '_ \ / __/ _ \
| \__/\ (_) | | | \ V /  __/ | | (_| |  __/ | | | (_|  __/
 \____/\___/|_| |_|\_/ \___|_|  \__, |\___|_| |_|\___\___|
                                 __/ |
                                |___/
 */
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable2Step.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "../interfaces/IPresaleCvgWl.sol";
import "../interfaces/IPresaleCvgSeed.sol";
import "../interfaces/IboInterface.sol";

contract VestingCvg is Ownable2Step {
    /// @dev Enum about vesting types
    enum VestingType {
        SEED,
        WL,
        IBO,
        TEAM,
        DAO
    }
    /// @dev Enum about the state of the vesting
    enum State {
        NOT_ACTIVE,
        SET,
        OPEN
    }
    /// @dev Struct Info about VestingSchedules
    struct VestingSchedule {
        uint80 daysBeforeCliff;
        uint80 daysAfterCliff;
        uint96 dropCliff;
        uint256 totalAmount;
        uint256 totalReleased;
    }
    struct InfoVestingTokenId {
        uint256 amountReleasable;
        uint256 totalCvg;
        uint256 amountRedeemed;
    }
    /// @dev Max supply TEAM & DAO
    uint256 public constant MAX_SUPPLY_TEAM = 12_750_000 * 10 ** 18;
    uint256 public constant MAX_SUPPLY_DAO = 14_250_000 * 10 ** 18;

    uint256 public constant ONE_DAY = 1 days;
    uint256 public constant ONE_GWEI = 10 ** 9;

    State public state;

    IPresaleCvgWl public presaleWl;
    IPresaleCvgSeed public presaleSeed;
    IboInterface public ibo;
    IERC20 public cvg;

    address public whitelistedTeam;
    address public whitelistedDao;

    /// @dev Timestamp shared between all vestingSchedules to mark the beginning of the vesting
    uint256 public startTimestamp;

    /// @dev VestingType associated to the vesting schedule info
    mapping(VestingType => VestingSchedule) public vestingSchedules;

    mapping(uint256 => uint256) public amountReleasedIdSeed; // tokenId => amountReleased
    mapping(uint256 => uint256) public amountReleasedIdWl; // tokenId => amountReleased
    mapping(uint256 => uint256) public amountReleasedIdIbo; // tokenId => amountReleased

    constructor(IPresaleCvgWl _presaleWl, IPresaleCvgSeed _presaleSeed, IboInterface _ibo) {
        presaleWl = _presaleWl;
        presaleSeed = _presaleSeed;
        ibo = _ibo;
    }

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

    modifier onlyOwnerOfSeed(uint256 _tokenId) {
        require(presaleSeed.ownerOf(_tokenId) == msg.sender, "NOT_OWNED");
        _;
    }

    modifier onlyOwnerOfWl(uint256 _tokenId) {
        require(presaleWl.ownerOf(_tokenId) == msg.sender, "NOT_OWNED");
        _;
    }

    modifier onlyOwnerOfIbo(uint256 _tokenId) {
        require(ibo.ownerOf(_tokenId) == msg.sender, "NOT_OWNED");
        _;
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            SETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */

    function setWhitelistTeam(address newWhitelistedTeam) external onlyOwner {
        whitelistedTeam = newWhitelistedTeam;
    }

    function setWhitelistDao(address newWhitelistedDao) external onlyOwner {
        whitelistedDao = newWhitelistedDao;
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            GETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */

    function getTotalReleasedScheduleId(VestingType _vestingType) external view returns (uint256) {
        return (vestingSchedules[_vestingType].totalReleased);
    }

    function getInfoVestingTokenId(
        uint256 _tokenId,
        VestingType _vestingType
    ) external view returns (InfoVestingTokenId memory) {
        (uint256 amountReleasable, uint256 totalCvg, uint256 amountRedeemed) = _computeReleaseAmount(
            _tokenId,
            _vestingType
        );
        return
            InfoVestingTokenId({
                amountReleasable: amountReleasable,
                totalCvg: totalCvg,
                amountRedeemed: amountRedeemed
            });
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            EXTERNALS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    /// @notice Set vesting with current timestamp, creates vestingSchedules for all vesting types (only callable by owner)
    /// @dev Sum of all vesting schedule must be distributed in the contract before intializing it the vesting
    function setVesting(IERC20 _cvg) external onlyOwner {
        require(state == State.NOT_ACTIVE, "VESTING_ALREADY_SET");
        state = State.SET;

        require(
            presaleSeed.saleState() == IPresaleCvgSeed.SaleState.OVER &&
                presaleWl.saleState() == IPresaleCvgWl.SaleState.OVER,
            "PRESALE_ROUND_NOT_FINISHED"
        );

        startTimestamp = block.timestamp;

        /// @dev SEED SCHEDULE
        uint256 seedAmount = presaleSeed.getTotalCvg();
        vestingSchedules[VestingType.SEED] = VestingSchedule({
            totalAmount: seedAmount,
            totalReleased: 0,
            daysBeforeCliff: 4 * 30,
            daysAfterCliff: 15 * 30,
            dropCliff: 50
        });

        /// @dev WL SCHEDULE
        uint256 wlAmount = presaleWl.MAX_SUPPLY_PRESALE();
        vestingSchedules[VestingType.WL] = VestingSchedule({
            totalAmount: wlAmount,
            totalReleased: 0,
            daysBeforeCliff: 0,
            daysAfterCliff: 3 * 30,
            dropCliff: 330
        });

        /// @dev IBO SCHEDULE
        uint256 iboAmount = ibo.getTotalCvgDue();
        vestingSchedules[VestingType.IBO] = VestingSchedule({
            totalAmount: iboAmount,
            totalReleased: 0,
            daysBeforeCliff: 0,
            daysAfterCliff: 2 * 30,
            dropCliff: 0
        });

        /// @dev TEAM SCHEDULE
        uint256 teamAmount = MAX_SUPPLY_TEAM;
        vestingSchedules[VestingType.TEAM] = VestingSchedule({
            totalAmount: teamAmount,
            totalReleased: 0,
            daysBeforeCliff: 180,
            daysAfterCliff: 18 * 30,
            dropCliff: 50
        });

        /// @dev DAO SCHEDULE
        uint256 daoAmount = MAX_SUPPLY_DAO;
        vestingSchedules[VestingType.DAO] = VestingSchedule({
            totalAmount: daoAmount,
            totalReleased: 0,
            daysBeforeCliff: 0,
            daysAfterCliff: 18 * 30,
            dropCliff: 50
        });

        require(address(_cvg) != address(0), "CVG_ZERO");
        cvg = _cvg;
        require(
            _cvg.balanceOf(address(this)) >= seedAmount + wlAmount + iboAmount + teamAmount + daoAmount,
            "NOT_ENOUGH_CVG"
        );
    }

    /// @notice Open vesting for all
    function openVesting() external onlyOwner {
        require(state == State.SET, "VESTING_ALREADY_OPENED");
        state = State.OPEN;
    }

    /**
     * @notice Release CVG token available for SEED nft owner
     * @param _tokenId token Id SEED
     */
    function releaseSeed(uint256 _tokenId) external onlyOwnerOfSeed(_tokenId) {
        require(state == State.OPEN, "VESTING_NOT_OPEN");
        (uint256 amountToRelease, , ) = _computeReleaseAmount(_tokenId, VestingType.SEED);
        require(amountToRelease != 0, "NOT_RELEASABLE");

        //update totalReleased & amountReleasedId
        vestingSchedules[VestingType.SEED].totalReleased += amountToRelease;

        amountReleasedIdSeed[_tokenId] += amountToRelease;

        //transfer Cvg amount to release
        cvg.transfer(msg.sender, amountToRelease);
    }

    /**
     * @notice Release CVG token available for WL nft owner
     * @param _tokenId token Id WL
     */
    function releaseWl(uint256 _tokenId) external onlyOwnerOfWl(_tokenId) {
        require(state == State.OPEN, "VESTING_NOT_OPEN");
        (uint256 amountToRelease, , ) = _computeReleaseAmount(_tokenId, VestingType.WL);
        require(amountToRelease != 0, "NOT_RELEASABLE");

        //update totalReleased & amountReleasedIdSeed
        vestingSchedules[VestingType.WL].totalReleased += amountToRelease;

        amountReleasedIdWl[_tokenId] += amountToRelease;

        //transfer Cvg amount to release
        cvg.transfer(msg.sender, amountToRelease);
    }

    /**
     * @notice Release CVG token available for IBO nft owner
     * @param _tokenId token Id IBO
     */
    function releaseIbo(uint256 _tokenId) external onlyOwnerOfIbo(_tokenId) {
        require(state == State.OPEN, "VESTING_NOT_OPEN");
        (uint256 amountToRelease, , ) = _computeReleaseAmount(_tokenId, VestingType.IBO);
        require(amountToRelease != 0, "NOT_RELEASABLE");

        //update totalReleased & amountReleasedIdSeed
        vestingSchedules[VestingType.IBO].totalReleased += amountToRelease;

        amountReleasedIdIbo[_tokenId] += amountToRelease;

        //transfer Cvg amount to release
        cvg.transfer(msg.sender, amountToRelease);
    }

    /// @notice Release CVG token available for whitelisted address TEAM or DAO
    function releaseTeamOrDao(bool _isTeam) external {
        uint256 amountToRelease;
        VestingType _vestingType;

        if (_isTeam) {
            require(msg.sender == whitelistedTeam, "NOT_TEAM");
            _vestingType = VestingType.TEAM;
        } else {
            require(msg.sender == whitelistedDao, "NOT_DAO");
            _vestingType = VestingType.DAO;
        }

        (amountToRelease, , ) = _computeReleaseAmount(0, _vestingType);
        require(amountToRelease != 0, "NOT_RELEASABLE");

        vestingSchedules[_vestingType].totalReleased += amountToRelease;

        /// @dev transfer Cvg amount to release
        cvg.transfer(msg.sender, amountToRelease);
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            INTERNALS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */

    function _computeReleaseAmount(
        uint256 _tokenId,
        VestingType _vestingType
    ) internal view returns (uint256 amountToRelease, uint256 totalAmount, uint256 totalAmountReleased) {
        if (_vestingType == VestingType.SEED) {
            totalAmountReleased = amountReleasedIdSeed[_tokenId];
            totalAmount = presaleSeed.presaleInfoTokenId(_tokenId).cvgAmount;
        } else if (_vestingType == VestingType.WL) {
            totalAmountReleased = amountReleasedIdWl[_tokenId];
            totalAmount = presaleWl.presaleInfos(_tokenId).cvgAmount;
        } else if (_vestingType == VestingType.IBO) {
            totalAmountReleased = amountReleasedIdIbo[_tokenId];
            totalAmount = ibo.totalCvgPerToken(_tokenId);
        } else if (_vestingType == VestingType.TEAM) {
            totalAmountReleased = vestingSchedules[_vestingType].totalReleased;
            totalAmount = MAX_SUPPLY_TEAM;
        } else {
            totalAmountReleased = vestingSchedules[_vestingType].totalReleased;
            totalAmount = MAX_SUPPLY_DAO;
        }

        amountToRelease = _calculateRelease(_vestingType, totalAmount, totalAmountReleased);
    }

    /**
     * @dev Calculate the releasable amount in function of the vestingSchedule params, the total amount vested for a tokenId
     * and the total amount already released. Calculated linearly between cliff release and the end of the vesting.
     */
    function _calculateRelease(
        VestingType vestingType,
        uint256 totalAmount,
        uint256 totalAmountReleased
    ) private view returns (uint256 amountToRelease) {
        uint256 cliffTimestamp = startTimestamp + vestingSchedules[vestingType].daysBeforeCliff * ONE_DAY;

        uint256 endVestingTimestamp = cliffTimestamp + vestingSchedules[vestingType].daysAfterCliff * ONE_DAY;

        if (block.timestamp > cliffTimestamp) {
            if (block.timestamp > endVestingTimestamp) {
                amountToRelease = totalAmount - totalAmountReleased;
            } else {
                uint256 ratio = ((endVestingTimestamp - block.timestamp) * ONE_GWEI) /
                    (endVestingTimestamp - cliffTimestamp);

                uint256 amountDroppedAtCliff = (totalAmount * vestingSchedules[vestingType].dropCliff) / 1000;

                uint256 totalAmountAfterCliff = totalAmount - amountDroppedAtCliff;

                amountToRelease =
                    amountDroppedAtCliff +
                    (((ONE_GWEI - ratio) * totalAmountAfterCliff) / ONE_GWEI) -
                    totalAmountReleased;
            }
        }
    }
}

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

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

File 3 of 11 : Ownable2Step.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

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

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

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

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

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

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 5 of 11 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 6 of 11 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 7 of 11 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 11 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 11 : IboInterface.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

interface IboInterface is IERC721Enumerable {
    function totalCvgPerToken(uint256 tokenId) external view returns (uint256);

    function iboStartTimestamp() external view returns (uint256);

    function getTokenIdsForWallet(address _wallet) external view returns (uint256[] memory);

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

File 10 of 11 : IPresaleCvgSeed.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

interface IPresaleCvgSeed is IERC721Enumerable {
    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            ENUMS & STRUCTS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    enum SaleState {
        NOT_ACTIVE,
        PRESEED,
        SEED,
        OVER
    }

    struct PresaleInfo {
        uint256 vestingType; // Define the presaler type
        uint256 cvgAmount; // Total CVG amount claimable for the nft owner
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            SETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function setSaleState(SaleState _saleState) external;

    function grantPreseed(address _wallet, uint256 _amount) external;

    function grantSeed(address _wallet, uint256 _amount) external;

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            EXTERNALS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function investMint(bool _isDai) external;

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            GETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function presaleInfoTokenId(uint256 _tokenId) external view returns (PresaleInfo memory);

    function saleState() external view returns (SaleState);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view override returns (uint256);

    function getTokenIdAndType(
        address _wallet,
        uint256 _index
    ) external view returns (uint256 tokenId, uint256 typeVesting);

    function getTokenIdsForWallet(address _wallet) external view returns (uint256[] memory);

    function getTotalCvg() external view returns (uint256);

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                        WITHDRAW OWNER
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function withdrawFunds() external;

    function withdrawToken(address _token) external;
}

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

import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";

interface IPresaleCvgWl is IERC721Enumerable {
    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            ENUMS & STRUCTS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    enum SaleState {
        NOT_ACTIVE,
        WL,
        OVER
    }

    struct PresaleInfo {
        uint256 vestingType;
        uint256 cvgAmount;
    }

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            SETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function setSaleState(SaleState _saleState) external;

    function setMerkleRootWlS(bytes32 _newMerkleRootWlS) external;

    function setMerkleRootWlM(bytes32 _newMerkleRootWlM) external;

    function setMerkleRootWlL(bytes32 _newMerkleRootWlL) external;

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            EXTERNALS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function investMint(bytes32[] calldata _merkleProof, uint256 _amount) external;

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                            GETTERS
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function presaleInfos(uint256 _tokenId) external view returns (PresaleInfo memory);

    function getAmountCvgForVesting() external view returns (uint256);

    function getTotalCvg() external view returns (uint256);

    function saleState() external view returns (SaleState);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view override returns (uint256);

    function getTokenIdAndType(
        address _wallet,
        uint256 _index
    ) external view returns (uint256 tokenId, uint256 typeVesting);

    function getTokenIdsForWallet(address _wallet) external view returns (uint256[] memory);

    function MAX_SUPPLY_PRESALE() external view returns (uint256);

    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=
                        WITHDRAW OWNER
    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */
    function withdrawFunds() external;

    function withdrawToken(address _token) external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IPresaleCvgWl","name":"_presaleWl","type":"address"},{"internalType":"contract IPresaleCvgSeed","name":"_presaleSeed","type":"address"},{"internalType":"contract IboInterface","name":"_ibo","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"MAX_SUPPLY_DAO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_TEAM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_GWEI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amountReleasedIdIbo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amountReleasedIdSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amountReleasedIdWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvg","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"enum VestingCvg.VestingType","name":"_vestingType","type":"uint8"}],"name":"getInfoVestingTokenId","outputs":[{"components":[{"internalType":"uint256","name":"amountReleasable","type":"uint256"},{"internalType":"uint256","name":"totalCvg","type":"uint256"},{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"internalType":"struct VestingCvg.InfoVestingTokenId","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum VestingCvg.VestingType","name":"_vestingType","type":"uint8"}],"name":"getTotalReleasedScheduleId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ibo","outputs":[{"internalType":"contract IboInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSeed","outputs":[{"internalType":"contract IPresaleCvgSeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleWl","outputs":[{"internalType":"contract IPresaleCvgWl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"releaseIbo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"releaseSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isTeam","type":"bool"}],"name":"releaseTeamOrDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"releaseWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_cvg","type":"address"}],"name":"setVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWhitelistedDao","type":"address"}],"name":"setWhitelistDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWhitelistedTeam","type":"address"}],"name":"setWhitelistTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum VestingCvg.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum VestingCvg.VestingType","name":"","type":"uint8"}],"name":"vestingSchedules","outputs":[{"internalType":"uint80","name":"daysBeforeCliff","type":"uint80"},{"internalType":"uint80","name":"daysAfterCliff","type":"uint80"},{"internalType":"uint96","name":"dropCliff","type":"uint96"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"totalReleased","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedDao","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedTeam","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200203d3803806200203d833981016040819052620000349162000112565b6200003f3362000082565b600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905562000166565b600180546001600160a01b0319169055620000a981620000ac602090811b620016da17901c565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620000a957600080fd5b6000806000606084860312156200012857600080fd5b83516200013581620000fc565b60208501519093506200014881620000fc565b60408501519092506200015b81620000fc565b809150509250925092565b611ec780620001766000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806391fa50cc1161010f578063d8e6f063116100a2578063f0130f3911610071578063f0130f39146104af578063f2fde38b146104c2578063f8ff27ca146104d5578063fdc66991146104e857600080fd5b8063d8e6f0631461046f578063e1e2da2014610482578063e30c397814610495578063e6fd48bc146104a657600080fd5b8063c73cdb3d116100de578063c73cdb3d14610418578063ce51b7b21461042a578063d480fdad1461043c578063d73626df1461045c57600080fd5b806391fa50cc1461033c57806398998b3e1461034f578063b4a0dc0114610362578063c19d93fb146103f757600080fd5b80635c94cb1f11610187578063715018a611610156578063715018a61461031157806379ba509714610319578063863e76db146103215780638da5cb5b1461032b57600080fd5b80635c94cb1f146102cb57806363cb7b6c146102d6578063671cf8f3146102de5780636f6ff3bc146102fe57600080fd5b806339209df0116101c357806339209df01461025d5780633f64a6ee14610270578063493aadfa146102835780635a005887146102b857600080fd5b806312cb9668146101ea5780631e51daee1461021d578063333ef44514610232575b600080fd5b61020a6101f8366004611bd0565b600c6020526000908152604090205481565b6040519081526020015b60405180910390f35b61023061022b366004611bf7565b6104fb565b005b600754610245906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b600454610245906001600160a01b031681565b600554610245906001600160a01b031681565b610296610291366004611c2f565b610698565b6040805182518152602080840151908201529181015190820152606001610214565b6102306102c6366004611bd0565b6106f0565b61020a633b9aca0081565b6102306108ce565b61020a6102ec366004611bd0565b600a6020526000908152604090205481565b61023061030c366004611c70565b610957565b6102306111ff565b610230611213565b61020a6201518081565b6000546001600160a01b0316610245565b61023061034a366004611bd0565b61128d565b61023061035d366004611bd0565b611431565b6103b6610370366004611c8d565b6009602052600090815260409020805460018201546002909201546001600160501b0380831693600160501b840490911692600160a01b90046001600160601b03169185565b604080516001600160501b0396871681529590941660208601526001600160601b03909216928401929092526060830191909152608082015260a001610214565b60015461040b90600160a01b900460ff1681565b6040516102149190611cbe565b61020a6a0a8beae28cb4d5c4c0000081565b61020a6a0bc98e0c42e83a3640000081565b61020a61044a366004611bd0565b600b6020526000908152604090205481565b600654610245906001600160a01b031681565b61020a61047d366004611c8d565b6115d3565b610230610490366004611c70565b611615565b6001546001600160a01b0316610245565b61020a60085481565b600254610245906001600160a01b031681565b6102306104d0366004611c70565b61163f565b6102306104e3366004611c70565b6116b0565b600354610245906001600160a01b031681565b6000808215610556576006546001600160a01b0316331461054e5760405162461bcd60e51b81526020600482015260086024820152674e4f545f5445414d60c01b60448201526064015b60405180910390fd5b50600361059e565b6007546001600160a01b0316331461059a5760405162461bcd60e51b81526020600482015260076024820152664e4f545f44414f60c81b6044820152606401610545565b5060045b6105a960008261172a565b509092505060008290036105cf5760405162461bcd60e51b815260040161054590611ce6565b81600960008360048111156105e6576105e6611ca8565b60048111156105f7576105f7611ca8565b815260200190815260200160002060020160008282546106179190611d24565b909155505060055460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044015b6020604051808303816000875af115801561066e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106929190611d37565b50505050565b6106bc60405180606001604052806000815260200160008152602001600081525090565b60008060006106cb868661172a565b6040805160608101825293845260208401929092529082015293505050505b92915050565b600480546040516331a9108f60e11b8152918201839052829133916001600160a01b031690636352211e90602401602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f9190611d54565b6001600160a01b0316146107a15760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff1660028111156107c1576107c1611ca8565b146108015760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b600061080e83600261172a565b50509050806000036108325760405162461bcd60e51b815260040161054590611ce6565b6002600090815260096020527f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c5805483929061086f908490611d24565b90915550506000838152600c602052604081208054839290610892908490611d24565b909155505060055460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb9060440161064f565b6108d661198d565b60018054600160a01b900460ff1660028111156108f5576108f5611ca8565b146109425760405162461bcd60e51b815260206004820152601660248201527f56455354494e475f414c52454144595f4f50454e4544000000000000000000006044820152606401610545565b6001805460ff60a01b1916600160a11b179055565b61095f61198d565b6000600154600160a01b900460ff16600281111561097f5761097f611ca8565b146109c25760405162461bcd60e51b8152602060048201526013602482015272159154d5125391d7d053149150511657d4d155606a1b6044820152606401610545565b6001805460ff60a01b1916600160a01b179055600380546040805163301fa6a960e11b815290516001600160a01b039092169163603f4d52916004808201926020929091908290030181865afa158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a449190611d71565b6003811115610a5557610a55611ca8565b148015610ae8575060028060009054906101000a90046001600160a01b03166001600160a01b031663603f4d526040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190611d92565b6002811115610ae657610ae6611ca8565b145b610b345760405162461bcd60e51b815260206004820152601a60248201527f50524553414c455f524f554e445f4e4f545f46494e49534845440000000000006044820152606401610545565b426008556003546040805163d14f2ff160e01b815290516000926001600160a01b03169163d14f2ff19160048083019260209291908290030181865afa158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190611db3565b6040805160a081018252607881526101c260208083019182526032838501908152606084018681526000608086018181528180526009855295517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b8054965194516001600160601b0316600160a01b026001600160a01b036001600160501b03968716600160501b026001600160a01b0319909916969093169590951796909617811693909317909455517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c5592517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d55600254845163abcae5d560e01b815294519596509194919092169263abcae5d59260048083019391928290030181865afa158015610cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfd9190611db3565b6040805160a0810182526000808252605a602080840191825261014a8486019081526060850187815260808601858152600186526009845295517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a368054955193516001600160601b0316600160a01b026001600160a01b036001600160501b03958616600160501b026001600160a01b031990981695909316949094179590951781169290921790935591517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a375592517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a38556004805485516349906b1f60e11b8152955196975092959290911693639320d63e9381830193909290918290030181865afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190611db3565b6040805160a080820183526000808352603c60208085019182528486018381526060808701898152608080890187815260028852600980875299517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054985196516001600160601b0316600160a01b026001600160a01b036001600160501b03988916600160501b026001600160a01b0319909b169890931697909717989098171694909417909555517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c45590517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c5558651948501875260b4855261021c918501919091526032958401959095526a0a8beae28cb4d5c4c000009483018590528201819052939450919260038152602080820192909252604090810160009081208451815486860151878601516001600160601b0316600160a01b026001600160a01b036001600160501b03928316600160501b026001600160a01b0319909416929094169190911791909117919091161781556060808601516001830155608095860151600290920191909155825160a08101845282815261021c948101949094526032928401929092526a0bc98e0c42e83a364000009183018290529282018390529160099060048081111561105157611051611ca8565b815260208082019290925260409081016000208351815493850151928501516001600160601b0316600160a01b026001600160a01b036001600160501b03948516600160501b026001600160a01b0319909616949092169390931793909317831691909117815560608301516001820155608090920151600290920191909155861661110a5760405162461bcd60e51b81526020600482015260086024820152674356475f5a45524f60c01b6044820152606401610545565b600580546001600160a01b0319166001600160a01b0388161790558082846111328789611d24565b61113c9190611d24565b6111469190611d24565b6111509190611d24565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190611db3565b10156111f75760405162461bcd60e51b815260206004820152600e60248201526d4e4f545f454e4f5547485f43564760901b6044820152606401610545565b505050505050565b61120761198d565b61121160006119e7565b565b60015433906001600160a01b031681146112815760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610545565b61128a816119e7565b50565b6002546040516331a9108f60e11b815260048101839052829133916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156112da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fe9190611d54565b6001600160a01b0316146113405760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff16600281111561136057611360611ca8565b146113a05760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b60006113ad83600161172a565b50509050806000036113d15760405162461bcd60e51b815260040161054590611ce6565b6001600090815260096020527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a38805483929061140e908490611d24565b90915550506000838152600b602052604081208054839290610892908490611d24565b6003546040516331a9108f60e11b815260048101839052829133916001600160a01b0390911690636352211e90602401602060405180830381865afa15801561147e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a29190611d54565b6001600160a01b0316146114e45760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff16600281111561150457611504611ca8565b146115445760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b600061155183600061172a565b50509050806000036115755760405162461bcd60e51b815260040161054590611ce6565b600080805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d80548392906115b0908490611d24565b90915550506000838152600a602052604081208054839290610892908490611d24565b6000600960008360048111156115eb576115eb611ca8565b60048111156115fc576115fc611ca8565b8152602001908152602001600020600201549050919050565b61161d61198d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61164761198d565b600180546001600160a01b0383166001600160a01b031990911681179091556116786000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6116b861198d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080808084600481111561174157611741611ca8565b036117cf57506000848152600a602052604090819020546003549151635979d73d60e11b81526004810187905290916001600160a01b03169063b2f3ae7a906024015b6040805180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c49190611e29565b602001519150611979565b60018460048111156117e3576117e3611ca8565b0361182a57506000848152600b60205260409081902054600254915163afa1c81160e01b81526004810187905290916001600160a01b03169063afa1c81190602401611784565b600284600481111561183e5761183e611ca8565b036118c857506000848152600c60205260409081902054600480549251632a45731360e21b815290810187905290916001600160a01b03169063a915cc4c90602401602060405180830381865afa15801561189d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c19190611db3565b9150611979565b60038460048111156118dc576118dc611ca8565b0361192f57600960008560048111156118f7576118f7611ca8565b600481111561190857611908611ca8565b81526020019081526020016000206002015490506a0a8beae28cb4d5c4c000009150611979565b6009600085600481111561194557611945611ca8565b600481111561195657611956611ca8565b81526020019081526020016000206002015490506a0bc98e0c42e83a3640000091505b611984848383611a00565b92509250925092565b6000546001600160a01b031633146112115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610545565b600180546001600160a01b031916905561128a816116da565b6000806201518060096000876004811115611a1d57611a1d611ca8565b6004811115611a2e57611a2e611ca8565b8152602081019190915260400160002054611a5291906001600160501b0316611e45565b600854611a5f9190611d24565b905060006201518060096000886004811115611a7d57611a7d611ca8565b6004811115611a8e57611a8e611ca8565b8152602081019190915260400160002054611ab99190600160501b90046001600160501b0316611e45565b611ac39083611d24565b905081421115611bc75780421115611ae657611adf8486611e5c565b9250611bc7565b6000611af28383611e5c565b633b9aca00611b014285611e5c565b611b0b9190611e45565b611b159190611e6f565b905060006103e8600960008a6004811115611b3257611b32611ca8565b6004811115611b4357611b43611ca8565b8152602081019190915260400160002054611b6e90600160a01b90046001600160601b031689611e45565b611b789190611e6f565b90506000611b868289611e5c565b905086633b9aca0082611b998683611e5c565b611ba39190611e45565b611bad9190611e6f565b611bb79084611d24565b611bc19190611e5c565b95505050505b50509392505050565b600060208284031215611be257600080fd5b5035919050565b801515811461128a57600080fd5b600060208284031215611c0957600080fd5b8135611c1481611be9565b9392505050565b803560058110611c2a57600080fd5b919050565b60008060408385031215611c4257600080fd5b82359150611c5260208401611c1b565b90509250929050565b6001600160a01b038116811461128a57600080fd5b600060208284031215611c8257600080fd5b8135611c1481611c5b565b600060208284031215611c9f57600080fd5b611c1482611c1b565b634e487b7160e01b600052602160045260246000fd5b6020810160038310611ce057634e487b7160e01b600052602160045260246000fd5b91905290565b6020808252600e908201526d4e4f545f52454c45415341424c4560901b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156106ea576106ea611d0e565b600060208284031215611d4957600080fd5b8151611c1481611be9565b600060208284031215611d6657600080fd5b8151611c1481611c5b565b600060208284031215611d8357600080fd5b815160048110611c1457600080fd5b600060208284031215611da457600080fd5b815160038110611c1457600080fd5b600060208284031215611dc557600080fd5b5051919050565b600060408284031215611dde57600080fd5b6040516040810181811067ffffffffffffffff82111715611e0f57634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b600060408284031215611e3b57600080fd5b611c148383611dcc565b80820281158282048414176106ea576106ea611d0e565b818103818111156106ea576106ea611d0e565b600082611e8c57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220635fd3b2929731af40375d4dd52ec7820aebece709f4088960b88e7ce68ca4d764736f6c63430008110033000000000000000000000000c9740aa94a8a02a3373f5f1b493d7e10d99ae81100000000000000000000000006feb7a047e540b8d92620a2c13ec96e1ff5e19b0000000000000000000000005f02134c35449d9b6505723a56b02581356320fb

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806391fa50cc1161010f578063d8e6f063116100a2578063f0130f3911610071578063f0130f39146104af578063f2fde38b146104c2578063f8ff27ca146104d5578063fdc66991146104e857600080fd5b8063d8e6f0631461046f578063e1e2da2014610482578063e30c397814610495578063e6fd48bc146104a657600080fd5b8063c73cdb3d116100de578063c73cdb3d14610418578063ce51b7b21461042a578063d480fdad1461043c578063d73626df1461045c57600080fd5b806391fa50cc1461033c57806398998b3e1461034f578063b4a0dc0114610362578063c19d93fb146103f757600080fd5b80635c94cb1f11610187578063715018a611610156578063715018a61461031157806379ba509714610319578063863e76db146103215780638da5cb5b1461032b57600080fd5b80635c94cb1f146102cb57806363cb7b6c146102d6578063671cf8f3146102de5780636f6ff3bc146102fe57600080fd5b806339209df0116101c357806339209df01461025d5780633f64a6ee14610270578063493aadfa146102835780635a005887146102b857600080fd5b806312cb9668146101ea5780631e51daee1461021d578063333ef44514610232575b600080fd5b61020a6101f8366004611bd0565b600c6020526000908152604090205481565b6040519081526020015b60405180910390f35b61023061022b366004611bf7565b6104fb565b005b600754610245906001600160a01b031681565b6040516001600160a01b039091168152602001610214565b600454610245906001600160a01b031681565b600554610245906001600160a01b031681565b610296610291366004611c2f565b610698565b6040805182518152602080840151908201529181015190820152606001610214565b6102306102c6366004611bd0565b6106f0565b61020a633b9aca0081565b6102306108ce565b61020a6102ec366004611bd0565b600a6020526000908152604090205481565b61023061030c366004611c70565b610957565b6102306111ff565b610230611213565b61020a6201518081565b6000546001600160a01b0316610245565b61023061034a366004611bd0565b61128d565b61023061035d366004611bd0565b611431565b6103b6610370366004611c8d565b6009602052600090815260409020805460018201546002909201546001600160501b0380831693600160501b840490911692600160a01b90046001600160601b03169185565b604080516001600160501b0396871681529590941660208601526001600160601b03909216928401929092526060830191909152608082015260a001610214565b60015461040b90600160a01b900460ff1681565b6040516102149190611cbe565b61020a6a0a8beae28cb4d5c4c0000081565b61020a6a0bc98e0c42e83a3640000081565b61020a61044a366004611bd0565b600b6020526000908152604090205481565b600654610245906001600160a01b031681565b61020a61047d366004611c8d565b6115d3565b610230610490366004611c70565b611615565b6001546001600160a01b0316610245565b61020a60085481565b600254610245906001600160a01b031681565b6102306104d0366004611c70565b61163f565b6102306104e3366004611c70565b6116b0565b600354610245906001600160a01b031681565b6000808215610556576006546001600160a01b0316331461054e5760405162461bcd60e51b81526020600482015260086024820152674e4f545f5445414d60c01b60448201526064015b60405180910390fd5b50600361059e565b6007546001600160a01b0316331461059a5760405162461bcd60e51b81526020600482015260076024820152664e4f545f44414f60c81b6044820152606401610545565b5060045b6105a960008261172a565b509092505060008290036105cf5760405162461bcd60e51b815260040161054590611ce6565b81600960008360048111156105e6576105e6611ca8565b60048111156105f7576105f7611ca8565b815260200190815260200160002060020160008282546106179190611d24565b909155505060055460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044015b6020604051808303816000875af115801561066e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106929190611d37565b50505050565b6106bc60405180606001604052806000815260200160008152602001600081525090565b60008060006106cb868661172a565b6040805160608101825293845260208401929092529082015293505050505b92915050565b600480546040516331a9108f60e11b8152918201839052829133916001600160a01b031690636352211e90602401602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f9190611d54565b6001600160a01b0316146107a15760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff1660028111156107c1576107c1611ca8565b146108015760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b600061080e83600261172a565b50509050806000036108325760405162461bcd60e51b815260040161054590611ce6565b6002600090815260096020527f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c5805483929061086f908490611d24565b90915550506000838152600c602052604081208054839290610892908490611d24565b909155505060055460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb9060440161064f565b6108d661198d565b60018054600160a01b900460ff1660028111156108f5576108f5611ca8565b146109425760405162461bcd60e51b815260206004820152601660248201527f56455354494e475f414c52454144595f4f50454e4544000000000000000000006044820152606401610545565b6001805460ff60a01b1916600160a11b179055565b61095f61198d565b6000600154600160a01b900460ff16600281111561097f5761097f611ca8565b146109c25760405162461bcd60e51b8152602060048201526013602482015272159154d5125391d7d053149150511657d4d155606a1b6044820152606401610545565b6001805460ff60a01b1916600160a01b179055600380546040805163301fa6a960e11b815290516001600160a01b039092169163603f4d52916004808201926020929091908290030181865afa158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a449190611d71565b6003811115610a5557610a55611ca8565b148015610ae8575060028060009054906101000a90046001600160a01b03166001600160a01b031663603f4d526040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad59190611d92565b6002811115610ae657610ae6611ca8565b145b610b345760405162461bcd60e51b815260206004820152601a60248201527f50524553414c455f524f554e445f4e4f545f46494e49534845440000000000006044820152606401610545565b426008556003546040805163d14f2ff160e01b815290516000926001600160a01b03169163d14f2ff19160048083019260209291908290030181865afa158015610b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba69190611db3565b6040805160a081018252607881526101c260208083019182526032838501908152606084018681526000608086018181528180526009855295517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b8054965194516001600160601b0316600160a01b026001600160a01b036001600160501b03968716600160501b026001600160a01b0319909916969093169590951796909617811693909317909455517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c5592517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d55600254845163abcae5d560e01b815294519596509194919092169263abcae5d59260048083019391928290030181865afa158015610cd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfd9190611db3565b6040805160a0810182526000808252605a602080840191825261014a8486019081526060850187815260808601858152600186526009845295517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a368054955193516001600160601b0316600160a01b026001600160a01b036001600160501b03958616600160501b026001600160a01b031990981695909316949094179590951781169290921790935591517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a375592517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a38556004805485516349906b1f60e11b8152955196975092959290911693639320d63e9381830193909290918290030181865afa158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e569190611db3565b6040805160a080820183526000808352603c60208085019182528486018381526060808701898152608080890187815260028852600980875299517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054985196516001600160601b0316600160a01b026001600160a01b036001600160501b03988916600160501b026001600160a01b0319909b169890931697909717989098171694909417909555517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c45590517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c5558651948501875260b4855261021c918501919091526032958401959095526a0a8beae28cb4d5c4c000009483018590528201819052939450919260038152602080820192909252604090810160009081208451815486860151878601516001600160601b0316600160a01b026001600160a01b036001600160501b03928316600160501b026001600160a01b0319909416929094169190911791909117919091161781556060808601516001830155608095860151600290920191909155825160a08101845282815261021c948101949094526032928401929092526a0bc98e0c42e83a364000009183018290529282018390529160099060048081111561105157611051611ca8565b815260208082019290925260409081016000208351815493850151928501516001600160601b0316600160a01b026001600160a01b036001600160501b03948516600160501b026001600160a01b0319909616949092169390931793909317831691909117815560608301516001820155608090920151600290920191909155861661110a5760405162461bcd60e51b81526020600482015260086024820152674356475f5a45524f60c01b6044820152606401610545565b600580546001600160a01b0319166001600160a01b0388161790558082846111328789611d24565b61113c9190611d24565b6111469190611d24565b6111509190611d24565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a0823190602401602060405180830381865afa158015611194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b89190611db3565b10156111f75760405162461bcd60e51b815260206004820152600e60248201526d4e4f545f454e4f5547485f43564760901b6044820152606401610545565b505050505050565b61120761198d565b61121160006119e7565b565b60015433906001600160a01b031681146112815760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b6064820152608401610545565b61128a816119e7565b50565b6002546040516331a9108f60e11b815260048101839052829133916001600160a01b0390911690636352211e90602401602060405180830381865afa1580156112da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112fe9190611d54565b6001600160a01b0316146113405760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff16600281111561136057611360611ca8565b146113a05760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b60006113ad83600161172a565b50509050806000036113d15760405162461bcd60e51b815260040161054590611ce6565b6001600090815260096020527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a38805483929061140e908490611d24565b90915550506000838152600b602052604081208054839290610892908490611d24565b6003546040516331a9108f60e11b815260048101839052829133916001600160a01b0390911690636352211e90602401602060405180830381865afa15801561147e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a29190611d54565b6001600160a01b0316146114e45760405162461bcd60e51b81526020600482015260096024820152681393d517d3d5d3915160ba1b6044820152606401610545565b6002600154600160a01b900460ff16600281111561150457611504611ca8565b146115445760405162461bcd60e51b815260206004820152601060248201526f2b22a9aa24a723afa727aa2fa7a822a760811b6044820152606401610545565b600061155183600061172a565b50509050806000036115755760405162461bcd60e51b815260040161054590611ce6565b600080805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6d80548392906115b0908490611d24565b90915550506000838152600a602052604081208054839290610892908490611d24565b6000600960008360048111156115eb576115eb611ca8565b60048111156115fc576115fc611ca8565b8152602001908152602001600020600201549050919050565b61161d61198d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61164761198d565b600180546001600160a01b0383166001600160a01b031990911681179091556116786000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6116b861198d565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080808084600481111561174157611741611ca8565b036117cf57506000848152600a602052604090819020546003549151635979d73d60e11b81526004810187905290916001600160a01b03169063b2f3ae7a906024015b6040805180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c49190611e29565b602001519150611979565b60018460048111156117e3576117e3611ca8565b0361182a57506000848152600b60205260409081902054600254915163afa1c81160e01b81526004810187905290916001600160a01b03169063afa1c81190602401611784565b600284600481111561183e5761183e611ca8565b036118c857506000848152600c60205260409081902054600480549251632a45731360e21b815290810187905290916001600160a01b03169063a915cc4c90602401602060405180830381865afa15801561189d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c19190611db3565b9150611979565b60038460048111156118dc576118dc611ca8565b0361192f57600960008560048111156118f7576118f7611ca8565b600481111561190857611908611ca8565b81526020019081526020016000206002015490506a0a8beae28cb4d5c4c000009150611979565b6009600085600481111561194557611945611ca8565b600481111561195657611956611ca8565b81526020019081526020016000206002015490506a0bc98e0c42e83a3640000091505b611984848383611a00565b92509250925092565b6000546001600160a01b031633146112115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610545565b600180546001600160a01b031916905561128a816116da565b6000806201518060096000876004811115611a1d57611a1d611ca8565b6004811115611a2e57611a2e611ca8565b8152602081019190915260400160002054611a5291906001600160501b0316611e45565b600854611a5f9190611d24565b905060006201518060096000886004811115611a7d57611a7d611ca8565b6004811115611a8e57611a8e611ca8565b8152602081019190915260400160002054611ab99190600160501b90046001600160501b0316611e45565b611ac39083611d24565b905081421115611bc75780421115611ae657611adf8486611e5c565b9250611bc7565b6000611af28383611e5c565b633b9aca00611b014285611e5c565b611b0b9190611e45565b611b159190611e6f565b905060006103e8600960008a6004811115611b3257611b32611ca8565b6004811115611b4357611b43611ca8565b8152602081019190915260400160002054611b6e90600160a01b90046001600160601b031689611e45565b611b789190611e6f565b90506000611b868289611e5c565b905086633b9aca0082611b998683611e5c565b611ba39190611e45565b611bad9190611e6f565b611bb79084611d24565b611bc19190611e5c565b95505050505b50509392505050565b600060208284031215611be257600080fd5b5035919050565b801515811461128a57600080fd5b600060208284031215611c0957600080fd5b8135611c1481611be9565b9392505050565b803560058110611c2a57600080fd5b919050565b60008060408385031215611c4257600080fd5b82359150611c5260208401611c1b565b90509250929050565b6001600160a01b038116811461128a57600080fd5b600060208284031215611c8257600080fd5b8135611c1481611c5b565b600060208284031215611c9f57600080fd5b611c1482611c1b565b634e487b7160e01b600052602160045260246000fd5b6020810160038310611ce057634e487b7160e01b600052602160045260246000fd5b91905290565b6020808252600e908201526d4e4f545f52454c45415341424c4560901b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156106ea576106ea611d0e565b600060208284031215611d4957600080fd5b8151611c1481611be9565b600060208284031215611d6657600080fd5b8151611c1481611c5b565b600060208284031215611d8357600080fd5b815160048110611c1457600080fd5b600060208284031215611da457600080fd5b815160038110611c1457600080fd5b600060208284031215611dc557600080fd5b5051919050565b600060408284031215611dde57600080fd5b6040516040810181811067ffffffffffffffff82111715611e0f57634e487b7160e01b600052604160045260246000fd5b604052825181526020928301519281019290925250919050565b600060408284031215611e3b57600080fd5b611c148383611dcc565b80820281158282048414176106ea576106ea611d0e565b818103818111156106ea576106ea611d0e565b600082611e8c57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220635fd3b2929731af40375d4dd52ec7820aebece709f4088960b88e7ce68ca4d764736f6c63430008110033

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

000000000000000000000000c9740aa94a8a02a3373f5f1b493d7e10d99ae81100000000000000000000000006feb7a047e540b8d92620a2c13ec96e1ff5e19b0000000000000000000000005f02134c35449d9b6505723a56b02581356320fb

-----Decoded View---------------
Arg [0] : _presaleWl (address): 0xc9740aa94A8A02a3373f5F1b493D7e10d99AE811
Arg [1] : _presaleSeed (address): 0x06FEB7a047e540B8d92620a2c13Ec96e1FF5E19b
Arg [2] : _ibo (address): 0x5F02134C35449D9b6505723A56b02581356320fB

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c9740aa94a8a02a3373f5f1b493d7e10d99ae811
Arg [1] : 00000000000000000000000006feb7a047e540b8d92620a2c13ec96e1ff5e19b
Arg [2] : 0000000000000000000000005f02134c35449d9b6505723a56b02581356320fb


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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