ETH Price: $3,874.13 (-2.31%)

Contract

0xBe8808f7369147A9eDd1D72B318f75159EDfe216
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...139563392022-01-07 5:12:161067 days ago1641532336IN
0xBe8808f7...59EDfe216
0 ETH0.00501841172.66178182
Deposit139560442022-01-07 4:04:221067 days ago1641528262IN
0xBe8808f7...59EDfe216
0 ETH0.02130971199.01854546

Latest 5 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
154399642022-08-30 10:52:43831 days ago1661856763
0xBe8808f7...59EDfe216
0 ETH
154399642022-08-30 10:52:43831 days ago1661856763
0xBe8808f7...59EDfe216
0 ETH
147884972022-05-16 21:04:38937 days ago1652735078
0xBe8808f7...59EDfe216
0 ETH
147884972022-05-16 21:04:38937 days ago1652735078
0xBe8808f7...59EDfe216
0 ETH
139560442022-01-07 4:04:221067 days ago1641528262
0xBe8808f7...59EDfe216
0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ComplexVesting

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : ComplexVesting.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
  @dev This contract is one of 3 vesting contracts for the JustCarbon Foundation

  Here, we cover the case of complex vesting contract with a nonLinear vesting schedule over a fixed time period

  @author jordaniza ([email protected])
 */

