ETH Price: $3,485.16 (+2.61%)

Contract

0xb476104aa9D1f30180a01987FB09b1e96dDCF14B
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...136805282021-11-25 1:10:051126 days ago1637802605IN
0xb476104a...96dDCF14B
0 ETH0.00498847174.58689143

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VestingPools

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion
File 1 of 11 : VestingPools.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

import "./interfaces/Constants.sol";
import { PoolParams } from "./interfaces/Types.sol";
import "./interfaces/IMintable.sol";
import "./interfaces/IVestingPools.sol";
import "./utils/Claimable.sol";
import { TokenAddress } from "./utils/Linking.sol";
import "./utils/SafeUints.sol";

/**
 * @title VestingPools
 * @notice It mints and vests a (mintable) ERC-20 token to "Vesting Pools".
 * @dev Each "Vesting Pool" (or a "pool") has a `wallet` and `PoolParams`.
 * The `wallet` requests vesting and receives vested tokens, or nominate
 * another address that receives them.
 * `PoolParams` deterministically define minting and unlocking schedule.
 * Once added, a pool can not be removed. Subject to strict limitations,
 * owner may update a few parameters of a pool.
 */
contract VestingPools is
    Ownable,
    Claimable,
    SafeUints,
    Constants,
    IVestingPools
{
    /// @notice Accumulated amount to be vested to all pools
    uint96 public totalAllocation;
    /// @notice Total amount already vested to all pools
    uint96 public totalVested;

    // ID of a pool (i.e. `poolId`) is the index in these two arrays
    address[] internal _wallets;
    PoolParams[] internal _pools;

    /// @inheritdoc IVestingPools
    function token() external view override returns (address) {
        return _getToken();
    }

    /// @inheritdoc IVestingPools
    function getWallet(uint256 poolId)
        external
        view
        override
        returns (address)
    {
        _throwInvalidPoolId(poolId);
        return _wallets[poolId];
    }

    /// @inheritdoc IVestingPools
    function getPool(uint256 poolId)
        external
        view
        override
        returns (PoolParams memory)
    {
        return _getPool(poolId);
    }

    /// @inheritdoc IVestingPools
    function releasableAmount(uint256 poolId)
        external
        view
        override
        returns (uint256)
    {
        PoolParams memory pool = _getPool(poolId);
        return _getReleasable(pool, _timeNow());
    }

    /// @inheritdoc IVestingPools
    function vestedAmount(uint256 poolId)
        external
        view
        override
        returns (uint256)
    {
        PoolParams memory pool = _getPool(poolId);
        return uint256(pool.vested);
    }

    /// @inheritdoc IVestingPools
    function release(uint256 poolId, uint256 amount)
        external
        override
        returns (uint256 released)
    {
        return _releaseTo(poolId, msg.sender, amount);
    }

    /// @inheritdoc IVestingPools
    function releaseTo(
        uint256 poolId,
        address account,
        uint256 amount
    ) external override returns (uint256 released) {
        _throwZeroAddress(account);
        return _releaseTo(poolId, account, amount);
    }

    /// @inheritdoc IVestingPools
    function updatePoolWallet(uint256 poolId, address newWallet)
        external
        override
    {
        _throwZeroAddress(newWallet);
        _throwUnauthorizedWallet(poolId, msg.sender);

        _wallets[poolId] = newWallet;
        emit WalletUpdated(poolId, newWallet);
    }

    /// @inheritdoc IVestingPools
    function addVestingPools(
        address[] memory wallets,
        PoolParams[] memory pools
    ) external override onlyOwner {
        require(wallets.length == pools.length, "VPools: length mismatch");

        uint256 timeNow = _timeNow();
        IMintable theToken = IMintable(_getToken());
        uint256 updAllocation = uint256(totalAllocation);
        uint256 preMinted = 0;
        uint256 poolId = _pools.length;
        for (uint256 i = 0; i < wallets.length; i++) {
            _throwZeroAddress(wallets[i]);
            require(pools[i].start >= timeNow, "VPools: start already passed");
            require(pools[i].sAllocation != 0, "VPools: zero sAllocation");
            require(
                pools[i].sAllocation >= pools[i].sUnlocked,
                "VPools: too big sUnlocked"
            );
            require(pools[i].vested == 0, "VPools: zero vested expected");

            uint256 allocation = uint256(pools[i].sAllocation) * SCALE;
            updAllocation += allocation;

            _wallets.push(wallets[i]);
            _pools.push(pools[i]);
            emit PoolAdded(poolId++, wallets[i], allocation);

            if (pools[i].isPreMinted) {
                preMinted += allocation;
            }
        }
        // left outside the cycle to save gas for a non-reverting transaction
        require(updAllocation <= MAX_SUPPLY, "VPools: supply exceeded");
        totalAllocation = _safe96(updAllocation);

        if (preMinted != 0) {
            require(theToken.mint(address(this), preMinted), "VPools:E5");
        }
    }

    /// @inheritdoc IVestingPools
    /// @dev Vesting schedule for a pool may be significantly altered by this.
    /// However, pool allocation (i.e. token amount to vest) remains unchanged.
    function updatePoolTime(
        uint256 poolId,
        uint32 start,
        uint16 vestingDays
    ) external override onlyOwner {
        PoolParams memory pool = _getPool(poolId);

        require(pool.isAdjustable, "VPools: non-adjustable");
        require(
            uint256(pool.sAllocation) * SCALE > uint256(pool.vested),
            "VPools: fully vested"
        );
        uint256 end = uint256(start) + uint256(vestingDays) * 1 days;
        // `end` may NOT be in the past, unlike `start` that may be even zero
        require(_timeNow() > end, "VPools: too late updates");

        pool.start = start;
        pool.vestingDays = vestingDays;
        _pools[poolId] = pool;

        emit PoolUpdated(poolId, start, vestingDays);
    }

    /**
     * @notice Withdraws accidentally sent token from this contract.
     * @dev Owner may call only.
     */
    function claimErc20(
        address claimedToken,
        address to,
        uint256 amount
    ) external onlyOwner nonReentrant {
        IERC20 vestedToken = IERC20(_getToken());
        if (claimedToken == address(vestedToken)) {
            uint256 actual = vestedToken.balanceOf(address(this));
            uint256 expected = vestedToken.totalSupply() - totalVested;
            require(actual >= expected + amount, "VPools: too big amount");
        }
        _claimErc20(claimedToken, to, amount);
    }

    /// @notice Removes the contract from blockchain if there is no tokens to vest.
    /// @dev Owner may call only.
    function removeContract() external onlyOwner {
        // intended "strict comparison"
        require(totalAllocation == totalVested, "VPools:E1");
        selfdestruct(payable(msg.sender));
    }

    //////////////////
    //// Internal ////
    //////////////////

    /// @dev Returns token contract address
    // (declared `view` rather than `pure` to facilitate testing)
    function _getToken() internal view virtual returns (address) {
        return address(TokenAddress);
    }

    /// @dev Returns pool params for the pool with the given ID
    function _getPool(uint256 poolId)
        internal
        view
        returns (PoolParams memory)
    {
        _throwInvalidPoolId(poolId);
        return _pools[poolId];
    }

    /// @dev Returns amount that may be released now for the pool given
    function _getReleasable(PoolParams memory pool, uint256 timeNow)
        internal
        pure
        returns (uint256)
    {
        if (timeNow < pool.start) return 0;

        uint256 allocation = uint256(pool.sAllocation) * SCALE;
        if (pool.vested >= allocation) return 0;

        uint256 releasable = allocation - uint256(pool.vested);
        uint256 duration = uint256(pool.vestingDays) * 1 days;
        uint256 end = uint256(pool.start) + duration;
        if (timeNow < end) {
            uint256 unlocked = uint256(pool.sUnlocked) * SCALE;
            uint256 locked = ((allocation - unlocked) * (end - timeNow)) /
                duration; // can't be 0 here

            releasable = locked > releasable ? 0 : releasable - locked;
        }

        return releasable;
    }

    /// @dev Vests from the pool the given or releasable amount to the given address
    function _releaseTo(
        uint256 poolId,
        address to,
        uint256 amount
    ) internal returns (uint256 released) {
        PoolParams memory pool = _getPool(poolId);
        _throwUnauthorizedWallet(poolId, msg.sender);

        uint256 releasable = _getReleasable(pool, _timeNow());
        require(releasable >= amount, "VPools: not enough to release");

        released = amount == 0 ? releasable : amount;

        _pools[poolId].vested = _safe96(released + uint256(pool.vested));
        totalVested = _safe96(released + uint256(totalVested));

        // reentrancy impossible (known contract called)
        if (pool.isPreMinted) {
            require(IERC20(_getToken()).transfer(to, released), "VPools:E6");
        } else {
            require(IMintable(_getToken()).mint(to, released), "VPools:E7");
        }
        emit Released(poolId, to, released);
    }

    function _throwZeroAddress(address account) private pure {
        require(account != address(0), "VPools: zero address(account|wallet)");
    }

    function _throwInvalidPoolId(uint256 poolId) private view {
        require(poolId < _pools.length, "VPools: invalid pool id");
    }

    function _throwUnauthorizedWallet(uint256 poolId, address wallet)
        private
        view
    {
        _throwZeroAddress(wallet);
        require(_wallets[poolId] == wallet, "VPools: unauthorized");
    }

    /// @dev Returns the current block timestamp (added to ease testing)
    function _timeNow() internal view virtual returns (uint256) {
        return block.timestamp;
    }
}

