Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 239 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Vester | 14268633 | 998 days ago | IN | 0 ETH | 0.00180795 | ||||
Set Vester | 14268632 | 998 days ago | IN | 0 ETH | 0.00188721 | ||||
Set Vester | 14268630 | 998 days ago | IN | 0 ETH | 0.00174352 | ||||
Set Vester | 14268629 | 998 days ago | IN | 0 ETH | 0.00155643 | ||||
Set Hodler Claim... | 14268627 | 998 days ago | IN | 0 ETH | 0.00150685 | ||||
Set Distributer | 14268626 | 998 days ago | IN | 0 ETH | 0.00134276 | ||||
Exit | 14267995 | 998 days ago | IN | 0 ETH | 0.00693751 | ||||
Exit | 14261243 | 999 days ago | IN | 0 ETH | 0.00575491 | ||||
Exit | 14257353 | 1000 days ago | IN | 0 ETH | 0.01197883 | ||||
Exit | 14255005 | 1000 days ago | IN | 0 ETH | 0.00577941 | ||||
Exit | 14252357 | 1001 days ago | IN | 0 ETH | 0.01315716 | ||||
Exit | 14252169 | 1001 days ago | IN | 0 ETH | 0.01687887 | ||||
Exit | 14246459 | 1002 days ago | IN | 0 ETH | 0.01112051 | ||||
Exit | 14245144 | 1002 days ago | IN | 0 ETH | 0.00591447 | ||||
Exit | 14245033 | 1002 days ago | IN | 0 ETH | 0.00583757 | ||||
Exit | 14241643 | 1002 days ago | IN | 0 ETH | 0.00576436 | ||||
Exit | 14239560 | 1003 days ago | IN | 0 ETH | 0.00667022 | ||||
Exit | 14236603 | 1003 days ago | IN | 0 ETH | 0.00435223 | ||||
Exit | 14232546 | 1004 days ago | IN | 0 ETH | 0.01212529 | ||||
Exit | 14231519 | 1004 days ago | IN | 0 ETH | 0.02336608 | ||||
Exit | 14230255 | 1004 days ago | IN | 0 ETH | 0.01016912 | ||||
Exit | 14225153 | 1005 days ago | IN | 0 ETH | 0.01103015 | ||||
Exit | 14204361 | 1008 days ago | IN | 0 ETH | 0.00564228 | ||||
Exit | 14203886 | 1008 days ago | IN | 0 ETH | 0.00552486 | ||||
Exit | 14191460 | 1010 days ago | IN | 0 ETH | 0.00603268 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GROVesting
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPLv3 pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; interface IMintable { function mint(address _receiver, uint256 _amount) external; } interface IMigrator { function migrate( address account, uint256 total, uint256 startTime ) external; } interface IHodler { function add(uint256 amount) external; } contract GROVesting is Ownable { using SafeERC20 for IERC20; uint256 internal constant ONE_YEAR_SECONDS = 31556952; // average year (including leap years) in seconds uint256 private constant DEFAULT_MAX_LOCK_PERIOD = ONE_YEAR_SECONDS * 1; // 1 years period uint256 public constant PERCENTAGE_DECIMAL_FACTOR = 10000; // BP uint256 internal constant TWO_WEEKS = 604800; // two weeks in seconds uint256 private lockPeriodFactor = PERCENTAGE_DECIMAL_FACTOR; IMintable public distributer; // percentage of tokens that are available immediatly when a vesting postiion is created uint256 public immutable initUnlockedPercent; // Active airdrops and liquidity pools mapping(address => bool) public vesters; uint256 public totalLockedAmount; // vesting actions uint256 constant CREATE = 0; uint256 constant ADD = 1; uint256 constant EXIT = 2; uint256 constant EXTEND = 3; address public hodlerClaims; IMigrator public migrator; struct AccountInfo { uint256 total; uint256 startTime; } mapping(address => AccountInfo) public accountInfos; mapping(address => uint256) public withdrawals; // Start time for the global vesting curve uint256 public globalStartTime; event LogVester(address vester, bool status); event LogMaxLockPeriod(uint256 newMaxPeriod); event LogNewMigrator(address newMigrator); event LogNewDistributer(address newDistributer); event LogNewBonusContract(address bonusContract); event LogVest(address indexed user, uint256 totalLockedAmount, uint256 amount, AccountInfo vesting); event LogExit(address indexed user, uint256 totalLockedAmount, uint256 vesting, uint256 unlocked, uint256 penalty); event LogExtend(address indexed user, uint256 newPeriod, AccountInfo newVesting); event LogMigrate(address indexed user, AccountInfo vesting); constructor(uint256 _initUnlockedPercent) { initUnlockedPercent = _initUnlockedPercent; globalStartTime = block.timestamp; } function setDistributer(address _distributer) external onlyOwner { distributer = IMintable(_distributer); emit LogNewDistributer(_distributer); } // @notice Estimation for how much groove is in the vesting contract // @dev Total groove is estimated by multiplying the total gro amount with the % amount has vested // according to the global vesting curve. As time passes, there will be less global groove, as // each individual users position will vest. The vesting can be estimated by continiously shifting, // The global vesting curves start date (and end date by extension), which gets updated whenever user // interacts with the vesting contract ( see updateGlobalTime ) function totalGroove() external view returns (uint256) { uint256 _maxLock = maxLockPeriod(); uint256 _globalEndTime = (globalStartTime + _maxLock); uint256 _now = block.timestamp; if (_now >= _globalEndTime) { return 0; } uint256 total = totalLockedAmount; return ((total * ((PERCENTAGE_DECIMAL_FACTOR - initUnlockedPercent) * (_globalEndTime - _now))) / _maxLock) / PERCENTAGE_DECIMAL_FACTOR; } // @notice Calculate the start point of the global vesting curve // @param amount gro token amount // @param startTime users position startTime // @param newStartTime users new startime if applicable, 0 otherwise. // @param action user interaction with the vesting contract : 0) create/add position 1) exit position 2) extend position // @dev The global vesting curve is an estimation to the amount of groove in the contract. The curve dictates a linear decline // of the amount of groove in the contract. As users interact with the contract the start date of the curve gets adjusted to // capture changes in individual users vesting position at that specific point in time. depending on the type of interaction // the user takes, the new curve will be defined as: // Create position: // g_st = g_st * (g_amt - u_amt) / (g_amt) + (u_st * u_amt) / (g_amt) // // Add to position: // (g_st * g_amt - u_old_st * u_tot + u_new_st * (u_tot + u_amt)) / (g_amt + u_amt) // // Exit position: // g_st = g_st + (g_st - u_st) * u_amt / (g_amt) // // Extend position: // g_st = g_st + (u_tot * u_st) / (g_amt) // // Where: // g_st : global vesting curve start time // u_st : user start time // g_amt : global gro amount // u_amt : user gro amount added // u_tot : user current gro amount // // Special care needs to be taken as positions that dont exit will cause this to drift, when a user with an position that // has 'overvested' takes an action, this needs to be accounted for. Unaccounted for drift (users that dont interact with the contract // after their vesting period has expired) will have to be dealt with offchain. function updateGlobalTime( uint256 amount, uint256 startTime, uint256 userTotal, uint256 newStartTime, uint256 action ) internal { uint256 _totalLockedAmount = totalLockedAmount; if (action == CREATE) { // When creating a position we need to add the new amount to the global total _totalLockedAmount = _totalLockedAmount + amount; } else if (action == EXIT) { // When exiting we remove from the global total _totalLockedAmount = _totalLockedAmount - amount; } else if (_totalLockedAmount == userTotal) { globalStartTime = startTime; return; } uint256 _globalStartTime = globalStartTime; if (_totalLockedAmount == 0) { return; } if (action == ADD) { // adding to an existing position // formula for calculating add to position, including dealing with any drift caused by over vesting: // (g_st * g_amt - u_old_st * u_tot + u_new_st * (u_tot + u_amt)) / (g_amt + u_amt) // this removes the impact of the users old position, and adds in the // new position (user old amount + user added amount) based on the new start date. uint256 newWeightedTimeSum = (_globalStartTime * _totalLockedAmount + newStartTime * (userTotal + amount)) - startTime * userTotal; globalStartTime = newWeightedTimeSum / (_totalLockedAmount + amount); } else if (action == EXIT) { // exiting an existing position // note that g_amt = prev_g_amt - u_amt // g_st = g_st + (g_st - u_st) * u_amt / (g_amt) globalStartTime = uint256( int256(_globalStartTime) + ((int256(_globalStartTime) - int256(startTime)) * int256(amount)) / int256(_totalLockedAmount) ); } else if (action == EXTEND) { // extending an existing position // g_st = g_st + (u_tot * (u_new_st - u_st)) / (g_amt) globalStartTime = _globalStartTime + (userTotal * (newStartTime - startTime)) / _totalLockedAmount; } else { // Createing new vesting positions // note that g_amt = prev_g_amt + u_amt // g_st = g_st + (g_amt - u_amt) / (g_amt) + (u_st * u_amt) / (g_amt) globalStartTime = (_globalStartTime * (_totalLockedAmount - amount)) / _totalLockedAmount + (startTime * amount) / _totalLockedAmount; } } /// @notice Set the vesting bonus contract /// @param _hodlerClaims Address of vesting bonus contract function setHodlerClaims(address _hodlerClaims) external onlyOwner { hodlerClaims = _hodlerClaims; emit LogNewBonusContract(_hodlerClaims); } /// @notice Get the current max lock period - dictates the end date of users vests function maxLockPeriod() public view returns (uint256) { return (DEFAULT_MAX_LOCK_PERIOD * lockPeriodFactor) / PERCENTAGE_DECIMAL_FACTOR; } // Adds a new contract that can create vesting positions function setVester(address vester, bool status) public onlyOwner { vesters[vester] = status; emit LogVester(vester, status); } /// @notice Sets amount of time the vesting lasts /// @param maxPeriodFactor Factor to apply to the vesting period function setMaxLockPeriod(uint256 maxPeriodFactor) external onlyOwner { // cant extend the vesting period more than 200% require(maxPeriodFactor <= 20000, "adjustLockPeriod: newFactor > 20000"); // max Lock period needs to be longer than a month require(maxPeriodFactor * DEFAULT_MAX_LOCK_PERIOD / PERCENTAGE_DECIMAL_FACTOR > TWO_WEEKS * 2, "adjustLockPeriod: newFactor to small"); lockPeriodFactor = maxPeriodFactor; emit LogMaxLockPeriod(maxLockPeriod()); } /// @notice Set the new vesting contract that users can migrate to /// @param _migrator Address of new vesting contract function setMigrator(address _migrator) external onlyOwner { migrator = IMigrator(_migrator); emit LogNewMigrator(_migrator); } /// @notice Create or modify a vesting position /// @param account Account which to add vesting position for /// @param amount Amount to add to vesting position function vest(address account, uint256 amount) external { require(vesters[msg.sender], "vest: !vester"); require(account != address(0), "vest: !account"); require(amount > 0, "vest: !amount"); AccountInfo memory ai = accountInfos[account]; uint256 _maxLock = maxLockPeriod(); if (ai.startTime == 0) { // If no position exists, create a new one ai.startTime = block.timestamp; updateGlobalTime(amount, ai.startTime, 0, 0, CREATE); } else { // If a position exists, update user's startdate by weighting current time based on GRO being added uint256 newStartTime = (ai.startTime * ai.total + block.timestamp * amount) / (ai.total + amount); if (newStartTime + _maxLock <= block.timestamp) { newStartTime = block.timestamp - (_maxLock) + TWO_WEEKS; } updateGlobalTime(amount, ai.startTime, ai.total, newStartTime, ADD); ai.startTime = newStartTime; } // update user position ai.total += amount; accountInfos[account] = ai; totalLockedAmount += amount; emit LogVest(account, totalLockedAmount, amount, ai); } /// @notice Extend vesting period /// @param extension extension to current vesting period function extend(uint256 extension) external { require(extension <= PERCENTAGE_DECIMAL_FACTOR, "extend: extension > 100%"); AccountInfo storage ai = accountInfos[msg.sender]; // check if user has a position before extending uint256 total = ai.total; require(total > 0, "extend: no vesting"); uint256 _maxLock = maxLockPeriod(); uint256 startTime = ai.startTime; uint256 newPeriod; uint256 newStartTime; // if the position is over vested, set the extension by moving the start time back from the current // block by (max lock time) - (desired extension). if (startTime + _maxLock < block.timestamp) { newPeriod = _maxLock - ((_maxLock * extension) / PERCENTAGE_DECIMAL_FACTOR); newStartTime = block.timestamp - newPeriod; } else { newPeriod = (_maxLock * extension) / PERCENTAGE_DECIMAL_FACTOR; // Cannot extend pass max lock period, just set startTime to current block if (startTime + newPeriod >= block.timestamp) { newStartTime = block.timestamp; } else { newStartTime = startTime + newPeriod; } } ai.startTime = newStartTime; accountInfos[msg.sender] = ai; // Calculate the difference between the original start time and the new updateGlobalTime(0, startTime, total, newStartTime, EXTEND); emit LogExtend(msg.sender, newStartTime, ai); } /// @notice Claim all vested tokens, transfering any unclaimed to the hodler pool function exit() external { (uint256 total, uint256 unlocked, uint256 startTime, ) = unlockedBalance(msg.sender); require(total > 0, "exit: no vesting"); uint256 penalty = total - unlocked; delete accountInfos[msg.sender]; // record account total withdrawal withdrawals[msg.sender] += unlocked; updateGlobalTime(total, startTime, 0, 0, EXIT); totalLockedAmount -= total; if (penalty > 0) { IHodler(hodlerClaims).add(penalty); } distributer.mint(msg.sender, unlocked); emit LogExit(msg.sender, totalLockedAmount, total, unlocked, penalty); } /// @notice Migrate sender's vesting data into a new contract function migrate() external { require(address(migrator) != address(0), "migrate: !migrator"); AccountInfo memory ai = accountInfos[msg.sender]; require(ai.total > 0, "migrate: no vesting"); migrator.migrate(msg.sender, ai.total, ai.startTime); emit LogMigrate(msg.sender, ai); } /// @notice See the amount of vested assets the account has accumulated /// @param account Account to get vested amount for function unlockedBalance(address account) private view returns ( uint256 total, uint256 unlocked, uint256 startTime, uint256 _endTime ) { AccountInfo memory ai = accountInfos[account]; startTime = ai.startTime; total = ai.total; if (startTime > 0) { _endTime = startTime + maxLockPeriod(); if (_endTime > block.timestamp) { unlocked = (total * initUnlockedPercent) / PERCENTAGE_DECIMAL_FACTOR; unlocked = unlocked + ((total - unlocked) * (block.timestamp - startTime)) / (_endTime - startTime); } else { unlocked = ai.total; } } } /// @notice Get total size of position, vested + vesting /// @param account Target account function totalBalance(address account) public view returns (uint256 unvested) { AccountInfo memory ai = accountInfos[account]; unvested = ai.total; } /// @notice Get current unlocked (vested) amount /// @param account Target account function vestedBalance(address account) external view returns (uint256 unvested) { ( , uint256 unlocked, , ) = unlockedBalance(account); return unlocked; } /// @notice Get the current locked (vesting amount /// @param account Target account function vestingBalance(address account) external view returns (uint256) { (uint256 total, uint256 unlocked, , ) = unlockedBalance(account); return total - unlocked; } /// @notice Get total amount of gro minted to user /// @param account Target account /// @dev As users can exit and create new vesting positions, this will /// tell the user how much gro they've accrued over all. function totalWithdrawn(address account) external view returns (uint256) { return withdrawals[account]; } /// @notice Get the start and end date for a vesting position /// @param account Target account /// @dev userfull for showing the amount of time you've got left function getVestingDates(address account) external view returns (uint256, uint256) { AccountInfo storage ai = accountInfos[account]; uint256 _startDate = ai.startTime; require(_startDate > 0, 'getVestingDates: No active position'); uint256 _endDate = _startDate + maxLockPeriod(); return (_startDate, _endDate); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// 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); } }
// 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; } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_initUnlockedPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalLockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vesting","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlocked","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"LogExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPeriod","type":"uint256"},{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"indexed":false,"internalType":"struct GROVesting.AccountInfo","name":"newVesting","type":"tuple"}],"name":"LogExtend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxPeriod","type":"uint256"}],"name":"LogMaxLockPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"indexed":false,"internalType":"struct GROVesting.AccountInfo","name":"vesting","type":"tuple"}],"name":"LogMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bonusContract","type":"address"}],"name":"LogNewBonusContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDistributer","type":"address"}],"name":"LogNewDistributer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMigrator","type":"address"}],"name":"LogNewMigrator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalLockedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"indexed":false,"internalType":"struct GROVesting.AccountInfo","name":"vesting","type":"tuple"}],"name":"LogVest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vester","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"LogVester","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"PERCENTAGE_DECIMAL_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountInfos","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributer","outputs":[{"internalType":"contract IMintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"extension","type":"uint256"}],"name":"extend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hodlerClaims","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initUnlockedPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"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":[{"internalType":"address","name":"_distributer","type":"address"}],"name":"setDistributer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hodlerClaims","type":"address"}],"name":"setHodlerClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPeriodFactor","type":"uint256"}],"name":"setMaxLockPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vester","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setVester","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"unvested","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGroove","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"vest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vestedBalance","outputs":[{"internalType":"uint256","name":"unvested","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vesters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"vestingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405261271060015534801561001657600080fd5b506040516118413803806118418339810160408190526100359161009a565b61003e3361004a565b608052426009556100b2565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ab578081fd5b5051919050565b6080516117666100db6000396000818161028c01528181610e7c015261122301526117666000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9262a2116101045780639714378c116100a2578063e01aff4e11610071578063e01aff4e1461044f578063e583077014610457578063e9fad8ee1461046a578063f2fde38b1461047257600080fd5b80639714378c146104175780639d81ff151461042a578063a898e0f414610433578063ae70b98a1461044657600080fd5b80638da5cb5b116100de5780638da5cb5b146103d85780638fd3ab80146103e95780639114557e146103f15780639161be991461040457600080fd5b80637a9262a21461037e5780637cd07e471461039e57806387cad0bf146103b157600080fd5b80633509551011610171578063646442d41161014b578063646442d4146102f15780636eacd3981461031c578063715018a614610363578063735570131461036b57600080fd5b806335095510146102ae5780634b1d29b4146102d657806355889d01146102de57600080fd5b8063192399d1116101ad578063192399d11461024c57806323cf31181461025f5780632797c6c8146102745780632ee8a2511461028757600080fd5b806305a9f274146101d45780630a64143a146101f05780631501ea1c14610219575b600080fd5b6101dd60045481565b6040519081526020015b60405180910390f35b6101dd6101fe36600461147d565b6001600160a01b031660009081526008602052604090205490565b61023c61022736600461147d565b60036020526000908152604090205460ff1681565b60405190151581526020016101e7565b6101dd61025a36600461147d565b610485565b61027261026d36600461147d565b6104ad565b005b6102726102823660046114d8565b610535565b6101dd7f000000000000000000000000000000000000000000000000000000000000000081565b6102c16102bc36600461147d565b61079c565b604080519283526020830191909152016101e7565b6101dd610836565b6102726102ec366004611501565b610868565b600554610304906001600160a01b031681565b6040516001600160a01b0390911681526020016101e7565b6101dd61032a36600461147d565b6001600160a01b031660009081526007602090815260409182902082518084019093528054808452600190910154929091019190915290565b6102726109b9565b61027261037936600461149e565b6109ef565b6101dd61038c36600461147d565b60086020526000908152604090205481565b600654610304906001600160a01b031681565b6102c16103bf36600461147d565b6007602052600090815260409020805460019091015482565b6000546001600160a01b0316610304565b610272610a7c565b6101dd6103ff36600461147d565b610beb565b61027261041236600461147d565b610c02565b610272610425366004611501565b610c7a565b6101dd60095481565b600254610304906001600160a01b031681565b6101dd61271081565b6101dd610e35565b61027261046536600461147d565b610ed4565b610272610f4c565b61027261048036600461147d565b611125565b6000806000610493846111c0565b50509150915080826104a591906116ed565b949350505050565b6000546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790611519565b60405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91fd088d16d243fa0cecbd79d788f3ec61b57f58cd2574924554dfa4db669379906020015b60405180910390a150565b3360009081526003602052604090205460ff166105845760405162461bcd60e51b815260206004820152600d60248201526c3b32b9ba1d1010bb32b9ba32b960991b60448201526064016104d7565b6001600160a01b0382166105cb5760405162461bcd60e51b815260206004820152600e60248201526d1d995cdd0e88085858d8dbdd5b9d60921b60448201526064016104d7565b6000811161060b5760405162461bcd60e51b815260206004820152600d60248201526c1d995cdd0e8808585b5bdd5b9d609a1b60448201526064016104d7565b6001600160a01b0382166000908152600760209081526040808320815180830190925280548252600101549181019190915290610646610836565b905081602001516000141561067157426020830181905261066c908490600080806112a4565b6106f9565b81516000906106819085906115b2565b61068b854261168f565b8451602086015161069c919061168f565b6106a691906115b2565b6106b091906115f8565b9050426106bd83836115b2565b116106dd5762093a806106d083426116ed565b6106da91906115b2565b90505b6106f384846020015185600001518460016112a4565b60208301525b828260000181815161070b91906115b2565b9052506001600160a01b038416600090815260076020908152604082208451815590840151600190910155600480548592906107489084906115b2565b92505081905550836001600160a01b03167f6b11c58d2eb1a4b0edf799ed7a00f78c5f6af22052efb140c6739f6fed64b1d1600454858560405161078e9392919061154e565b60405180910390a250505050565b6001600160a01b03811660009081526007602052604081206001810154829190806108155760405162461bcd60e51b815260206004820152602360248201527f67657456657374696e6744617465733a204e6f2061637469766520706f73697460448201526234b7b760e91b60648201526084016104d7565b600061081f610836565b61082990836115b2565b9196919550909350505050565b60006127106001546301e18558600161084f919061168f565b610859919061168f565b61086391906115f8565b905090565b6000546001600160a01b031633146108925760405162461bcd60e51b81526004016104d790611519565b614e208111156108f05760405162461bcd60e51b815260206004820152602360248201527f61646a7573744c6f636b506572696f643a206e6577466163746f72203e20323060448201526203030360ec1b60648201526084016104d7565b6108fe62093a80600261168f565b6127106109106301e18558600161168f565b61091a908461168f565b61092491906115f8565b1161097d5760405162461bcd60e51b8152602060048201526024808201527f61646a7573744c6f636b506572696f643a206e6577466163746f7220746f20736044820152631b585b1b60e21b60648201526084016104d7565b60018190557fd12d722fd5b610353ee59948c18616c783d428b74e8825fe626d723a2b9219936109ab610836565b60405190815260200161052a565b6000546001600160a01b031633146109e35760405162461bcd60e51b81526004016104d790611519565b6109ed6000611411565b565b6000546001600160a01b03163314610a195760405162461bcd60e51b81526004016104d790611519565b6001600160a01b038216600081815260036020908152604091829020805460ff19168515159081179091558251938452908301527fe6271b811f6fb13c1c30d013cd66d368ae72b737f4f2d81d4b921125b5c7f9cd910160405180910390a15050565b6006546001600160a01b0316610ac95760405162461bcd60e51b815260206004820152601260248201527136b4b3b930ba329d1010b6b4b3b930ba37b960711b60448201526064016104d7565b336000908152600760209081526040918290208251808401909352805480845260019091015491830191909152610b385760405162461bcd60e51b81526020600482015260136024820152726d6967726174653a206e6f2076657374696e6760681b60448201526064016104d7565b6006548151602083015160405163fc22d0e560e01b8152336004820152602481019290925260448201526001600160a01b039091169063fc22d0e590606401600060405180830381600087803b158015610b9157600080fd5b505af1158015610ba5573d6000803e3d6000fd5b50506040805184518152602080860151908201523393507fddec2939b5aab60fdf05651354146fa36cbda9dc9a48aadc41563724c66e044892500160405180910390a250565b600080610bf7836111c0565b509095945050505050565b6000546001600160a01b03163314610c2c5760405162461bcd60e51b81526004016104d790611519565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fe7a075c902150a938be60b2bd2c1c87d5c72a518d4802813b60136c9d8e50c689060200161052a565b612710811115610ccc5760405162461bcd60e51b815260206004820152601860248201527f657874656e643a20657874656e73696f6e203e2031303025000000000000000060448201526064016104d7565b336000908152600760205260409020805480610d1f5760405162461bcd60e51b8152602060048201526012602482015271657874656e643a206e6f2076657374696e6760701b60448201526064016104d7565b6000610d29610836565b600184015490915060008042610d3f85856115b2565b1015610d7957612710610d52888661168f565b610d5c91906115f8565b610d6690856116ed565b9150610d7282426116ed565b9050610db6565b612710610d86888661168f565b610d9091906115f8565b915042610d9d83856115b2565b10610da9575042610db6565b610db382846115b2565b90505b60018087018281553360009081526007602052604081208954815591549190920155610de69084878460036112a4565b6040805182815287546020820152600188015481830152905133917f341e8f0c54efdda61b9157e16a7841dde3598db5b97cebe85e4247b94df76ecf919081900360600190a250505050505050565b600080610e40610836565b9050600081600954610e5291906115b2565b905042818110610e66576000935050505090565b60045461271084610e7784866116ed565b610ea37f00000000000000000000000000000000000000000000000000000000000000006127106116ed565b610ead919061168f565b610eb7908461168f565b610ec191906115f8565b610ecb91906115f8565b94505050505090565b6000546001600160a01b03163314610efe5760405162461bcd60e51b81526004016104d790611519565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f862b2acce08b11b4a0e27522a624de74641e1eecca1c273cad02b3677a0efe309060200161052a565b6000806000610f5a336111c0565b5092509250925060008311610fa45760405162461bcd60e51b815260206004820152601060248201526f657869743a206e6f2076657374696e6760801b60448201526064016104d7565b6000610fb083856116ed565b3360009081526007602090815260408083208381556001018390556008909152812080549293508592909190610fe79084906115b2565b90915550610ffc9050848360008060026112a4565b836004600082825461100e91906116ed565b9091555050801561107857600554604051630801f16960e11b8152600481018390526001600160a01b0390911690631003e2d290602401600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505050505b6002546040516340c10f1960e01b8152336004820152602481018590526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505060045460408051918252602082018890528101869052606081018490523392507f8e16345a0859eeb9fedbe98476227cfc6c092004cbf928666d6728362d42f188915060800161078e565b6000546001600160a01b0316331461114f5760405162461bcd60e51b81526004016104d790611519565b6001600160a01b0381166111b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d7565b6111bd81611411565b50565b6001600160a01b0381166000908152600760209081526040808320815180830190925280548083526001909101549282018390529291908290821561129c57611207610836565b61121190846115b2565b915042821115611297576127106112487f00000000000000000000000000000000000000000000000000000000000000008761168f565b61125291906115f8565b935061125e83836116ed565b61126884426116ed565b61127286886116ed565b61127c919061168f565b61128691906115f8565b61129090856115b2565b935061129c565b805193505b509193509193565b600454816112bd576112b686826115b2565b90506112e3565b60028214156112d0576112b686826116ed565b838114156112e35750600984905561140a565b600954816112f257505061140a565b6001831415611358576000611307868861168f565b61131189886115b2565b61131b908761168f565b611325858561168f565b61132f91906115b2565b61133991906116ed565b905061134588846115b2565b61134f90826115f8565b60095550611407565b600283141561139357818761136d88846116ae565b611377919061160c565b61138191906115ca565b61138b9082611571565b600955611407565b60038314156113c557816113a787866116ed565b6113b1908761168f565b6113bb91906115f8565b61138b90826115b2565b816113d0888861168f565b6113da91906115f8565b826113e589826116ed565b6113ef908461168f565b6113f991906115f8565b61140391906115b2565b6009555b50505b5050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461147857600080fd5b919050565b60006020828403121561148e578081fd5b61149782611461565b9392505050565b600080604083850312156114b0578081fd5b6114b983611461565b9150602083013580151581146114cd578182fd5b809150509250929050565b600080604083850312156114ea578182fd5b6114f383611461565b946020939093013593505050565b600060208284031215611512578081fd5b5035919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8381526020808201849052825160408301528201516060820152608081016104a5565b600080821280156001600160ff1b038490038513161561159357611593611704565b600160ff1b83900384128116156115ac576115ac611704565b50500190565b600082198211156115c5576115c5611704565b500190565b6000826115d9576115d961171a565b600160ff1b8214600019841416156115f3576115f3611704565b500590565b6000826116075761160761171a565b500490565b60006001600160ff1b038184138284138082168684048611161561163257611632611704565b600160ff1b8487128281168783058912161561165057611650611704565b85871292508782058712848416161561166b5761166b611704565b8785058712818416161561168157611681611704565b505050929093029392505050565b60008160001904831182151516156116a9576116a9611704565b500290565b60008083128015600160ff1b8501841216156116cc576116cc611704565b6001600160ff1b03840183138116156116e7576116e7611704565b50500390565b6000828210156116ff576116ff611704565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea26469706673582212206959ccef81a4dd5c75fca0b0e07867a370f00ded4cc81b7a205ae3670b73489c64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9262a2116101045780639714378c116100a2578063e01aff4e11610071578063e01aff4e1461044f578063e583077014610457578063e9fad8ee1461046a578063f2fde38b1461047257600080fd5b80639714378c146104175780639d81ff151461042a578063a898e0f414610433578063ae70b98a1461044657600080fd5b80638da5cb5b116100de5780638da5cb5b146103d85780638fd3ab80146103e95780639114557e146103f15780639161be991461040457600080fd5b80637a9262a21461037e5780637cd07e471461039e57806387cad0bf146103b157600080fd5b80633509551011610171578063646442d41161014b578063646442d4146102f15780636eacd3981461031c578063715018a614610363578063735570131461036b57600080fd5b806335095510146102ae5780634b1d29b4146102d657806355889d01146102de57600080fd5b8063192399d1116101ad578063192399d11461024c57806323cf31181461025f5780632797c6c8146102745780632ee8a2511461028757600080fd5b806305a9f274146101d45780630a64143a146101f05780631501ea1c14610219575b600080fd5b6101dd60045481565b6040519081526020015b60405180910390f35b6101dd6101fe36600461147d565b6001600160a01b031660009081526008602052604090205490565b61023c61022736600461147d565b60036020526000908152604090205460ff1681565b60405190151581526020016101e7565b6101dd61025a36600461147d565b610485565b61027261026d36600461147d565b6104ad565b005b6102726102823660046114d8565b610535565b6101dd7f00000000000000000000000000000000000000000000000000000000000003e881565b6102c16102bc36600461147d565b61079c565b604080519283526020830191909152016101e7565b6101dd610836565b6102726102ec366004611501565b610868565b600554610304906001600160a01b031681565b6040516001600160a01b0390911681526020016101e7565b6101dd61032a36600461147d565b6001600160a01b031660009081526007602090815260409182902082518084019093528054808452600190910154929091019190915290565b6102726109b9565b61027261037936600461149e565b6109ef565b6101dd61038c36600461147d565b60086020526000908152604090205481565b600654610304906001600160a01b031681565b6102c16103bf36600461147d565b6007602052600090815260409020805460019091015482565b6000546001600160a01b0316610304565b610272610a7c565b6101dd6103ff36600461147d565b610beb565b61027261041236600461147d565b610c02565b610272610425366004611501565b610c7a565b6101dd60095481565b600254610304906001600160a01b031681565b6101dd61271081565b6101dd610e35565b61027261046536600461147d565b610ed4565b610272610f4c565b61027261048036600461147d565b611125565b6000806000610493846111c0565b50509150915080826104a591906116ed565b949350505050565b6000546001600160a01b031633146104e05760405162461bcd60e51b81526004016104d790611519565b60405180910390fd5b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f91fd088d16d243fa0cecbd79d788f3ec61b57f58cd2574924554dfa4db669379906020015b60405180910390a150565b3360009081526003602052604090205460ff166105845760405162461bcd60e51b815260206004820152600d60248201526c3b32b9ba1d1010bb32b9ba32b960991b60448201526064016104d7565b6001600160a01b0382166105cb5760405162461bcd60e51b815260206004820152600e60248201526d1d995cdd0e88085858d8dbdd5b9d60921b60448201526064016104d7565b6000811161060b5760405162461bcd60e51b815260206004820152600d60248201526c1d995cdd0e8808585b5bdd5b9d609a1b60448201526064016104d7565b6001600160a01b0382166000908152600760209081526040808320815180830190925280548252600101549181019190915290610646610836565b905081602001516000141561067157426020830181905261066c908490600080806112a4565b6106f9565b81516000906106819085906115b2565b61068b854261168f565b8451602086015161069c919061168f565b6106a691906115b2565b6106b091906115f8565b9050426106bd83836115b2565b116106dd5762093a806106d083426116ed565b6106da91906115b2565b90505b6106f384846020015185600001518460016112a4565b60208301525b828260000181815161070b91906115b2565b9052506001600160a01b038416600090815260076020908152604082208451815590840151600190910155600480548592906107489084906115b2565b92505081905550836001600160a01b03167f6b11c58d2eb1a4b0edf799ed7a00f78c5f6af22052efb140c6739f6fed64b1d1600454858560405161078e9392919061154e565b60405180910390a250505050565b6001600160a01b03811660009081526007602052604081206001810154829190806108155760405162461bcd60e51b815260206004820152602360248201527f67657456657374696e6744617465733a204e6f2061637469766520706f73697460448201526234b7b760e91b60648201526084016104d7565b600061081f610836565b61082990836115b2565b9196919550909350505050565b60006127106001546301e18558600161084f919061168f565b610859919061168f565b61086391906115f8565b905090565b6000546001600160a01b031633146108925760405162461bcd60e51b81526004016104d790611519565b614e208111156108f05760405162461bcd60e51b815260206004820152602360248201527f61646a7573744c6f636b506572696f643a206e6577466163746f72203e20323060448201526203030360ec1b60648201526084016104d7565b6108fe62093a80600261168f565b6127106109106301e18558600161168f565b61091a908461168f565b61092491906115f8565b1161097d5760405162461bcd60e51b8152602060048201526024808201527f61646a7573744c6f636b506572696f643a206e6577466163746f7220746f20736044820152631b585b1b60e21b60648201526084016104d7565b60018190557fd12d722fd5b610353ee59948c18616c783d428b74e8825fe626d723a2b9219936109ab610836565b60405190815260200161052a565b6000546001600160a01b031633146109e35760405162461bcd60e51b81526004016104d790611519565b6109ed6000611411565b565b6000546001600160a01b03163314610a195760405162461bcd60e51b81526004016104d790611519565b6001600160a01b038216600081815260036020908152604091829020805460ff19168515159081179091558251938452908301527fe6271b811f6fb13c1c30d013cd66d368ae72b737f4f2d81d4b921125b5c7f9cd910160405180910390a15050565b6006546001600160a01b0316610ac95760405162461bcd60e51b815260206004820152601260248201527136b4b3b930ba329d1010b6b4b3b930ba37b960711b60448201526064016104d7565b336000908152600760209081526040918290208251808401909352805480845260019091015491830191909152610b385760405162461bcd60e51b81526020600482015260136024820152726d6967726174653a206e6f2076657374696e6760681b60448201526064016104d7565b6006548151602083015160405163fc22d0e560e01b8152336004820152602481019290925260448201526001600160a01b039091169063fc22d0e590606401600060405180830381600087803b158015610b9157600080fd5b505af1158015610ba5573d6000803e3d6000fd5b50506040805184518152602080860151908201523393507fddec2939b5aab60fdf05651354146fa36cbda9dc9a48aadc41563724c66e044892500160405180910390a250565b600080610bf7836111c0565b509095945050505050565b6000546001600160a01b03163314610c2c5760405162461bcd60e51b81526004016104d790611519565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fe7a075c902150a938be60b2bd2c1c87d5c72a518d4802813b60136c9d8e50c689060200161052a565b612710811115610ccc5760405162461bcd60e51b815260206004820152601860248201527f657874656e643a20657874656e73696f6e203e2031303025000000000000000060448201526064016104d7565b336000908152600760205260409020805480610d1f5760405162461bcd60e51b8152602060048201526012602482015271657874656e643a206e6f2076657374696e6760701b60448201526064016104d7565b6000610d29610836565b600184015490915060008042610d3f85856115b2565b1015610d7957612710610d52888661168f565b610d5c91906115f8565b610d6690856116ed565b9150610d7282426116ed565b9050610db6565b612710610d86888661168f565b610d9091906115f8565b915042610d9d83856115b2565b10610da9575042610db6565b610db382846115b2565b90505b60018087018281553360009081526007602052604081208954815591549190920155610de69084878460036112a4565b6040805182815287546020820152600188015481830152905133917f341e8f0c54efdda61b9157e16a7841dde3598db5b97cebe85e4247b94df76ecf919081900360600190a250505050505050565b600080610e40610836565b9050600081600954610e5291906115b2565b905042818110610e66576000935050505090565b60045461271084610e7784866116ed565b610ea37f00000000000000000000000000000000000000000000000000000000000003e86127106116ed565b610ead919061168f565b610eb7908461168f565b610ec191906115f8565b610ecb91906115f8565b94505050505090565b6000546001600160a01b03163314610efe5760405162461bcd60e51b81526004016104d790611519565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f862b2acce08b11b4a0e27522a624de74641e1eecca1c273cad02b3677a0efe309060200161052a565b6000806000610f5a336111c0565b5092509250925060008311610fa45760405162461bcd60e51b815260206004820152601060248201526f657869743a206e6f2076657374696e6760801b60448201526064016104d7565b6000610fb083856116ed565b3360009081526007602090815260408083208381556001018390556008909152812080549293508592909190610fe79084906115b2565b90915550610ffc9050848360008060026112a4565b836004600082825461100e91906116ed565b9091555050801561107857600554604051630801f16960e11b8152600481018390526001600160a01b0390911690631003e2d290602401600060405180830381600087803b15801561105f57600080fd5b505af1158015611073573d6000803e3d6000fd5b505050505b6002546040516340c10f1960e01b8152336004820152602481018590526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156110c457600080fd5b505af11580156110d8573d6000803e3d6000fd5b505060045460408051918252602082018890528101869052606081018490523392507f8e16345a0859eeb9fedbe98476227cfc6c092004cbf928666d6728362d42f188915060800161078e565b6000546001600160a01b0316331461114f5760405162461bcd60e51b81526004016104d790611519565b6001600160a01b0381166111b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104d7565b6111bd81611411565b50565b6001600160a01b0381166000908152600760209081526040808320815180830190925280548083526001909101549282018390529291908290821561129c57611207610836565b61121190846115b2565b915042821115611297576127106112487f00000000000000000000000000000000000000000000000000000000000003e88761168f565b61125291906115f8565b935061125e83836116ed565b61126884426116ed565b61127286886116ed565b61127c919061168f565b61128691906115f8565b61129090856115b2565b935061129c565b805193505b509193509193565b600454816112bd576112b686826115b2565b90506112e3565b60028214156112d0576112b686826116ed565b838114156112e35750600984905561140a565b600954816112f257505061140a565b6001831415611358576000611307868861168f565b61131189886115b2565b61131b908761168f565b611325858561168f565b61132f91906115b2565b61133991906116ed565b905061134588846115b2565b61134f90826115f8565b60095550611407565b600283141561139357818761136d88846116ae565b611377919061160c565b61138191906115ca565b61138b9082611571565b600955611407565b60038314156113c557816113a787866116ed565b6113b1908761168f565b6113bb91906115f8565b61138b90826115b2565b816113d0888861168f565b6113da91906115f8565b826113e589826116ed565b6113ef908461168f565b6113f991906115f8565b61140391906115b2565b6009555b50505b5050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461147857600080fd5b919050565b60006020828403121561148e578081fd5b61149782611461565b9392505050565b600080604083850312156114b0578081fd5b6114b983611461565b9150602083013580151581146114cd578182fd5b809150509250929050565b600080604083850312156114ea578182fd5b6114f383611461565b946020939093013593505050565b600060208284031215611512578081fd5b5035919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8381526020808201849052825160408301528201516060820152608081016104a5565b600080821280156001600160ff1b038490038513161561159357611593611704565b600160ff1b83900384128116156115ac576115ac611704565b50500190565b600082198211156115c5576115c5611704565b500190565b6000826115d9576115d961171a565b600160ff1b8214600019841416156115f3576115f3611704565b500590565b6000826116075761160761171a565b500490565b60006001600160ff1b038184138284138082168684048611161561163257611632611704565b600160ff1b8487128281168783058912161561165057611650611704565b85871292508782058712848416161561166b5761166b611704565b8785058712818416161561168157611681611704565b505050929093029392505050565b60008160001904831182151516156116a9576116a9611704565b500290565b60008083128015600160ff1b8501841216156116cc576116cc611704565b6001600160ff1b03840183138116156116e7576116e7611704565b50500390565b6000828210156116ff576116ff611704565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea26469706673582212206959ccef81a4dd5c75fca0b0e07867a370f00ded4cc81b7a205ae3670b73489c64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _initUnlockedPercent (uint256): 1000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
471:16319:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1222:32;;;;;;;;;8305:25:6;;;8293:2;8278:18;1222:32:0;;;;;;;;16134:117;;;;;;:::i;:::-;-1:-1:-1;;;;;16224:20:0;16198:7;16224:20;;;:11;:20;;;;;;;16134:117;1176:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2677:14:6;;2670:22;2652:41;;2640:2;2625:18;1176:39:0;2607:92:6;15708:187:0;;;;;;:::i;:::-;;:::i;9803:147::-;;;;;;:::i;:::-;;:::i;:::-;;10129:1239;;;;;;:::i;:::-;;:::i;1083:44::-;;;;;16430:358;;;;;;:::i;:::-;;:::i;:::-;;;;8891:25:6;;;8947:2;8932:18;;8925:34;;;;8864:18;16430:358:0;8846:119:6;8665:151:0;;;:::i;9158:511::-;;;;;;:::i;:::-;;:::i;1411:27::-;;;;;-1:-1:-1;;;;;1411:27:0;;;;;;-1:-1:-1;;;;;1550:32:6;;;1532:51;;1520:2;1505:18;1411:27:0;1487:102:6;15168:169:0;;;;;;:::i;:::-;-1:-1:-1;;;;;15280:21:0;15228:16;15280:21;;;:12;:21;;;;;;;;;15256:45;;;;;;;;;;;;;;;;;;;;;;;;;;;15168:169;1605:92:1;;;:::i;8883:146:0:-;;;;;;:::i;:::-;;:::i;1616:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1445:25;;;;;-1:-1:-1;;;;;1445:25:0;;;1559:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;973:85:1;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;973:85;;13809:322:0;;;:::i;15434:175::-;;;;;;:::i;:::-;;:::i;8411:161::-;;;;;;:::i;:::-;;:::i;11473:1517::-;;;;;;:::i;:::-;;:::i;1715:30::-;;;;;;956:28;;;;;-1:-1:-1;;;;;956:28:0;;;746:57;;798:5;746:57;;3262:497;;;:::i;2534:165::-;;;;;;:::i;:::-;;:::i;13082:655::-;;;:::i;1846:189:1:-;;;;;;:::i;:::-;;:::i;15708:187:0:-;15772:7;15792:13;15807:16;15831:24;15847:7;15831:15;:24::i;:::-;15791:64;;;;;;15880:8;15872:5;:16;;;;:::i;:::-;15865:23;15708:187;-1:-1:-1;;;;15708:187:0:o;9803:147::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;;;;;;;;;9872:8:0::1;:31:::0;;-1:-1:-1;;;;;;9872:31:0::1;-1:-1:-1::0;;;;;9872:31:0;::::1;::::0;;::::1;::::0;;;9918:25:::1;::::0;1532:51:6;;;9918:25:0::1;::::0;1520:2:6;1505:18;9918:25:0::1;;;;;;;;9803:147:::0;:::o;10129:1239::-;10211:10;10203:19;;;;:7;:19;;;;;;;;10195:45;;;;-1:-1:-1;;;10195:45:0;;4451:2:6;10195:45:0;;;4433:21:6;4490:2;4470:18;;;4463:30;-1:-1:-1;;;4509:18:6;;;4502:43;4562:18;;10195:45:0;4423:163:6;10195:45:0;-1:-1:-1;;;;;10258:21:0;;10250:48;;;;-1:-1:-1;;;10250:48:0;;3761:2:6;10250:48:0;;;3743:21:6;3800:2;3780:18;;;3773:30;-1:-1:-1;;;3819:18:6;;;3812:44;3873:18;;10250:48:0;3733:164:6;10250:48:0;10325:1;10316:6;:10;10308:36;;;;-1:-1:-1;;;10308:36:0;;6297:2:6;10308:36:0;;;6279:21:6;6336:2;6316:18;;;6309:30;-1:-1:-1;;;6355:18:6;;;6348:43;6408:18;;10308:36:0;6269:163:6;10308:36:0;-1:-1:-1;;;;;10379:21:0;;10355;10379;;;:12;:21;;;;;;;;10355:45;;;;;;;;;;;;;;;;;;;;;;;10429:15;:13;:15::i;:::-;10410:34;;10459:2;:12;;;10475:1;10459:17;10455:710;;;10562:15;10547:12;;;:30;;;10591:52;;10608:6;;10630:1;;;10591:16;:52::i;:::-;10455:710;;;10865:8;;10786:20;;10865:17;;10876:6;;10865:17;:::i;:::-;10836:24;10854:6;10836:15;:24;:::i;:::-;10825:8;;10810:12;;;;:23;;10825:8;10810:23;:::i;:::-;:50;;;;:::i;:::-;10809:74;;;;:::i;:::-;10786:97;-1:-1:-1;10928:15:0;10901:23;10916:8;10786:97;10901:23;:::i;:::-;:42;10897:136;;853:6;10978:28;10997:8;10978:15;:28;:::i;:::-;:40;;;;:::i;:::-;10963:55;;10897:136;11046:67;11063:6;11071:2;:12;;;11085:2;:8;;;11095:12;1339:1;11046:16;:67::i;:::-;11127:12;;;:27;10455:710;11219:6;11207:2;:8;;:18;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;;11235:21:0;;;;;;:12;:21;;;;;;;:26;;;;;;;;;;;;;11271:17;:27;;11292:6;;11235:21;11271:27;;11292:6;;11271:27;:::i;:::-;;;;;;;;11322:7;-1:-1:-1;;;;;11314:47:0;;11331:17;;11350:6;11358:2;11314:47;;;;;;;;:::i;:::-;;;;;;;;10129:1239;;;;:::o;16430:358::-;-1:-1:-1;;;;;16548:21:0;;16495:7;16548:21;;;:12;:21;;;;;16600:12;;;;16495:7;;16548:21;16630:14;16622:62;;;;-1:-1:-1;;;16622:62:0;;5141:2:6;16622:62:0;;;5123:21:6;5180:2;5160:18;;;5153:30;5219:34;5199:18;;;5192:62;-1:-1:-1;;;5270:18:6;;;5263:33;5313:19;;16622:62:0;5113:225:6;16622:62:0;16694:16;16726:15;:13;:15::i;:::-;16713:28;;:10;:28;:::i;:::-;16760:10;;16694:47;;-1:-1:-1;16430:358:0;;-1:-1:-1;;;;16430:358:0:o;8665:151::-;8711:7;798:5;8764:16;;587:8;721:1;702:20;;;;:::i;:::-;8738:42;;;;:::i;:::-;8737:72;;;;:::i;:::-;8730:79;;8665:151;:::o;9158:511::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;9322:5:0::1;9303:15;:24;;9295:72;;;::::0;-1:-1:-1;;;9295:72:0;;7698:2:6;9295:72:0::1;::::0;::::1;7680:21:6::0;7737:2;7717:18;;;7710:30;7776:34;7756:18;;;7749:62;-1:-1:-1;;;7827:18:6;;;7820:33;7870:19;;9295:72:0::1;7670:225:6::0;9295:72:0::1;9516:13;853:6;9528:1;9516:13;:::i;:::-;798:5;702:20;587:8;721:1;702:20;:::i;:::-;9444:41;::::0;:15;:41:::1;:::i;:::-;:69;;;;:::i;:::-;:85;9436:134;;;::::0;-1:-1:-1;;;9436:134:0;;5545:2:6;9436:134:0::1;::::0;::::1;5527:21:6::0;5584:2;5564:18;;;5557:30;5623:34;5603:18;;;5596:62;-1:-1:-1;;;5674:18:6;;;5667:34;5718:19;;9436:134:0::1;5517:226:6::0;9436:134:0::1;9580:16;:34:::0;;;9629:33:::1;9646:15;:13;:15::i;:::-;9629:33;::::0;8305:25:6;;;8293:2;8278:18;9629:33:0::1;8260:76:6::0;1605:92:1;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;8883:146:0:-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8958:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:24;;-1:-1:-1;;8958:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;8997:25;;1762:51:6;;;1829:18;;;1822:50;8997:25:0::1;::::0;1735:18:6;8997:25:0::1;;;;;;;8883:146:::0;;:::o;13809:322::-;13863:8;;-1:-1:-1;;;;;13863:8:0;13847:62;;;;-1:-1:-1;;;13847:62:0;;4104:2:6;13847:62:0;;;4086:21:6;4143:2;4123:18;;;4116:30;-1:-1:-1;;;4162:18:6;;;4155:48;4220:18;;13847:62:0;4076:168:6;13847:62:0;13956:10;13919:21;13943:24;;;:12;:24;;;;;;;;;13919:48;;;;;;;;;;;;;;;;;;;;;;;;;13977:44;;;;-1:-1:-1;;;13977:44:0;;4793:2:6;13977:44:0;;;4775:21:6;4832:2;4812:18;;;4805:30;-1:-1:-1;;;4851:18:6;;;4844:49;4910:18;;13977:44:0;4765:169:6;13977:44:0;14031:8;;14060;;14070:12;;;;14031:52;;-1:-1:-1;;;14031:52:0;;14048:10;14031:52;;;2364:51:6;2431:18;;;2424:34;;;;2474:18;;;2467:34;-1:-1:-1;;;;;14031:8:0;;;;:16;;2337:18:6;;14031:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14098:26:0;;;1306:12:6;;1294:25;;1368:4;1357:16;;;1351:23;1335:14;;;1328:47;14109:10:0;;-1:-1:-1;14098:26:0;;-1:-1:-1;8073:18:6;14098:26:0;;;;;;;13809:322;:::o;15434:175::-;15497:16;15529;15553:24;15569:7;15553:15;:24::i;:::-;-1:-1:-1;15525:52:0;;15434:175;-1:-1:-1;;;;;15434:175:0:o;8411:161::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;8488:12:0::1;:28:::0;;-1:-1:-1;;;;;;8488:28:0::1;-1:-1:-1::0;;;;;8488:28:0;::::1;::::0;;::::1;::::0;;;8531:34:::1;::::0;1532:51:6;;;8531:34:0::1;::::0;1520:2:6;1505:18;8531:34:0::1;1487:102:6::0;11473:1517:0;798:5;11535:9;:38;;11527:75;;;;-1:-1:-1;;;11527:75:0;;6639:2:6;11527:75:0;;;6621:21:6;6678:2;6658:18;;;6651:30;6717:26;6697:18;;;6690:54;6761:18;;11527:75:0;6611:174:6;11527:75:0;11650:10;11612:22;11637:24;;;:12;:24;;;;;11745:8;;11771:9;11763:40;;;;-1:-1:-1;;;11763:40:0;;5950:2:6;11763:40:0;;;5932:21:6;5989:2;5969:18;;;5962:30;-1:-1:-1;;;6008:18:6;;;6001:48;6066:18;;11763:40:0;5922:168:6;11763:40:0;11814:16;11833:15;:13;:15::i;:::-;11878:12;;;;11814:34;;-1:-1:-1;11858:17:0;;12153:15;12130:20;11814:34;11878:12;12130:20;:::i;:::-;:38;12126:577;;;798:5;12209:20;12220:9;12209:8;:20;:::i;:::-;12208:50;;;;:::i;:::-;12196:63;;:8;:63;:::i;:::-;12184:75;-1:-1:-1;12288:27:0;12184:75;12288:15;:27;:::i;:::-;12273:42;;12126:577;;;798:5;12359:20;12370:9;12359:8;:20;:::i;:::-;12358:50;;;;:::i;:::-;12346:62;-1:-1:-1;12538:15:0;12513:21;12346:62;12513:9;:21;:::i;:::-;:40;12509:184;;-1:-1:-1;12588:15:0;12509:184;;;12657:21;12669:9;12657;:21;:::i;:::-;12642:36;;12509:184;12713:12;;;;:27;;;12763:10;12750:24;;;;:12;:24;;;;;:29;;;;;;;;;;;12869:59;;12889:9;12900:5;12728:12;1403:1;12869:16;:59::i;:::-;12944:39;;;8570:25:6;;;8631:13;;8626:2;8611:18;;8604:41;8699:4;8687:17;;8681:24;8661:18;;;8654:52;12944:39:0;;12954:10;;12944:39;;;;;;8558:2:6;12944:39:0;;;11473:1517;;;;;;;:::o;3262:497::-;3308:7;3327:16;3346:15;:13;:15::i;:::-;3327:34;;3371:22;3415:8;3397:15;;:26;;;;:::i;:::-;3371:53;-1:-1:-1;3449:15:0;3478:22;;;3474:61;;3523:1;3516:8;;;;;3262:497;:::o;3474:61::-;3561:17;;798:5;3699:8;3672:21;3689:4;3672:14;:21;:::i;:::-;3620:47;3648:19;798:5;3620:47;:::i;:::-;3619:75;;;;:::i;:::-;3610:85;;:5;:85;:::i;:::-;3609:98;;;;:::i;:::-;3608:144;;;;:::i;:::-;3589:163;;;;;;3262:497;:::o;2534:165::-;1019:7:1;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;2609:11:0::1;:37:::0;;-1:-1:-1;;;;;;2609:37:0::1;-1:-1:-1::0;;;;;2609:37:0;::::1;::::0;;::::1;::::0;;;2661:31:::1;::::0;1532:51:6;;;2661:31:0::1;::::0;1520:2:6;1505:18;2661:31:0::1;1487:102:6::0;13082:655:0;13118:13;13133:16;13151:17;13174:27;13190:10;13174:15;:27::i;:::-;13117:84;;;;;;;13227:1;13219:5;:9;13211:38;;;;-1:-1:-1;;;13211:38:0;;6992:2:6;13211:38:0;;;6974:21:6;7031:2;7011:18;;;7004:30;-1:-1:-1;;;7050:18:6;;;7043:46;7106:18;;13211:38:0;6964:166:6;13211:38:0;13259:15;13277:16;13285:8;13277:5;:16;:::i;:::-;13324:10;13311:24;;;;:12;:24;;;;;;;;13304:31;;;;;;;;13388:11;:23;;;;;:35;;13259:34;;-1:-1:-1;13415:8:0;;13388:23;;13311:24;13388:35;;13415:8;;13388:35;:::i;:::-;;;;-1:-1:-1;13434:46:0;;-1:-1:-1;13451:5:0;13458:9;13469:1;;1370;13434:16;:46::i;:::-;13511:5;13490:17;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;13531:11:0;;13527:76;;13566:12;;13558:34;;-1:-1:-1;;;13558:34:0;;;;;8305:25:6;;;-1:-1:-1;;;;;13566:12:0;;;;13558:25;;8278:18:6;;13558:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13527:76;13612:11;;:38;;-1:-1:-1;;;13612:38:0;;13629:10;13612:38;;;2057:51:6;2124:18;;;2117:34;;;-1:-1:-1;;;;;13612:11:0;;;;:16;;2030:18:6;;13612:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13686:17:0;;13666:64;;;9603:25:6;;;9659:2;9644:18;;9637:34;;;9687:18;;9680:34;;;9745:2;9730:18;;9723:34;;;13674:10:0;;-1:-1:-1;13666:64:0;;-1:-1:-1;9590:3:6;9575:19;13666:64:0;9557:206:6;1846:189:1;1019:7;1045:6;-1:-1:-1;;;;;1045:6:1;666:10:5;1185:23:1;1177:68;;;;-1:-1:-1;;;1177:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:1;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:1;;3354:2:6;1926:73:1::1;::::0;::::1;3336:21:6::0;3393:2;3373:18;;;3366:30;3432:34;3412:18;;;3405:62;-1:-1:-1;;;3483:18:6;;;3476:36;3529:19;;1926:73:1::1;3326:228:6::0;1926:73:1::1;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;14269:794:0:-;-1:-1:-1;;;;;14523:21:0;;14370:13;14523:21;;;:12;:21;;;;;;;;14499:45;;;;;;;;;;;;;;;;;;;;;;;;;14370:13;14499:45;14370:13;;14618;;14614:443;;14670:15;:13;:15::i;:::-;14658:27;;:9;:27;:::i;:::-;14647:38;;14714:15;14703:8;:26;14699:348;;;798:5;14761:27;14769:19;14761:5;:27;:::i;:::-;14760:57;;;;:::i;:::-;14749:68;-1:-1:-1;14953:20:0;14964:9;14953:8;:20;:::i;:::-;14920:27;14938:9;14920:15;:27;:::i;:::-;14859:16;14867:8;14859:5;:16;:::i;:::-;14858:90;;;;:::i;:::-;14857:117;;;;:::i;:::-;14846:128;;:8;:128;:::i;:::-;14835:139;;14699:348;;;15024:8;;;-1:-1:-1;14699:348:0;14269:794;;;;;;:::o;5636:2659::-;5848:17;;5879:16;5875:459;;6022:27;6043:6;6022:18;:27;:::i;:::-;6001:48;;5875:459;;;1370:1;6070:6;:14;6066:268;;;6181:27;6202:6;6181:18;:27;:::i;6066:268::-;6251:9;6229:18;:31;6225:109;;;-1:-1:-1;6276:15:0;:27;;;6317:7;;6225:109;6370:15;;6400:23;6396:60;;6439:7;;;;6396:60;1339:1;6470:6;:13;6466:1823;;;6926:26;7035:21;7047:9;7035;:21;:::i;:::-;7012:18;7024:6;7012:9;:18;:::i;:::-;6996:35;;:12;:35;:::i;:::-;6956:37;6975:18;6956:16;:37;:::i;:::-;:75;;;;:::i;:::-;6955:101;;;;:::i;:::-;6926:130;-1:-1:-1;7110:27:0;7131:6;7110:18;:27;:::i;:::-;7088:50;;:18;:50;:::i;:::-;7070:15;:68;-1:-1:-1;6466:1823:0;;;1370:1;7160:6;:14;7156:1133;;;7532:18;7494:6;7439:44;7473:9;7446:16;7439:44;:::i;:::-;7438:63;;;;:::i;:::-;7437:114;;;;:::i;:::-;7390:161;;7397:16;7390:161;:::i;:::-;7347:15;:218;7156:1133;;;1403:1;7586:6;:16;7582:707;;;7851:18;7802:24;7817:9;7802:12;:24;:::i;:::-;7789:38;;:9;:38;:::i;:::-;7788:81;;;;:::i;:::-;7749:120;;:16;:120;:::i;7582:707::-;8260:18;8222;8234:6;8222:9;:18;:::i;:::-;8221:57;;;;:::i;:::-;8184:18;8136:27;8157:6;8184:18;8136:27;:::i;:::-;8116:48;;:16;:48;:::i;:::-;8115:87;;;;:::i;:::-;:163;;;;:::i;:::-;8081:15;:197;7582:707;5636:2659;;;;;;;;:::o;2041:169:1:-;2096:16;2115:6;;-1:-1:-1;;;;;2131:17:1;;;-1:-1:-1;;;;;;2131:17:1;;;;;;2163:40;;2115:6;;;;;;;2163:40;;2096:16;2163:40;2041:169;;:::o;14:173:6:-;82:20;;-1:-1:-1;;;;;131:31:6;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;:::-;343:39;262:126;-1:-1:-1;;;262:126:6:o;393:367::-;458:6;466;519:2;507:9;498:7;494:23;490:32;487:2;;;540:6;532;525:22;487:2;568:29;587:9;568:29;:::i;:::-;558:39;;647:2;636:9;632:18;619:32;694:5;687:13;680:21;673:5;670:32;660:2;;721:6;713;706:22;660:2;749:5;739:15;;;477:283;;;;;:::o;765:264::-;833:6;841;894:2;882:9;873:7;869:23;865:32;862:2;;;915:6;907;900:22;862:2;943:29;962:9;943:29;:::i;:::-;933:39;1019:2;1004:18;;;;991:32;;-1:-1:-1;;;852:177:6:o;1034:190::-;1093:6;1146:2;1134:9;1125:7;1121:23;1117:32;1114:2;;;1167:6;1159;1152:22;1114:2;-1:-1:-1;1195:23:6;;1104:120;-1:-1:-1;1104:120:6:o;7135:356::-;7337:2;7319:21;;;7356:18;;;7349:30;7415:34;7410:2;7395:18;;7388:62;7482:2;7467:18;;7309:182::o;8970:397::-;9227:25;;;9283:2;9268:18;;;9261:34;;;1306:12;;9357:2;9342:18;;1294:25;1357:16;;1351:23;1335:14;;;1328:47;9214:3;9199:19;;9304:57;1284:97;9768:267;9807:3;9835:11;;;9862:10;;-1:-1:-1;;;;;9881:27:6;;;9874:35;;9858:52;9855:2;;;9913:18;;:::i;:::-;-1:-1:-1;;;9960:19:6;;;9953:27;;9945:36;;9942:2;;;9984:18;;:::i;:::-;-1:-1:-1;;10020:9:6;;9815:220::o;10040:128::-;10080:3;10111:1;10107:6;10104:1;10101:13;10098:2;;;10117:18;;:::i;:::-;-1:-1:-1;10153:9:6;;10088:80::o;10173:193::-;10212:1;10238;10228:2;;10243:18;;:::i;:::-;-1:-1:-1;;;10279:18:6;;-1:-1:-1;;10299:13:6;;10275:38;10272:2;;;10316:18;;:::i;:::-;-1:-1:-1;10350:10:6;;10218:148::o;10371:120::-;10411:1;10437;10427:2;;10442:18;;:::i;:::-;-1:-1:-1;10476:9:6;;10417:74::o;10496:577::-;10535:7;-1:-1:-1;;;;;10605:15:6;;;10639;;;10670:11;;;10689:10;;;10683:17;;10666:35;10663:2;;;10704:18;;:::i;:::-;-1:-1:-1;;;10773:15:6;;;10804:11;;;10824;;;10817:19;;10800:37;10797:2;;;10840:18;;:::i;:::-;10886:7;10883:1;10879:15;10869:25;;10939:1;10935:2;10930:11;10927:1;10923:19;10918:2;10914;10910:11;10906:37;10903:2;;;10946:18;;:::i;:::-;11011:1;11007:2;11002:11;10999:1;10995:19;10990:2;10986;10982:11;10978:37;10975:2;;;11018:18;;:::i;:::-;-1:-1:-1;;;11058:9:6;;;;;10547:526;-1:-1:-1;;;10547:526:6:o;11078:168::-;11118:7;11184:1;11180;11176:6;11172:14;11169:1;11166:21;11161:1;11154:9;11147:17;11143:45;11140:2;;;11191:18;;:::i;:::-;-1:-1:-1;11231:9:6;;11130:116::o;11251:270::-;11290:4;11319:12;;;11347:10;;-1:-1:-1;;;11366:19:6;;11359:27;;11343:44;11340:2;;;11390:18;;:::i;:::-;-1:-1:-1;;;;;11437:27:6;;11430:35;;11422:44;;11419:2;;;11469:18;;:::i;:::-;-1:-1:-1;;11506:9:6;;11299:222::o;11526:125::-;11566:4;11594:1;11591;11588:8;11585:2;;;11599:18;;:::i;:::-;-1:-1:-1;11636:9:6;;11575:76::o;11656:127::-;11717:10;11712:3;11708:20;11705:1;11698:31;11748:4;11745:1;11738:15;11772:4;11769:1;11762:15;11788:127;11849:10;11844:3;11840:20;11837:1;11830:31;11880:4;11877:1;11870:15;11904:4;11901:1;11894:15
Swarm Source
ipfs://6959ccef81a4dd5c75fca0b0e07867a370f00ded4cc81b7a205ae3670b73489c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.