contract ComplexVesting is Ownable, ReentrancyGuard {
    /* =============== Immutable variables ================= */

    // length of a vesting period
    uint256 public immutable vestingPeriodLength;

    // length of the interval to adjust the vesting rate,
    // in terms of vesting periods
    uint256 public immutable vestingPeriodsBeforeDecay;

    // qty by which to reduce the base vesting
    uint256 public immutable decayQty;

    // base vesting quantity over the decay interval
    uint256 public immutable baseQty;

    // address of the account who can interact with the contract
    address public immutable beneficiary;

    // start timestamp of vesting period for the account
    uint256 public immutable startTimestamp;

    // end timestamp of vesting period for the account
    uint256 public immutable endTimestamp;

    // the contract address of the token
    IERC20 private immutable token;

    /* ================ Mutable variables ================= */

    // balance of the contract
    uint256 public balance = 0;

    // total value already withdrawn by the account
    uint256 public withdrawn = 0;

    // Lifecycle flag to prevent adding beneficiaries after tokens have been deposited
    bool public tokensDeposited = false;

    // prevent contract interactions after withdraw method called
    bool public closed = false;

    /* ===== Events ===== */

    event DepositTokens(uint256 qty);
    event WithdrawSuccess(address benficiary, uint256 qty);
    event EmergencyWithdraw();

    /* ===== Constructor ===== */

    constructor(
        address _tokenAddress,
        address _beneficiary,
        uint256 _startTimestamp,
        uint256 _endTimestamp,
        uint256 _vestingPeriodLength,
        uint256 _vestingPeriodsBeforeDecay,
        uint256 _decayQty,
        uint256 _baseQty
    ) {
        require((_startTimestamp > block.timestamp), "Pass start in future");
        require(_endTimestamp > _startTimestamp, "End before start");
        require(_baseQty >= _decayQty, "Cannot decay more than base");
        require(
            (_vestingPeriodsBeforeDecay > 0) &&
                (_vestingPeriodLength > 0) &&
                (_decayQty > 0) &&
                (_baseQty > 0),
            "Pass positive quantities"
        );
        token = IERC20(_tokenAddress);
        beneficiary = _beneficiary;
        startTimestamp = _startTimestamp;
        endTimestamp = _endTimestamp;
        vestingPeriodLength = _vestingPeriodLength;
        vestingPeriodsBeforeDecay = _vestingPeriodsBeforeDecay;
        decayQty = _decayQty;
        baseQty = _baseQty;
    }

    /* ===== Modifiers ==== */

    modifier afterDeposit() {
        require(tokensDeposited, "Cannot call before deposit");
        _;
    }

    modifier notClosed() {
        require(!closed, "Contract closed");
        _;
    }

    /* ===== Getters and view functions ===== */

    /**
    Non linear vesting schedule that pays out progressively less per period, as time goes on.

    @dev Compute the cumulative amount vested by incrementing a `vestingAmount` variable.
    Each decayPeriod (eg. year), the amount vesting per period (eg. month) declines, according to the decay

        @param elapsedDecayPeriods is the number of whole "decay periods" the contract has been running - eg. 3 years
        @param elapsedCarryover is the completed vesting periods in the in the decay period - eg. 2 months
        @return the amount that has been vested over time
    */
    function _calculateVestingAmount(
        uint256 elapsedDecayPeriods,
        uint256 elapsedCarryover
    ) private view returns (uint256) {
        // initially set the vesting amount to zero
        uint256 vestingAmount = 0;

        // then, for every whole "decay period" that has passed (i.e. years):
        for (uint256 i; i <= elapsedDecayPeriods; i++) {
            // initialize the quantity vested in this period to zero
            uint256 periodVestingQty = 0;
            uint256 decayForPeriod = decayQty * i;

            // if decay would cause underflow, just set vesting quantity to zero
            if (decayForPeriod < baseQty) {
                // otherwise, get the per period vesting quantity (i.e monthly)
                periodVestingQty =
                    (baseQty - decayForPeriod) /
                    vestingPeriodsBeforeDecay;
            }
            // i is the period, if it's less than the elapsed, just take the whole period
            if (i < elapsedDecayPeriods) {
                vestingAmount += periodVestingQty * vestingPeriodsBeforeDecay;

                // otherwise, take the number of periods in the current decay period
            } else {
                vestingAmount += periodVestingQty * elapsedCarryover;
            }
        }
        return vestingAmount;
    }

    /**
        @return the amount owed to the beneficiary at a given point in time
    */
    function calculateWithdrawal() public view returns (uint256) {
        require(block.timestamp >= startTimestamp, "Vesting not started");
        if (block.timestamp >= endTimestamp) {
            return balance;
        }
        uint256 elapsedSeconds = block.timestamp - startTimestamp;

        // whole vesting periods completed i.e. 14 months
        uint256 elapsedWholePeriods = elapsedSeconds / vestingPeriodLength;

        // whole periods completed where, after each, rate of vesting decays i.e. 2 years
        uint256 elapsedDecayPeriods = elapsedWholePeriods /
            vestingPeriodsBeforeDecay;

        // whole vesting periods in the current "decay period" i.e. 2 months (into year 3)
        uint256 elapsedCarryover = elapsedWholePeriods -
            (elapsedDecayPeriods * vestingPeriodsBeforeDecay);
        uint256 vestingAmount = _calculateVestingAmount(
            elapsedDecayPeriods,
            elapsedCarryover
        );
        uint256 finalAmount = vestingAmount - withdrawn;
        if (finalAmount > balance) {
            return balance;
        }
        return finalAmount;
    }

    /**
      @dev Deposit tokens into the contract, that can then be withdrawn by the beneficiaries
     */
    function deposit(uint256 amount) public onlyOwner returns (bool) {
        require(amount > 0, "Invalid amount");

        tokensDeposited = true;
        balance += amount;

        require(token.transferFrom(msg.sender, address(this), amount));
        emit DepositTokens(amount);

        return true;
    }

    /**
      @dev Transfer all tokens currently vested to the whitelisted account.  
     */
    function withdraw()
        public
        notClosed
        afterDeposit
        nonReentrant
        returns (bool)
    {
        require(msg.sender == beneficiary, "Only whitelisted");
        uint256 amount = calculateWithdrawal();
        require(amount > 0, "Nothing to withdraw");

        balance -= amount;
        withdrawn += amount;

        require(token.transfer(msg.sender, amount));

        emit WithdrawSuccess(msg.sender, amount);
        return true;
    }

    /**
      @dev Withdraw the full token balance of the contract to a the owner
      Used in the case of a discovered vulnerability.
     */
    function emergencyWithdraw() public onlyOwner returns (bool) {
        require(balance > 0, "No funds to withdraw");
        withdrawn += balance;
        balance = 0;
        closed = true;
        require(token.transfer(msg.sender, token.balanceOf(address(this))));
        emit EmergencyWithdraw();
        return true;
    }
}