File 2 of 11 : Ownable.sol
// SPDX-License-Identifier: MIT

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT

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 4 of 11 : Constants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Constants {
    // $ZKP token max supply
    uint256 internal constant MAX_SUPPLY = 1e27;

    // Scaling factor in token amount calculations
    uint256 internal constant SCALE = 1e12;
}

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

/**
 * @dev To save gas, params are packed to fit into a single storage slot.
 * Some amounts are scaled (divided) by {SCALE} - note names starting with
 * the letter "s" (stands for "scaled") followed by a capital letter.
 */
struct PoolParams {
    // if `true`, allocation gets pre-minted, otherwise minted when vested
    bool isPreMinted;
    // if `true`, the owner may change {start} and {duration}
    bool isAdjustable;
    // (UNIX) time when vesting starts
    uint32 start;
    // period in days (since the {start}) of vesting
    uint16 vestingDays;
    // scaled total amount to (ever) vest from the pool
    uint48 sAllocation;
    // out of {sAllocation}, amount (also scaled) to be unlocked on the {start}
    uint48 sUnlocked;
    // amount vested from the pool so far (without scaling)
    uint96 vested;
}

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

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IMintable is IERC20 {
    function mint(address account, uint256 amount) external returns (bool);
}

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

import { PoolParams } from "./Types.sol";

interface IVestingPools {
    /**
     * @notice Returns Token address.
     */
    function token() external view returns (address);

    /**
     * @notice Returns the wallet address of the specified pool.
     */
    function getWallet(uint256 poolId) external view returns (address);

    /**
     * @notice Returns parameters of the specified pool.
     */
    function getPool(uint256 poolId) external view returns (PoolParams memory);

    /**
     * @notice Returns the amount that may be vested now from the given pool.
     */
    function releasableAmount(uint256 poolId) external view returns (uint256);

    /**
     * @notice Returns the amount that has been vested from the given pool
     */
    function vestedAmount(uint256 poolId) external view returns (uint256);

