ETH Price: $3,340.74 (+0.12%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Release Seed215231932024-12-31 14:57:3526 days ago1735657055IN
0xC929bA60...3b12a0c30
0 ETH0.001085415.19405245
Release Seed215231922024-12-31 14:57:2326 days ago1735657043IN
0xC929bA60...3b12a0c30
0 ETH0.0010257414.35888674
Release Seed215231882024-12-31 14:56:3526 days ago1735656995IN
0xC929bA60...3b12a0c30
0 ETH0.0010948215.32599787
Release Seed213285772024-12-04 10:35:5953 days ago1733308559IN
0xC929bA60...3b12a0c30
0 ETH0.0017154419.37566471
Release Seed212689872024-11-26 2:37:4761 days ago1732588667IN
0xC929bA60...3b12a0c30
0 ETH0.00055047.70488812
Release Seed212689812024-11-26 2:36:3561 days ago1732588595IN
0xC929bA60...3b12a0c30
0 ETH0.000705987.9739479
Release Ibo210738102024-10-29 20:53:5988 days ago1730235239IN
0xC929bA60...3b12a0c30
0 ETH0.000650889.56806714
Release Seed207218922024-09-10 18:06:59138 days ago1725991619IN
0xC929bA60...3b12a0c30
0 ETH0.000463446.48754735
Release Wl205702212024-08-20 13:46:23159 days ago1724161583IN
0xC929bA60...3b12a0c30
0 ETH0.00021211.988239
Release Wl205641302024-08-19 17:21:59160 days ago1724088119IN
0xC929bA60...3b12a0c30
0 ETH0.000207252.85950665
Release Wl205595712024-08-19 2:03:59160 days ago1724033039IN
0xC929bA60...3b12a0c30
0 ETH0.000197072.2
Release Seed205589032024-08-18 23:49:11160 days ago1724024951IN
0xC929bA60...3b12a0c30
0 ETH0.000165241.56426058
Release Seed205113372024-08-12 8:27:23167 days ago1723451243IN
0xC929bA60...3b12a0c30
0 ETH0.00026913.76709675
Release Seed204332422024-08-01 10:56:47178 days ago1722509807IN
0xC929bA60...3b12a0c30
0 ETH0.000380254.29492643
Release Seed204325662024-08-01 8:40:35178 days ago1722501635IN
0xC929bA60...3b12a0c30
0 ETH0.000533296.0235124
Release Wl204267602024-07-31 13:13:47179 days ago1722431627IN
0xC929bA60...3b12a0c30
0 ETH0.000635098.76244774
Release Seed204155202024-07-29 23:30:11180 days ago1722295811IN
0xC929bA60...3b12a0c30
0 ETH0.000142011.98796302
Release Seed204155162024-07-29 23:29:23180 days ago1722295763IN
0xC929bA60...3b12a0c30
0 ETH0.000209772.9365963
Release Seed204155122024-07-29 23:28:35180 days ago1722295715IN
0xC929bA60...3b12a0c30
0 ETH0.000151882.1261562
Release Seed204131532024-07-29 15:35:35181 days ago1722267335IN
0xC929bA60...3b12a0c30
0 ETH0.000384965.38893783
Release Seed204121472024-07-29 12:13:59181 days ago1722255239IN
0xC929bA60...3b12a0c30
0 ETH0.000335533.17629711
Release Seed204104122024-07-29 6:25:59181 days ago1722234359IN
0xC929bA60...3b12a0c30
0 ETH0.000210752.38043282
Release Seed204040992024-07-28 9:17:59182 days ago1722158279IN
0xC929bA60...3b12a0c30
0 ETH0.000118661.34033464
Release Seed204037002024-07-28 7:57:59182 days ago1722153479IN
0xC929bA60...3b12a0c30
0 ETH0.000161481.8239856
Release Wl203913372024-07-26 14:31:47184 days ago1722004307IN
0xC929bA60...3b12a0c30
0 ETH0.000566787.81869597
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.