File 2 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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);
}

File 3 of 5 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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 5 of 5 : 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_vestingPeriodLength","type":"uint256"},{"internalType":"uint256","name":"_vestingPeriodsBeforeDecay","type":"uint256"},{"internalType":"uint256","name":"_decayQty","type":"uint256"},{"internalType":"uint256","name":"_baseQty","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"DepositTokens","type":"event"},{"anonymous":false,"inputs":[],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"benficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"}],"name":"WithdrawSuccess","type":"event"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateWithdrawal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensDeposited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingPeriodLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriodsBeforeDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

610180604052600060025560006003556000600460006101000a81548160ff0219169083151502179055506000600460016101000a81548160ff0219169083151502179055503480156200005257600080fd5b5060405162002142380380620021428339818101604052810190620000789190620003f7565b620000986200008c6200028660201b60201c565b6200028e60201b60201c565b60018081905550428611620000e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000db9062000521565b60405180910390fd5b85851162000129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001209062000593565b60405180910390fd5b818110156200016f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001669062000605565b60405180910390fd5b600083118015620001805750600084115b80156200018d5750600082115b80156200019a5750600081115b620001dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d39062000677565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff166101608173ffffffffffffffffffffffffffffffffffffffff16815250508673ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff168152505085610120818152505084610140818152505083608081815250508260a081815250508160c081815250508060e08181525050505050505050505062000699565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003848262000357565b9050919050565b620003968162000377565b8114620003a257600080fd5b50565b600081519050620003b6816200038b565b92915050565b6000819050919050565b620003d181620003bc565b8114620003dd57600080fd5b50565b600081519050620003f181620003c6565b92915050565b600080600080600080600080610100898b0312156200041b576200041a62000352565b5b60006200042b8b828c01620003a5565b98505060206200043e8b828c01620003a5565b9750506040620004518b828c01620003e0565b9650506060620004648b828c01620003e0565b9550506080620004778b828c01620003e0565b94505060a06200048a8b828c01620003e0565b93505060c06200049d8b828c01620003e0565b92505060e0620004b08b828c01620003e0565b9150509295985092959890939650565b600082825260208201905092915050565b7f5061737320737461727420696e20667574757265000000000000000000000000600082015250565b600062000509601483620004c0565b91506200051682620004d1565b602082019050919050565b600060208201905081810360008301526200053c81620004fa565b9050919050565b7f456e64206265666f726520737461727400000000000000000000000000000000600082015250565b60006200057b601083620004c0565b9150620005888262000543565b602082019050919050565b60006020820190508181036000830152620005ae816200056c565b9050919050565b7f43616e6e6f74206465636179206d6f7265207468616e20626173650000000000600082015250565b6000620005ed601b83620004c0565b9150620005fa82620005b5565b602082019050919050565b600060208201905081810360008301526200062081620005de565b9050919050565b7f5061737320706f736974697665207175616e7469746965730000000000000000600082015250565b60006200065f601883620004c0565b91506200066c8262000627565b602082019050919050565b60006020820190508181036000830152620006928162000650565b9050919050565b60805160a05160c05160e051610100516101205161014051610160516119da620007686000396000818161056a015281816108cc01528181610abc0152610af90152600081816107650152610cb8015260008181610c2f01528181610c550152610ceb015260008181610348015261045b01526000818161065901528181611001015261104b0152600081816106900152610fd401526000818161078901528181610d4b01528181610d7b01528181611029015261108b0152600081816107ad0152610d1b01526119da6000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063aefceb0d116100a2578063c80ec52211610071578063c80ec5221461029f578063db2e21bc146102bd578063e6fd48bc146102db578063eeea0cad146102f9578063f2fde38b1461031757610116565b8063aefceb0d14610215578063b3a5607714610233578063b69ef8a814610251578063b6b55f251461026f57610116565b8063597e1fb5116100e9578063597e1fb5146101935780635ea38f50146101b1578063715018a6146101cf5780638da5cb5b146101d9578063a85adeab146101f757610116565b806322ae82801461011b57806338af3eed146101395780633ccfd60b14610157578063539a91ed14610175575b600080fd5b610123610333565b604051610130919061111c565b60405180910390f35b610141610346565b60405161014e9190611178565b60405180910390f35b61015f61036a565b60405161016c919061111c565b60405180910390f35b61017d610657565b60405161018a91906111ac565b60405180910390f35b61019b61067b565b6040516101a8919061111c565b60405180910390f35b6101b961068e565b6040516101c691906111ac565b60405180910390f35b6101d76106b2565b005b6101e161073a565b6040516101ee9190611178565b60405180910390f35b6101ff610763565b60405161020c91906111ac565b60405180910390f35b61021d610787565b60405161022a91906111ac565b60405180910390f35b61023b6107ab565b60405161024891906111ac565b60405180910390f35b6102596107cf565b60405161026691906111ac565b60405180910390f35b610289600480360381019061028491906111f8565b6107d5565b604051610296919061111c565b60405180910390f35b6102a76109b3565b6040516102b491906111ac565b60405180910390f35b6102c56109b9565b6040516102d2919061111c565b60405180910390f35b6102e3610c2d565b6040516102f091906111ac565b60405180910390f35b610301610c51565b60405161030e91906111ac565b60405180910390f35b610331600480360381019061032c9190611251565b610df9565b005b600460009054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460019054906101000a900460ff16156103bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b3906112db565b60405180910390fd5b600460009054906101000a900460ff1661040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040290611347565b60405180910390fd5b60026001541415610451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610448906113b3565b60405180910390fd5b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104de9061141f565b60405180910390fd5b60006104f1610c51565b905060008111610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d9061148b565b60405180910390fd5b806002600082825461054891906114da565b925050819055508060036000828254610561919061150e565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016105c3929190611564565b6020604051808303816000875af11580156105e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060691906115b9565b61060f57600080fd5b7f95e1b0070dbccc052f124fa5143644dca4cc74c53bf1d0fe68ff7295f61cdc0c3382604051610640929190611564565b60405180910390a160019150506001808190555090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600460019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106ba610ef1565b73ffffffffffffffffffffffffffffffffffffffff166106d861073a565b73ffffffffffffffffffffffffffffffffffffffff161461072e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072590611632565b60405180910390fd5b6107386000610ef9565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025481565b60006107df610ef1565b73ffffffffffffffffffffffffffffffffffffffff166107fd61073a565b73ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a90611632565b60405180910390fd5b60008211610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d9061169e565b60405180910390fd5b6001600460006101000a81548160ff02191690831515021790555081600260008282546108c3919061150e565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610927939291906116be565b6020604051808303816000875af1158015610946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096a91906115b9565b61097357600080fd5b7f0fce723067d5f2ce5da3fd71ea6a66060aa4d16a6e7c6c1b700c50cd681b47b4826040516109a291906111ac565b60405180910390a160019050919050565b60035481565b60006109c3610ef1565b73ffffffffffffffffffffffffffffffffffffffff166109e161073a565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90611632565b60405180910390fd5b600060025411610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390611741565b60405180910390fd5b60025460036000828254610a90919061150e565b9250508190555060006002819055506001600460016101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b509190611178565b602060405180830381865afa158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190611776565b6040518363ffffffff1660e01b8152600401610bae929190611564565b6020604051808303816000875af1158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf191906115b9565b610bfa57600080fd5b7fcc6a1a065ab514031862e10458cbf117148ff1f8a168cfacab350e6644c174f060405160405180910390a16001905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f0000000000000000000000000000000000000000000000000000000000000000421015610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906117ef565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000004210610ce7576002549050610df6565b60007f000000000000000000000000000000000000000000000000000000000000000042610d1591906114da565b905060007f000000000000000000000000000000000000000000000000000000000000000082610d45919061183e565b905060007f000000000000000000000000000000000000000000000000000000000000000082610d75919061183e565b905060007f000000000000000000000000000000000000000000000000000000000000000082610da5919061186f565b83610db091906114da565b90506000610dbe8383610fbd565b9050600060035482610dd091906114da565b9050600254811115610dec576002549650505050505050610df6565b8096505050505050505b90565b610e01610ef1565b73ffffffffffffffffffffffffffffffffffffffff16610e1f61073a565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90611632565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc9061193b565b60405180910390fd5b610eee81610ef9565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000905060005b8481116110f657600080827f0000000000000000000000000000000000000000000000000000000000000000610ffd919061186f565b90507f0000000000000000000000000000000000000000000000000000000000000000811015611081577f0000000000000000000000000000000000000000000000000000000000000000817f000000000000000000000000000000000000000000000000000000000000000061107491906114da565b61107e919061183e565b91505b868310156110c7577f0000000000000000000000000000000000000000000000000000000000000000826110b5919061186f565b846110c0919061150e565b93506110e1565b85826110d3919061186f565b846110de919061150e565b93505b505080806110ee9061195b565b915050610fc7565b508091505092915050565b60008115159050919050565b61111681611101565b82525050565b6000602082019050611131600083018461110d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061116282611137565b9050919050565b61117281611157565b82525050565b600060208201905061118d6000830184611169565b92915050565b6000819050919050565b6111a681611193565b82525050565b60006020820190506111c1600083018461119d565b92915050565b600080fd5b6111d581611193565b81146111e057600080fd5b50565b6000813590506111f2816111cc565b92915050565b60006020828403121561120e5761120d6111c7565b5b600061121c848285016111e3565b91505092915050565b61122e81611157565b811461123957600080fd5b50565b60008135905061124b81611225565b92915050565b600060208284031215611267576112666111c7565b5b60006112758482850161123c565b91505092915050565b600082825260208201905092915050565b7f436f6e747261637420636c6f7365640000000000000000000000000000000000600082015250565b60006112c5600f8361127e565b91506112d08261128f565b602082019050919050565b600060208201905081810360008301526112f4816112b8565b9050919050565b7f43616e6e6f742063616c6c206265666f7265206465706f736974000000000000600082015250565b6000611331601a8361127e565b915061133c826112fb565b602082019050919050565b6000602082019050818103600083015261136081611324565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061139d601f8361127e565b91506113a882611367565b602082019050919050565b600060208201905081810360008301526113cc81611390565b9050919050565b7f4f6e6c792077686974656c697374656400000000000000000000000000000000600082015250565b600061140960108361127e565b9150611414826113d3565b602082019050919050565b60006020820190508181036000830152611438816113fc565b9050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b600061147560138361127e565b91506114808261143f565b602082019050919050565b600060208201905081810360008301526114a481611468565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114e582611193565b91506114f083611193565b925082821015611503576115026114ab565b5b828203905092915050565b600061151982611193565b915061152483611193565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611559576115586114ab565b5b828201905092915050565b60006040820190506115796000830185611169565b611586602083018461119d565b9392505050565b61159681611101565b81146115a157600080fd5b50565b6000815190506115b38161158d565b92915050565b6000602082840312156115cf576115ce6111c7565b5b60006115dd848285016115a4565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061161c60208361127e565b9150611627826115e6565b602082019050919050565b6000602082019050818103600083015261164b8161160f565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b6000611688600e8361127e565b915061169382611652565b602082019050919050565b600060208201905081810360008301526116b78161167b565b9050919050565b60006060820190506116d36000830186611169565b6116e06020830185611169565b6116ed604083018461119d565b949350505050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b600061172b60148361127e565b9150611736826116f5565b602082019050919050565b6000602082019050818103600083015261175a8161171e565b9050919050565b600081519050611770816111cc565b92915050565b60006020828403121561178c5761178b6111c7565b5b600061179a84828501611761565b91505092915050565b7f56657374696e67206e6f74207374617274656400000000000000000000000000600082015250565b60006117d960138361127e565b91506117e4826117a3565b602082019050919050565b60006020820190508181036000830152611808816117cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061184982611193565b915061185483611193565b9250826118645761186361180f565b5b828204905092915050565b600061187a82611193565b915061188583611193565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118be576118bd6114ab565b5b828202905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061192560268361127e565b9150611930826118c9565b604082019050919050565b6000602082019050818103600083015261195481611918565b9050919050565b600061196682611193565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611999576119986114ab565b5b60018201905091905056fea264697066735822122033b322ed1d079d2083cf266dcdf3890e6b795701bb5c45987c0c551d02f3067e64736f6c634300080a0033000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f0000000000000000000000007829dffa5f1b34d343e0fd1cc4450bfb0165e3070000000000000000000000000000000000000000000000000000000061f541910000000000000000000000000000000000000000000000000000000074c475fd000000000000000000000000000000000000000000000000000000000028206f000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063aefceb0d116100a2578063c80ec52211610071578063c80ec5221461029f578063db2e21bc146102bd578063e6fd48bc146102db578063eeea0cad146102f9578063f2fde38b1461031757610116565b8063aefceb0d14610215578063b3a5607714610233578063b69ef8a814610251578063b6b55f251461026f57610116565b8063597e1fb5116100e9578063597e1fb5146101935780635ea38f50146101b1578063715018a6146101cf5780638da5cb5b146101d9578063a85adeab146101f757610116565b806322ae82801461011b57806338af3eed146101395780633ccfd60b14610157578063539a91ed14610175575b600080fd5b610123610333565b604051610130919061111c565b60405180910390f35b610141610346565b60405161014e9190611178565b60405180910390f35b61015f61036a565b60405161016c919061111c565b60405180910390f35b61017d610657565b60405161018a91906111ac565b60405180910390f35b61019b61067b565b6040516101a8919061111c565b60405180910390f35b6101b961068e565b6040516101c691906111ac565b60405180910390f35b6101d76106b2565b005b6101e161073a565b6040516101ee9190611178565b60405180910390f35b6101ff610763565b60405161020c91906111ac565b60405180910390f35b61021d610787565b60405161022a91906111ac565b60405180910390f35b61023b6107ab565b60405161024891906111ac565b60405180910390f35b6102596107cf565b60405161026691906111ac565b60405180910390f35b610289600480360381019061028491906111f8565b6107d5565b604051610296919061111c565b60405180910390f35b6102a76109b3565b6040516102b491906111ac565b60405180910390f35b6102c56109b9565b6040516102d2919061111c565b60405180910390f35b6102e3610c2d565b6040516102f091906111ac565b60405180910390f35b610301610c51565b60405161030e91906111ac565b60405180910390f35b610331600480360381019061032c9190611251565b610df9565b005b600460009054906101000a900460ff1681565b7f0000000000000000000000007829dffa5f1b34d343e0fd1cc4450bfb0165e30781565b6000600460019054906101000a900460ff16156103bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103b3906112db565b60405180910390fd5b600460009054906101000a900460ff1661040b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040290611347565b60405180910390fd5b60026001541415610451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610448906113b3565b60405180910390fd5b60026001819055507f0000000000000000000000007829dffa5f1b34d343e0fd1cc4450bfb0165e30773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104de9061141f565b60405180910390fd5b60006104f1610c51565b905060008111610536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052d9061148b565b60405180910390fd5b806002600082825461054891906114da565b925050819055508060036000828254610561919061150e565b925050819055507f000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016105c3929190611564565b6020604051808303816000875af11580156105e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061060691906115b9565b61060f57600080fd5b7f95e1b0070dbccc052f124fa5143644dca4cc74c53bf1d0fe68ff7295f61cdc0c3382604051610640929190611564565b60405180910390a160019150506001808190555090565b7f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000081565b600460019054906101000a900460ff1681565b7f000000000000000000000000000000000000000000084595161401484a00000081565b6106ba610ef1565b73ffffffffffffffffffffffffffffffffffffffff166106d861073a565b73ffffffffffffffffffffffffffffffffffffffff161461072e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072590611632565b60405180910390fd5b6107386000610ef9565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f0000000000000000000000000000000000000000000000000000000074c475fd81565b7f000000000000000000000000000000000000000000000000000000000000000c81565b7f000000000000000000000000000000000000000000000000000000000028206f81565b60025481565b60006107df610ef1565b73ffffffffffffffffffffffffffffffffffffffff166107fd61073a565b73ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a90611632565b60405180910390fd5b60008211610896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088d9061169e565b60405180910390fd5b6001600460006101000a81548160ff02191690831515021790555081600260008282546108c3919061150e565b925050819055507f000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401610927939291906116be565b6020604051808303816000875af1158015610946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096a91906115b9565b61097357600080fd5b7f0fce723067d5f2ce5da3fd71ea6a66060aa4d16a6e7c6c1b700c50cd681b47b4826040516109a291906111ac565b60405180910390a160019050919050565b60035481565b60006109c3610ef1565b73ffffffffffffffffffffffffffffffffffffffff166109e161073a565b73ffffffffffffffffffffffffffffffffffffffff1614610a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2e90611632565b60405180910390fd5b600060025411610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390611741565b60405180910390fd5b60025460036000828254610a90919061150e565b9250508190555060006002819055506001600460016101000a81548160ff0219169083151502179055507f000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b509190611178565b602060405180830381865afa158015610b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b919190611776565b6040518363ffffffff1660e01b8152600401610bae929190611564565b6020604051808303816000875af1158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf191906115b9565b610bfa57600080fd5b7fcc6a1a065ab514031862e10458cbf117148ff1f8a168cfacab350e6644c174f060405160405180910390a16001905090565b7f0000000000000000000000000000000000000000000000000000000061f5419181565b60007f0000000000000000000000000000000000000000000000000000000061f54191421015610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad906117ef565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000074c475fd4210610ce7576002549050610df6565b60007f0000000000000000000000000000000000000000000000000000000061f5419142610d1591906114da565b905060007f000000000000000000000000000000000000000000000000000000000028206f82610d45919061183e565b905060007f000000000000000000000000000000000000000000000000000000000000000c82610d75919061183e565b905060007f000000000000000000000000000000000000000000000000000000000000000c82610da5919061186f565b83610db091906114da565b90506000610dbe8383610fbd565b9050600060035482610dd091906114da565b9050600254811115610dec576002549650505050505050610df6565b8096505050505050505b90565b610e01610ef1565b73ffffffffffffffffffffffffffffffffffffffff16610e1f61073a565b73ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90611632565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc9061193b565b60405180910390fd5b610eee81610ef9565b50565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806000905060005b8481116110f657600080827f000000000000000000000000000000000000000000084595161401484a000000610ffd919061186f565b90507f00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000811015611081577f000000000000000000000000000000000000000000000000000000000000000c817f00000000000000000000000000000000000000000052b7d2dcc80cd2e400000061107491906114da565b61107e919061183e565b91505b868310156110c7577f000000000000000000000000000000000000000000000000000000000000000c826110b5919061186f565b846110c0919061150e565b93506110e1565b85826110d3919061186f565b846110de919061150e565b93505b505080806110ee9061195b565b915050610fc7565b508091505092915050565b60008115159050919050565b61111681611101565b82525050565b6000602082019050611131600083018461110d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061116282611137565b9050919050565b61117281611157565b82525050565b600060208201905061118d6000830184611169565b92915050565b6000819050919050565b6111a681611193565b82525050565b60006020820190506111c1600083018461119d565b92915050565b600080fd5b6111d581611193565b81146111e057600080fd5b50565b6000813590506111f2816111cc565b92915050565b60006020828403121561120e5761120d6111c7565b5b600061121c848285016111e3565b91505092915050565b61122e81611157565b811461123957600080fd5b50565b60008135905061124b81611225565b92915050565b600060208284031215611267576112666111c7565b5b60006112758482850161123c565b91505092915050565b600082825260208201905092915050565b7f436f6e747261637420636c6f7365640000000000000000000000000000000000600082015250565b60006112c5600f8361127e565b91506112d08261128f565b602082019050919050565b600060208201905081810360008301526112f4816112b8565b9050919050565b7f43616e6e6f742063616c6c206265666f7265206465706f736974000000000000600082015250565b6000611331601a8361127e565b915061133c826112fb565b602082019050919050565b6000602082019050818103600083015261136081611324565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061139d601f8361127e565b91506113a882611367565b602082019050919050565b600060208201905081810360008301526113cc81611390565b9050919050565b7f4f6e6c792077686974656c697374656400000000000000000000000000000000600082015250565b600061140960108361127e565b9150611414826113d3565b602082019050919050565b60006020820190508181036000830152611438816113fc565b9050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b600061147560138361127e565b91506114808261143f565b602082019050919050565b600060208201905081810360008301526114a481611468565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006114e582611193565b91506114f083611193565b925082821015611503576115026114ab565b5b828203905092915050565b600061151982611193565b915061152483611193565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611559576115586114ab565b5b828201905092915050565b60006040820190506115796000830185611169565b611586602083018461119d565b9392505050565b61159681611101565b81146115a157600080fd5b50565b6000815190506115b38161158d565b92915050565b6000602082840312156115cf576115ce6111c7565b5b60006115dd848285016115a4565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061161c60208361127e565b9150611627826115e6565b602082019050919050565b6000602082019050818103600083015261164b8161160f565b9050919050565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b6000611688600e8361127e565b915061169382611652565b602082019050919050565b600060208201905081810360008301526116b78161167b565b9050919050565b60006060820190506116d36000830186611169565b6116e06020830185611169565b6116ed604083018461119d565b949350505050565b7f4e6f2066756e647320746f207769746864726177000000000000000000000000600082015250565b600061172b60148361127e565b9150611736826116f5565b602082019050919050565b6000602082019050818103600083015261175a8161171e565b9050919050565b600081519050611770816111cc565b92915050565b60006020828403121561178c5761178b6111c7565b5b600061179a84828501611761565b91505092915050565b7f56657374696e67206e6f74207374617274656400000000000000000000000000600082015250565b60006117d960138361127e565b91506117e4826117a3565b602082019050919050565b60006020820190508181036000830152611808816117cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061184982611193565b915061185483611193565b9250826118645761186361180f565b5b828204905092915050565b600061187a82611193565b915061188583611193565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118be576118bd6114ab565b5b828202905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061192560268361127e565b9150611930826118c9565b604082019050919050565b6000602082019050818103600083015261195481611918565b9050919050565b600061196682611193565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611999576119986114ab565b5b60018201905091905056fea264697066735822122033b322ed1d079d2083cf266dcdf3890e6b795701bb5c45987c0c551d02f3067e64736f6c634300080a0033

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