    /**
     * @notice Vests the specified amount from the given pool to the pool wallet.
     * If the amount is zero, it vests the entire "releasable" amount.
     * @dev Pool wallet may call only.
     * @return released - Amount released.
     */
    function release(uint256 poolId, uint256 amount)
        external
        returns (uint256 released);

    /**
     * @notice Vests the specified amount from the given pool to the given address.
     * If the amount is zero, it vests the entire "releasable" amount.
     * @dev Pool wallet may call only.
     * @return released - Amount released.
     */
    function releaseTo(
        uint256 poolId,
        address account,
        uint256 amount
    ) external returns (uint256 released);

    /**
     * @notice Updates the wallet for the given pool.
     * @dev (Current) wallet may call only.
     */
    function updatePoolWallet(uint256 poolId, address newWallet) external;

    /**
     * @notice Adds new vesting pools with given wallets and parameters.
     * @dev Owner may call only.
     */
    function addVestingPools(
        address[] memory wallets,
        PoolParams[] memory params
    ) external;

    /**
     * @notice Update `start` and `duration` for the given pool.
     * @param start - new (UNIX) time vesting starts at
     * @param vestingDays - new period in days, when vesting lasts
     * @dev Owner may call only.
     */
    function updatePoolTime(
        uint256 poolId,
        uint32 start,
        uint16 vestingDays
    ) external;

    /// @notice Emitted on an amount vesting.
    event Released(uint256 indexed poolId, address to, uint256 amount);

    /// @notice Emitted on a pool wallet update.
    event WalletUpdated(uint256 indexedpoolId, address indexed newWallet);

    /// @notice Emitted on a new pool added.
    event PoolAdded(
        uint256 indexed poolId,
        address indexed wallet,
        uint256 allocation
    );

    /// @notice Emitted on a pool params update.
    event PoolUpdated(
        uint256 indexed poolId,
        uint256 start,
        uint256 vestingDays
    );
}

File 8 of 11 : Claimable.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.8.0;

/**
 * @title Claimable
 * @notice It withdraws accidentally sent tokens from this contract.
 * @dev It provides reentrancy guard. The code borrowed from openzeppelin-contracts.
 * Unlike original code, this version does not require `constructor` call.
 */
contract Claimable {
    bytes4 private constant SELECTOR_TRANSFER =
        bytes4(keccak256(bytes("transfer(address,uint256)")));

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _reentrancyStatus;

    /// @dev Withdraws ERC20 tokens from this contract
    /// (take care of reentrancy attack risk mitigation)
    function _claimErc20(
        address token,
        address to,
        uint256 amount
    ) internal {
        // solhint-disable avoid-low-level-calls
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(SELECTOR_TRANSFER, to, amount)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "claimErc20: TRANSFER_FAILED"
        );
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_reentrancyStatus != _ENTERED, "claimErc20: reentrant call");

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

        _;

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

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

/**
 * @dev This file contains fake libs just for static linking.
 * These fake libs' code is assumed to never run.
 * On compilation of dependant contracts, instead of fake libs addresses,
 * indicate addresses of deployed real contracts (or accounts).
 */

/// @dev Address of the ZKPToken contract ('../ZKPToken.sol') instance
library TokenAddress {
    function neverCallIt() external pure {
        revert("FAKE");
    }
}

/// @dev Address of the VestingPools ('../VestingPools.sol') instance
library VestingPoolsAddress {
    function neverCallIt() external pure {
        revert("FAKE");
    }
}

/// @dev Address of the PoolStakes._defaultOwner
// (NB: if it's not a multisig, transfer ownership to a Multisig contract)
library DefaultOwnerAddress {
    function neverCallIt() external pure {
        revert("FAKE");
    }
}

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

/**
 * @title SafeUints
 * @notice Util functions which throws if a uint256 can't fit into smaller uints.
 */
contract SafeUints {
    // @dev Checks if the given uint256 does not overflow uint96
    function _safe96(uint256 n) internal pure returns (uint96) {
        require(n < 2**96, "VPools: Unsafe96");
        return uint96(n);
    }
}

File 11 of 11 : Context.sol
// SPDX-License-Identifier: MIT

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
{
  "metadata": {
    "bytecodeHash": "none"
  },
  "optimizer": {
    "enabled": true,
    "runs": 800
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/utils/Linking.sol": {
      "TokenAddress": "0x909e34d3f6124c324ac83dcca84b74398a6fa173"
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocation","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingDays","type":"uint256"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"indexedpoolId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"WalletUpdated","type":"event"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"components":[{"internalType":"bool","name":"isPreMinted","type":"bool"},{"internalType":"bool","name":"isAdjustable","type":"bool"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint16","name":"vestingDays","type":"uint16"},{"internalType":"uint48","name":"sAllocation","type":"uint48"},{"internalType":"uint48","name":"sUnlocked","type":"uint48"},{"internalType":"uint96","name":"vested","type":"uint96"}],"internalType":"struct PoolParams[]","name":"pools","type":"tuple[]"}],"name":"addVestingPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimedToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPool","outputs":[{"components":[{"internalType":"bool","name":"isPreMinted","type":"bool"},{"internalType":"bool","name":"isAdjustable","type":"bool"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint16","name":"vestingDays","type":"uint16"},{"internalType":"uint48","name":"sAllocation","type":"uint48"},{"internalType":"uint48","name":"sUnlocked","type":"uint48"},{"internalType":"uint96","name":"vested","type":"uint96"}],"internalType":"struct PoolParams","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"releasableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[{"internalType":"uint256","name":"released","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"releaseTo","outputs":[{"internalType":"uint256","name":"released","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocation","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVested","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint32","name":"start","type":"uint32"},{"internalType":"uint16","name":"vestingDays","type":"uint16"}],"name":"updatePoolTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"newWallet","type":"address"}],"name":"updatePoolWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121a78061007e6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063db66bbd111610081578063f2fde38b11610066578063f2fde38b146102e8578063fc0c546a146102fb578063fe389e091461031557600080fd5b8063db66bbd1146102c2578063e11d1a98146102d557600080fd5b8063715018a61461028357806379203dc41461028b5780638da5cb5b1461029e57806392a70fb0146102af57600080fd5b80632a7d7bc5116100ee5780632a7d7bc51461021f578063366a4120146102325780635470b13b146102455780635927fca21461027057600080fd5b8063068bcd8d14610120578063085cb13f146101b7578063199cbc54146101cc5780631bfce853146101fe575b600080fd5b61013361012e366004611f45565b61031d565b6040516101ae9190600060e08201905082511515825260208301511515602083015263ffffffff604084015116604083015261ffff6060840151166060830152608083015165ffffffffffff80821660808501528060a08601511660a085015250506001600160601b0360c08401511660c083015292915050565b60405180910390f35b6101ca6101c5366004611f75565b610365565b005b6002546101e690600160601b90046001600160601b031681565b6040516001600160601b0390911681526020016101ae565b61021161020c366004611f45565b610406565b6040519081526020016101ae565b61021161022d366004611fa0565b610426565b610211610240366004611fc4565b610444565b610258610253366004611f45565b610458565b6040516001600160a01b0390911681526020016101ae565b61021161027e366004611f45565b61049f565b6101ca6104b7565b6002546101e6906001600160601b031681565b6000546001600160a01b0316610258565b6101ca6102bd366004611e2d565b610522565b6101ca6102d0366004611fe5565b610788565b6101ca6102e3366004611e68565b610aa9565b6101ca6102f6366004611e13565b61121c565b73909e34d3f6124c324ac83dcca84b74398a6fa173610258565b6101ca6112fe565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261035f826113bf565b92915050565b61036e816114bb565b610378823361151d565b806003838154811061039a57634e487b7160e01b600052603260045260246000fd5b600091825260209182902001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03938416179055604051848152918316917ff2e290194c4582e14975be0ee8a27dcb9b7eb438a3d45c1bc51dfc6fe614c1bf910160405180910390a25050565b600080610412836113bf565b60c001516001600160601b03169392505050565b6000610431836114bb565b61043c8484846115b7565b949350505050565b60006104518333846115b7565b9392505050565b600061046382611925565b6003828154811061048457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6000806104ab836113bf565b90506104518142611976565b6000546001600160a01b031633146105165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6105206000611aa2565b565b6000546001600160a01b0316331461057c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b600260015414156105cf5760405162461bcd60e51b815260206004820152601a60248201527f636c61696d45726332303a207265656e7472616e742063616c6c000000000000604482015260640161050d565b600260015573909e34d3f6124c324ac83dcca84b74398a6fa1736001600160a01b038481169082161415610773576040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561063f57600080fd5b505afa158015610653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106779190611f5d565b905060006002600c9054906101000a90046001600160601b03166001600160601b0316836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611f5d565b610715919061212e565b905061072184826120d7565b8210156107705760405162461bcd60e51b815260206004820152601660248201527f56506f6f6c733a20746f6f2062696720616d6f756e7400000000000000000000604482015260640161050d565b50505b61077e848484611aff565b5050600180555050565b6000546001600160a01b031633146107e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b60006107ed846113bf565b905080602001516108405760405162461bcd60e51b815260206004820152601660248201527f56506f6f6c733a206e6f6e2d61646a75737461626c6500000000000000000000604482015260640161050d565b8060c001516001600160601b031664e8d4a51000826080015165ffffffffffff1661086b919061210f565b116108b85760405162461bcd60e51b815260206004820152601460248201527f56506f6f6c733a2066756c6c7920766573746564000000000000000000000000604482015260640161050d565b60006108cb61ffff84166201518061210f565b6108db9063ffffffff86166120d7565b905080421161092c5760405162461bcd60e51b815260206004820152601860248201527f56506f6f6c733a20746f6f206c61746520757064617465730000000000000000604482015260640161050d565b63ffffffff8416604083015261ffff83166060830152600480548391908790811061096757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020835191018054848401516040808701516060880151608089015160a08a015160c0909a015161ffff1990961697151561ff00191697909717610100941515949094029390931767ffffffffffff000019166201000063ffffffff9283160267ffff000000000000191617660100000000000061ffff948516021773ffffffffffffffffffffffff000000000000000019166801000000000000000065ffffffffffff9788160273ffffffffffff0000000000000000000000000000191617600160701b9690981695909502969096176001600160a01b0316600160a01b6001600160601b0390931692909202919091179091558351918816825286169181019190915286917f17b8644f386d1c7c7138ef98b3c8035622bbe94d7be9b26f71d2654a547c2943910160405180910390a25050505050565b6000546001600160a01b03163314610b035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b8051825114610b545760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a206c656e677468206d69736d61746368000000000000000000604482015260640161050d565b600254600454429173909e34d3f6124c324ac83dcca84b74398a6fa173916001600160601b0390911690600090815b87518110156110b657610bbc888281518110610baf57634e487b7160e01b600052603260045260246000fd5b60200260200101516114bb565b85878281518110610bdd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015163ffffffff161015610c3d5760405162461bcd60e51b815260206004820152601c60248201527f56506f6f6c733a20737461727420616c72656164792070617373656400000000604482015260640161050d565b868181518110610c5d57634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff1660001415610cc15760405162461bcd60e51b815260206004820152601860248201527f56506f6f6c733a207a65726f2073416c6c6f636174696f6e0000000000000000604482015260640161050d565b868181518110610ce157634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015165ffffffffffff16878281518110610d1557634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff161015610d775760405162461bcd60e51b815260206004820152601960248201527f56506f6f6c733a20746f6f206269672073556e6c6f636b656400000000000000604482015260640161050d565b868181518110610d9757634e487b7160e01b600052603260045260246000fd5b602002602001015160c001516001600160601b0316600014610dfb5760405162461bcd60e51b815260206004820152601c60248201527f56506f6f6c733a207a65726f2076657374656420657870656374656400000000604482015260640161050d565b600064e8d4a51000888381518110610e2357634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff16610e41919061210f565b9050610e4d81866120d7565b94506003898381518110610e7157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790558751600490899084908110610ede57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151930180549282015160408301516060840151608085015160a086015160c09096015161ffff1990971697151561ff00191697909717610100931515939093029290921767ffffffffffff000019166201000063ffffffff9092169190910267ffff000000000000191617660100000000000061ffff909216919091021773ffffffffffffffffffffffff000000000000000019166801000000000000000065ffffffffffff9586160273ffffffffffff0000000000000000000000000000191617600160701b9490921693909302176001600160a01b0316600160a01b6001600160601b0390921691909102179055885189908390811061100e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316838061102a90612145565b94507f6c5d0ef1d0199b6de41ecbce95f59643be4d723ca363faf92d756e61e82fb13e8360405161105d91815260200190565b60405180910390a387828151811061108557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151156110a3576110a081856120d7565b93505b50806110ae81612145565b915050610b83565b506b033b2e3c9fd0803ce80000008311156111135760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a20737570706c79206578636565646564000000000000000000604482015260640161050d565b61111c83611c5f565b600280546bffffffffffffffffffffffff19166001600160601b03929092169190911790558115611213576040516340c10f1960e01b8152306004820152602481018390526001600160a01b038516906340c10f1990604401602060405180830381600087803b15801561118f57600080fd5b505af11580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c79190611f29565b6112135760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45350000000000000000000000000000000000000000000000604482015260640161050d565b50505050505050565b6000546001600160a01b031633146112765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6001600160a01b0381166112f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161050d565b6112fb81611aa2565b50565b6000546001600160a01b031633146113585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6002546001600160601b03808216600160601b90920416146113bc5760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45310000000000000000000000000000000000000000000000604482015260640161050d565b33ff5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261140182611925565b6004828154811061142257634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160e081018252929091015460ff8082161515845261010082041615159383019390935262010000830463ffffffff16908201526601000000000000820461ffff16606082015268010000000000000000820465ffffffffffff9081166080830152600160701b83041660a0820152600160a01b9091046001600160601b031660c082015292915050565b6001600160a01b0381166112fb5760405162461bcd60e51b8152602060048201526024808201527f56506f6f6c733a207a65726f2061646472657373286163636f756e747c77616c6044820152636c65742960e01b606482015260840161050d565b611526816114bb565b806001600160a01b03166003838154811061155157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146115b35760405162461bcd60e51b815260206004820152601460248201527f56506f6f6c733a20756e617574686f72697a6564000000000000000000000000604482015260640161050d565b5050565b6000806115c3856113bf565b90506115cf853361151d565b60006115db8242611976565b90508381101561162d5760405162461bcd60e51b815260206004820152601d60248201527f56506f6f6c733a206e6f7420656e6f75676820746f2072656c65617365000000604482015260640161050d565b8315611639578361163b565b805b925061165e8260c001516001600160601b03168461165991906120d7565b611c5f565b6004878154811061167f57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0316600160a01b6001600160601b03938416021790556002546116c29161165991600160601b900416856120d7565b600280546001600160601b0392909216600160601b027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9092169190911790558151156117f35773909e34d3f6124c324ac83dcca84b74398a6fa17360405163a9059cbb60e01b81526001600160a01b03878116600483015260248201869052919091169063a9059cbb90604401602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190611f29565b6117ee5760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45360000000000000000000000000000000000000000000000604482015260640161050d565b6118d8565b73909e34d3f6124c324ac83dcca84b74398a6fa1736040516340c10f1960e01b81526001600160a01b0387811660048301526024820186905291909116906340c10f1990604401602060405180830381600087803b15801561185457600080fd5b505af1158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c9190611f29565b6118d85760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45370000000000000000000000000000000000000000000000604482015260640161050d565b604080516001600160a01b03871681526020810185905287917f3bfce8de0db7450cc169b94323c210e69a36c6a4a58c9f5d96bec4973adce392910160405180910390a250509392505050565b60045481106112fb5760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a20696e76616c696420706f6f6c206964000000000000000000604482015260640161050d565b6000826040015163ffffffff168210156119925750600061035f565b600064e8d4a51000846080015165ffffffffffff166119b1919061210f565b9050808460c001516001600160601b0316106119d157600091505061035f565b60008460c001516001600160601b0316826119ec919061212e565b90506000856060015161ffff1662015180611a07919061210f565b9050600081876040015163ffffffff16611a2191906120d7565b905080861015611a9757600064e8d4a510008860a0015165ffffffffffff16611a4a919061210f565b9050600083611a59898561212e565b611a63848961212e565b611a6d919061210f565b611a7791906120ef565b9050848111611a8f57611a8a818661212e565b611a92565b60005b945050505b509095945050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392871691611ba09190612020565b6000604051808303816000865af19150503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5091509150818015611c0c575080511580611c0c575080806020019051810190611c0c9190611f29565b611c585760405162461bcd60e51b815260206004820152601b60248201527f636c61696d45726332303a205452414e534645525f4641494c45440000000000604482015260640161050d565b5050505050565b6000600160601b8210611cb45760405162461bcd60e51b815260206004820152601060248201527f56506f6f6c733a20556e73616665393600000000000000000000000000000000604482015260640161050d565b5090565b80356001600160a01b0381168114611ccf57600080fd5b919050565b600082601f830112611ce4578081fd5b81356020611cf9611cf4836120b3565b612082565b8281528181019085830160e080860288018501891015611d17578687fd5b865b86811015611dc95781838b031215611d2f578788fd5b611d37612059565b8335611d428161218c565b815283870135611d518161218c565b818801526040611d62858201611de9565b908201526060611d73858201611dd7565b908201526080611d84858201611dfd565b9082015260a0611d95858201611dfd565b9082015260c0848101356001600160601b0381168114611db3578a8bfd5b9082015285529385019391810191600101611d19565b509198975050505050505050565b803561ffff81168114611ccf57600080fd5b803563ffffffff81168114611ccf57600080fd5b803565ffffffffffff81168114611ccf57600080fd5b600060208284031215611e24578081fd5b61045182611cb8565b600080600060608486031215611e41578182fd5b611e4a84611cb8565b9250611e5860208501611cb8565b9150604084013590509250925092565b60008060408385031215611e7a578182fd5b823567ffffffffffffffff80821115611e91578384fd5b818501915085601f830112611ea4578384fd5b81356020611eb4611cf4836120b3565b8083825282820191508286018a848660051b8901011115611ed3578889fd5b8896505b84871015611efc57611ee881611cb8565b835260019690960195918301918301611ed7565b5096505086013592505080821115611f12578283fd5b50611f1f85828601611cd4565b9150509250929050565b600060208284031215611f3a578081fd5b81516104518161218c565b600060208284031215611f56578081fd5b5035919050565b600060208284031215611f6e578081fd5b5051919050565b60008060408385031215611f87578182fd5b82359150611f9760208401611cb8565b90509250929050565b600080600060608486031215611fb4578283fd5b83359250611e5860208501611cb8565b60008060408385031215611fd6578182fd5b50508035926020909101359150565b600080600060608486031215611ff9578081fd5b8335925061200960208501611de9565b915061201760408501611dd7565b90509250925092565b60008251815b818110156120405760208186018101518583015201612026565b8181111561204e5782828501525b509190910192915050565b60405160e0810167ffffffffffffffff8111828210171561207c5761207c612176565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156120ab576120ab612176565b604052919050565b600067ffffffffffffffff8211156120cd576120cd612176565b5060051b60200190565b600082198211156120ea576120ea612160565b500190565b60008261210a57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561212957612129612160565b500290565b60008282101561214057612140612160565b500390565b600060001982141561215957612159612160565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146112fb57600080fdfea164736f6c6343000804000a

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061011b5760003560e01c8063715018a6116100b2578063db66bbd111610081578063f2fde38b11610066578063f2fde38b146102e8578063fc0c546a146102fb578063fe389e091461031557600080fd5b8063db66bbd1146102c2578063e11d1a98146102d557600080fd5b8063715018a61461028357806379203dc41461028b5780638da5cb5b1461029e57806392a70fb0146102af57600080fd5b80632a7d7bc5116100ee5780632a7d7bc51461021f578063366a4120146102325780635470b13b146102455780635927fca21461027057600080fd5b8063068bcd8d14610120578063085cb13f146101b7578063199cbc54146101cc5780631bfce853146101fe575b600080fd5b61013361012e366004611f45565b61031d565b6040516101ae9190600060e08201905082511515825260208301511515602083015263ffffffff604084015116604083015261ffff6060840151166060830152608083015165ffffffffffff80821660808501528060a08601511660a085015250506001600160601b0360c08401511660c083015292915050565b60405180910390f35b6101ca6101c5366004611f75565b610365565b005b6002546101e690600160601b90046001600160601b031681565b6040516001600160601b0390911681526020016101ae565b61021161020c366004611f45565b610406565b6040519081526020016101ae565b61021161022d366004611fa0565b610426565b610211610240366004611fc4565b610444565b610258610253366004611f45565b610458565b6040516001600160a01b0390911681526020016101ae565b61021161027e366004611f45565b61049f565b6101ca6104b7565b6002546101e6906001600160601b031681565b6000546001600160a01b0316610258565b6101ca6102bd366004611e2d565b610522565b6101ca6102d0366004611fe5565b610788565b6101ca6102e3366004611e68565b610aa9565b6101ca6102f6366004611e13565b61121c565b73909e34d3f6124c324ac83dcca84b74398a6fa173610258565b6101ca6112fe565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261035f826113bf565b92915050565b61036e816114bb565b610378823361151d565b806003838154811061039a57634e487b7160e01b600052603260045260246000fd5b600091825260209182902001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03938416179055604051848152918316917ff2e290194c4582e14975be0ee8a27dcb9b7eb438a3d45c1bc51dfc6fe614c1bf910160405180910390a25050565b600080610412836113bf565b60c001516001600160601b03169392505050565b6000610431836114bb565b61043c8484846115b7565b949350505050565b60006104518333846115b7565b9392505050565b600061046382611925565b6003828154811061048457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6000806104ab836113bf565b90506104518142611976565b6000546001600160a01b031633146105165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6105206000611aa2565b565b6000546001600160a01b0316331461057c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b600260015414156105cf5760405162461bcd60e51b815260206004820152601a60248201527f636c61696d45726332303a207265656e7472616e742063616c6c000000000000604482015260640161050d565b600260015573909e34d3f6124c324ac83dcca84b74398a6fa1736001600160a01b038481169082161415610773576040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561063f57600080fd5b505afa158015610653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106779190611f5d565b905060006002600c9054906101000a90046001600160601b03166001600160601b0316836001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106d357600080fd5b505afa1580156106e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070b9190611f5d565b610715919061212e565b905061072184826120d7565b8210156107705760405162461bcd60e51b815260206004820152601660248201527f56506f6f6c733a20746f6f2062696720616d6f756e7400000000000000000000604482015260640161050d565b50505b61077e848484611aff565b5050600180555050565b6000546001600160a01b031633146107e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b60006107ed846113bf565b905080602001516108405760405162461bcd60e51b815260206004820152601660248201527f56506f6f6c733a206e6f6e2d61646a75737461626c6500000000000000000000604482015260640161050d565b8060c001516001600160601b031664e8d4a51000826080015165ffffffffffff1661086b919061210f565b116108b85760405162461bcd60e51b815260206004820152601460248201527f56506f6f6c733a2066756c6c7920766573746564000000000000000000000000604482015260640161050d565b60006108cb61ffff84166201518061210f565b6108db9063ffffffff86166120d7565b905080421161092c5760405162461bcd60e51b815260206004820152601860248201527f56506f6f6c733a20746f6f206c61746520757064617465730000000000000000604482015260640161050d565b63ffffffff8416604083015261ffff83166060830152600480548391908790811061096757634e487b7160e01b600052603260045260246000fd5b6000918252602091829020835191018054848401516040808701516060880151608089015160a08a015160c0909a015161ffff1990961697151561ff00191697909717610100941515949094029390931767ffffffffffff000019166201000063ffffffff9283160267ffff000000000000191617660100000000000061ffff948516021773ffffffffffffffffffffffff000000000000000019166801000000000000000065ffffffffffff9788160273ffffffffffff0000000000000000000000000000191617600160701b9690981695909502969096176001600160a01b0316600160a01b6001600160601b0390931692909202919091179091558351918816825286169181019190915286917f17b8644f386d1c7c7138ef98b3c8035622bbe94d7be9b26f71d2654a547c2943910160405180910390a25050505050565b6000546001600160a01b03163314610b035760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b8051825114610b545760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a206c656e677468206d69736d61746368000000000000000000604482015260640161050d565b600254600454429173909e34d3f6124c324ac83dcca84b74398a6fa173916001600160601b0390911690600090815b87518110156110b657610bbc888281518110610baf57634e487b7160e01b600052603260045260246000fd5b60200260200101516114bb565b85878281518110610bdd57634e487b7160e01b600052603260045260246000fd5b60200260200101516040015163ffffffff161015610c3d5760405162461bcd60e51b815260206004820152601c60248201527f56506f6f6c733a20737461727420616c72656164792070617373656400000000604482015260640161050d565b868181518110610c5d57634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff1660001415610cc15760405162461bcd60e51b815260206004820152601860248201527f56506f6f6c733a207a65726f2073416c6c6f636174696f6e0000000000000000604482015260640161050d565b868181518110610ce157634e487b7160e01b600052603260045260246000fd5b602002602001015160a0015165ffffffffffff16878281518110610d1557634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff161015610d775760405162461bcd60e51b815260206004820152601960248201527f56506f6f6c733a20746f6f206269672073556e6c6f636b656400000000000000604482015260640161050d565b868181518110610d9757634e487b7160e01b600052603260045260246000fd5b602002602001015160c001516001600160601b0316600014610dfb5760405162461bcd60e51b815260206004820152601c60248201527f56506f6f6c733a207a65726f2076657374656420657870656374656400000000604482015260640161050d565b600064e8d4a51000888381518110610e2357634e487b7160e01b600052603260045260246000fd5b60200260200101516080015165ffffffffffff16610e41919061210f565b9050610e4d81866120d7565b94506003898381518110610e7157634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529190922001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790558751600490899084908110610ede57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015182546001810184556000938452928290208151930180549282015160408301516060840151608085015160a086015160c09096015161ffff1990971697151561ff00191697909717610100931515939093029290921767ffffffffffff000019166201000063ffffffff9092169190910267ffff000000000000191617660100000000000061ffff909216919091021773ffffffffffffffffffffffff000000000000000019166801000000000000000065ffffffffffff9586160273ffffffffffff0000000000000000000000000000191617600160701b9490921693909302176001600160a01b0316600160a01b6001600160601b0390921691909102179055885189908390811061100e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316838061102a90612145565b94507f6c5d0ef1d0199b6de41ecbce95f59643be4d723ca363faf92d756e61e82fb13e8360405161105d91815260200190565b60405180910390a387828151811061108557634e487b7160e01b600052603260045260246000fd5b602002602001015160000151156110a3576110a081856120d7565b93505b50806110ae81612145565b915050610b83565b506b033b2e3c9fd0803ce80000008311156111135760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a20737570706c79206578636565646564000000000000000000604482015260640161050d565b61111c83611c5f565b600280546bffffffffffffffffffffffff19166001600160601b03929092169190911790558115611213576040516340c10f1960e01b8152306004820152602481018390526001600160a01b038516906340c10f1990604401602060405180830381600087803b15801561118f57600080fd5b505af11580156111a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c79190611f29565b6112135760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45350000000000000000000000000000000000000000000000604482015260640161050d565b50505050505050565b6000546001600160a01b031633146112765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6001600160a01b0381166112f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161050d565b6112fb81611aa2565b50565b6000546001600160a01b031633146113585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6002546001600160601b03808216600160601b90920416146113bc5760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45310000000000000000000000000000000000000000000000604482015260640161050d565b33ff5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915261140182611925565b6004828154811061142257634e487b7160e01b600052603260045260246000fd5b60009182526020918290206040805160e081018252929091015460ff8082161515845261010082041615159383019390935262010000830463ffffffff16908201526601000000000000820461ffff16606082015268010000000000000000820465ffffffffffff9081166080830152600160701b83041660a0820152600160a01b9091046001600160601b031660c082015292915050565b6001600160a01b0381166112fb5760405162461bcd60e51b8152602060048201526024808201527f56506f6f6c733a207a65726f2061646472657373286163636f756e747c77616c6044820152636c65742960e01b606482015260840161050d565b611526816114bb565b806001600160a01b03166003838154811061155157634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316146115b35760405162461bcd60e51b815260206004820152601460248201527f56506f6f6c733a20756e617574686f72697a6564000000000000000000000000604482015260640161050d565b5050565b6000806115c3856113bf565b90506115cf853361151d565b60006115db8242611976565b90508381101561162d5760405162461bcd60e51b815260206004820152601d60248201527f56506f6f6c733a206e6f7420656e6f75676820746f2072656c65617365000000604482015260640161050d565b8315611639578361163b565b805b925061165e8260c001516001600160601b03168461165991906120d7565b611c5f565b6004878154811061167f57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0316600160a01b6001600160601b03938416021790556002546116c29161165991600160601b900416856120d7565b600280546001600160601b0392909216600160601b027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9092169190911790558151156117f35773909e34d3f6124c324ac83dcca84b74398a6fa17360405163a9059cbb60e01b81526001600160a01b03878116600483015260248201869052919091169063a9059cbb90604401602060405180830381600087803b15801561176a57600080fd5b505af115801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190611f29565b6117ee5760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45360000000000000000000000000000000000000000000000604482015260640161050d565b6118d8565b73909e34d3f6124c324ac83dcca84b74398a6fa1736040516340c10f1960e01b81526001600160a01b0387811660048301526024820186905291909116906340c10f1990604401602060405180830381600087803b15801561185457600080fd5b505af1158015611868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188c9190611f29565b6118d85760405162461bcd60e51b815260206004820152600960248201527f56506f6f6c733a45370000000000000000000000000000000000000000000000604482015260640161050d565b604080516001600160a01b03871681526020810185905287917f3bfce8de0db7450cc169b94323c210e69a36c6a4a58c9f5d96bec4973adce392910160405180910390a250509392505050565b60045481106112fb5760405162461bcd60e51b815260206004820152601760248201527f56506f6f6c733a20696e76616c696420706f6f6c206964000000000000000000604482015260640161050d565b6000826040015163ffffffff168210156119925750600061035f565b600064e8d4a51000846080015165ffffffffffff166119b1919061210f565b9050808460c001516001600160601b0316106119d157600091505061035f565b60008460c001516001600160601b0316826119ec919061212e565b90506000856060015161ffff1662015180611a07919061210f565b9050600081876040015163ffffffff16611a2191906120d7565b905080861015611a9757600064e8d4a510008860a0015165ffffffffffff16611a4a919061210f565b9050600083611a59898561212e565b611a63848961212e565b611a6d919061210f565b611a7791906120ef565b9050848111611a8f57611a8a818661212e565b611a92565b60005b945050505b509095945050505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905291516000928392871691611ba09190612020565b6000604051808303816000865af19150503d8060008114611bdd576040519150601f19603f3d011682016040523d82523d6000602084013e611be2565b606091505b5091509150818015611c0c575080511580611c0c575080806020019051810190611c0c9190611f29565b611c585760405162461bcd60e51b815260206004820152601b60248201527f636c61696d45726332303a205452414e534645525f4641494c45440000000000604482015260640161050d565b5050505050565b6000600160601b8210611cb45760405162461bcd60e51b815260206004820152601060248201527f56506f6f6c733a20556e73616665393600000000000000000000000000000000604482015260640161050d565b5090565b80356001600160a01b0381168114611ccf57600080fd5b919050565b600082601f830112611ce4578081fd5b81356020611cf9611cf4836120b3565b612082565b8281528181019085830160e080860288018501891015611d17578687fd5b865b86811015611dc95781838b031215611d2f578788fd5b611d37612059565b8335611d428161218c565b815283870135611d518161218c565b818801526040611d62858201611de9565b908201526060611d73858201611dd7565b908201526080611d84858201611dfd565b9082015260a0611d95858201611dfd565b9082015260c0848101356001600160601b0381168114611db3578a8bfd5b9082015285529385019391810191600101611d19565b509198975050505050505050565b803561ffff81168114611ccf57600080fd5b803563ffffffff81168114611ccf57600080fd5b803565ffffffffffff81168114611ccf57600080fd5b600060208284031215611e24578081fd5b61045182611cb8565b600080600060608486031215611e41578182fd5b611e4a84611cb8565b9250611e5860208501611cb8565b9150604084013590509250925092565b60008060408385031215611e7a578182fd5b823567ffffffffffffffff80821115611e91578384fd5b818501915085601f830112611ea4578384fd5b81356020611eb4611cf4836120b3565b8083825282820191508286018a848660051b8901011115611ed3578889fd5b8896505b84871015611efc57611ee881611cb8565b835260019690960195918301918301611ed7565b5096505086013592505080821115611f12578283fd5b50611f1f85828601611cd4565b9150509250929050565b600060208284031215611f3a578081fd5b81516104518161218c565b600060208284031215611f56578081fd5b5035919050565b600060208284031215611f6e578081fd5b5051919050565b60008060408385031215611f87578182fd5b82359150611f9760208401611cb8565b90509250929050565b600080600060608486031215611fb4578283fd5b83359250611e5860208501611cb8565b60008060408385031215611fd6578182fd5b50508035926020909101359150565b600080600060608486031215611ff9578081fd5b8335925061200960208501611de9565b915061201760408501611dd7565b90509250925092565b60008251815b818110156120405760208186018101518583015201612026565b8181111561204e5782828501525b509190910192915050565b60405160e0810167ffffffffffffffff8111828210171561207c5761207c612176565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156120ab576120ab612176565b604052919050565b600067ffffffffffffffff8211156120cd576120cd612176565b5060051b60200190565b600082198211156120ea576120ea612160565b500190565b60008261210a57634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561212957612129612160565b500290565b60008282101561214057612140612160565b500390565b600060001982141561215957612159612160565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146112fb57600080fdfea164736f6c6343000804000a

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.