000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f0000000000000000000000007829dffa5f1b34d343e0fd1cc4450bfb0165e3070000000000000000000000000000000000000000000000000000000061f541910000000000000000000000000000000000000000000000000000000074c475fd000000000000000000000000000000000000000000000000000000000028206f000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000

-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0xbE601dD49da9EE1d2F64D422c4AECf8EB83c119f
Arg [1] : _beneficiary (address): 0x7829dfFa5F1B34D343E0FD1cC4450bfB0165E307
Arg [2] : _startTimestamp (uint256): 1643463057
Arg [3] : _endTimestamp (uint256): 1959032317
Arg [4] : _vestingPeriodLength (uint256): 2629743
Arg [5] : _vestingPeriodsBeforeDecay (uint256): 12
Arg [6] : _decayQty (uint256): 10000000000000000000000000
Arg [7] : _baseQty (uint256): 100000000000000000000000000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000be601dd49da9ee1d2f64d422c4aecf8eb83c119f
Arg [1] : 0000000000000000000000007829dffa5f1b34d343e0fd1cc4450bfb0165e307
Arg [2] : 0000000000000000000000000000000000000000000000000000000061f54191
Arg [3] : 0000000000000000000000000000000000000000000000000000000074c475fd
Arg [4] : 000000000000000000000000000000000000000000000000000000000028206f
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [7] : 00000000000000000000000000000000000000000052b7d2dcc80cd2e4000000


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.