Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 685 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Kick | 20143879 | 118 days ago | IN | 0 ETH | 0.00028116 | ||||
Execute Availabl... | 19950810 | 145 days ago | IN | 0 ETH | 0.00031298 | ||||
Kick | 19749136 | 174 days ago | IN | 0 ETH | 0.086832 | ||||
Kick | 19652983 | 187 days ago | IN | 0 ETH | 0.00142942 | ||||
Kick | 19643896 | 188 days ago | IN | 0 ETH | 0.00129068 | ||||
Kick | 19643888 | 188 days ago | IN | 0 ETH | 0.00131818 | ||||
Execute Availabl... | 19483842 | 211 days ago | IN | 0 ETH | 0.00302823 | ||||
Kick | 19479590 | 211 days ago | IN | 0 ETH | 0.0026443 | ||||
Kick | 19479579 | 211 days ago | IN | 0 ETH | 0.00265719 | ||||
Kick | 19479569 | 211 days ago | IN | 0 ETH | 0.00286263 | ||||
Kick | 19479286 | 211 days ago | IN | 0 ETH | 0.00239976 | ||||
Kick | 19463651 | 214 days ago | IN | 0 ETH | 0.00505182 | ||||
Execute Availabl... | 19452686 | 215 days ago | IN | 0 ETH | 0.00212684 | ||||
Execute Availabl... | 19433331 | 218 days ago | IN | 0 ETH | 0.0036798 | ||||
Kick | 19414542 | 221 days ago | IN | 0 ETH | 0.00671454 | ||||
Kick | 19400038 | 223 days ago | IN | 0 ETH | 0.00542104 | ||||
Execute Availabl... | 19316048 | 234 days ago | IN | 0 ETH | 0.00430415 | ||||
Execute Availabl... | 19306042 | 236 days ago | IN | 0 ETH | 0.00370871 | ||||
Execute Availabl... | 19271150 | 241 days ago | IN | 0 ETH | 0.00395003 | ||||
Execute Availabl... | 19256494 | 243 days ago | IN | 0 ETH | 0.00210567 | ||||
Kick | 19236005 | 246 days ago | IN | 0 ETH | 0.00334332 | ||||
Execute Availabl... | 19229551 | 246 days ago | IN | 0 ETH | 0.00154494 | ||||
Execute Availabl... | 19228117 | 247 days ago | IN | 0 ETH | 0.00234441 | ||||
Kick | 19225448 | 247 days ago | IN | 0 ETH | 0.00280316 | ||||
Kick | 19224888 | 247 days ago | IN | 0 ETH | 0.00222562 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CNCLockerV2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "SafeERC20.sol"; import "IERC20.sol"; import "Ownable.sol"; import "ScaledMath.sol"; import "ICNCLockerV2.sol"; import "ICNCToken.sol"; import "ICNCVoteLocker.sol"; import "IController.sol"; contract CNCLockerV2 is ICNCLockerV2, Ownable { using SafeERC20 for ICNCToken; using SafeERC20 for IERC20; using ScaledMath for uint256; using ScaledMath for uint128; using MerkleProof for MerkleProof.Proof; address public constant V1_LOCKER = address(0x3F41480DD3b32F1cC579125F9570DCcD07E07667); uint128 internal constant _MIN_LOCK_TIME = 120 days; uint128 internal constant _MAX_LOCK_TIME = 240 days; uint128 internal constant _GRACE_PERIOD = 28 days; uint128 internal constant _MIN_BOOST = 1e18; uint128 internal constant _MAX_BOOST = 1.5e18; uint128 internal constant _KICK_PENALTY = 1e17; uint256 internal constant _MAX_KICK_PENALTY_AMOUNT = 1000e18; uint128 constant _AIRDROP_DURATION = 182 days; uint256 internal constant _MAX_AIRDROP_BOOST = 3.5e18; ICNCToken public immutable cncToken; // Boost data mapping(address => uint256) public lockedBalance; mapping(address => uint256) public lockedBoosted; mapping(address => VoteLock[]) public voteLocks; mapping(address => uint256) internal _airdroppedBoost; mapping(address => bool) public override claimedAirdrop; uint64 internal _nextId; uint256 public immutable airdropEndTime; bytes32 public immutable merkleRoot; uint256 public totalLocked; uint256 public totalBoosted; bool public isShutdown; // Fee data IERC20 public immutable crv; IERC20 public immutable cvx; uint256 public accruedFeesIntegralCrv; uint256 public accruedFeesIntegralCvx; mapping(address => uint256) public perAccountAccruedCrv; mapping(address => uint256) public perAccountFeesCrv; mapping(address => uint256) public perAccountAccruedCvx; mapping(address => uint256) public perAccountFeesCvx; address public immutable treasury; IController public immutable controller; constructor( address _controller, address _cncToken, address _treasury, address _crv, address _cvx, bytes32 _merkleRoot ) Ownable() { controller = IController(_controller); cncToken = ICNCToken(_cncToken); treasury = _treasury; crv = IERC20(_crv); cvx = IERC20(_cvx); airdropEndTime = block.timestamp + _AIRDROP_DURATION; merkleRoot = _merkleRoot; } function lock(uint256 amount, uint64 lockTime) external override { lock(amount, lockTime, false); } /// @notice Lock an amount of CNC for vlCNC. /// @param amount Amount of CNC to lock. /// @param lockTime Duration of the lock. /// @param relock_ `True` if this is a relock of an existing lock. function lock( uint256 amount, uint64 lockTime, bool relock_ ) public override { lockFor(amount, lockTime, relock_, msg.sender); } /// @notice Lock an amount of CNC for vlCNC. /// @param amount Amount of CNC to lock. /// @param lockTime Duration of the lock. /// @param relock_ `True` if this is a relock of all existing locks. /// @param account The account to receive the vlCNC. function lockFor( uint256 amount, uint64 lockTime, bool relock_, address account ) public override { require(!isShutdown, "locker suspended"); require((_MIN_LOCK_TIME <= lockTime) && (lockTime <= _MAX_LOCK_TIME), "lock time invalid"); require(!relock_ || msg.sender == account, "relock only for self"); _feeCheckpoint(account); cncToken.safeTransferFrom(msg.sender, address(this), amount); uint128 boost = computeBoost(lockTime); uint256 airdropBoost_ = airdropBoost(msg.sender); if (airdropBoost_ > 1e18) { claimedAirdrop[msg.sender] = true; boost = boost.mulDownUint128(uint128(airdropBoost_)); delete _airdroppedBoost[msg.sender]; } uint64 unlockTime = uint64(block.timestamp) + lockTime; uint256 boostedAmount; if (relock_) { uint256 length = voteLocks[account].length; for (uint256 i; i < length; i++) { require( voteLocks[account][i].unlockTime < unlockTime, "cannot move the unlock time up" ); } delete voteLocks[account]; totalBoosted -= lockedBoosted[account]; lockedBoosted[account] = 0; _addVoteLock(account, lockedBalance[account] + amount, unlockTime, boost); boostedAmount = (lockedBalance[account] + amount).mulDown(uint256(boost)); } else { _addVoteLock(account, amount, unlockTime, boost); boostedAmount = amount.mulDown(boost); } totalLocked += amount; totalBoosted += boostedAmount; lockedBalance[account] += amount; lockedBoosted[account] += boostedAmount; emit Locked(account, amount, unlockTime, relock_); } /// @notice Process all expired locks of msg.sender and withdraw unlocked CNC. function executeAvailableUnlocks() external override returns (uint256) { return executeAvailableUnlocksFor(msg.sender); } /// @notice Process all expired locks of msg.sender and withdraw unlocked CNC to `dst`. function executeAvailableUnlocksFor(address dst) public override returns (uint256) { require(dst != address(0), "invalid destination"); _feeCheckpoint(msg.sender); uint256 sumUnlockable; uint256 sumBoosted; VoteLock[] storage _pending = voteLocks[msg.sender]; uint256 i = _pending.length; while (i > 0) { i = i - 1; if (isShutdown || _pending[i].unlockTime <= block.timestamp) { sumUnlockable += _pending[i].amount; sumBoosted += _pending[i].amount.mulDown(_pending[i].boost); _pending[i] = _pending[_pending.length - 1]; _pending.pop(); } } totalLocked -= sumUnlockable; totalBoosted -= sumBoosted; lockedBalance[msg.sender] -= sumUnlockable; lockedBoosted[msg.sender] -= sumBoosted; cncToken.safeTransfer(dst, sumUnlockable); emit UnlockExecuted(msg.sender, sumUnlockable); return sumUnlockable; } /// @notice Process specified locks of msg.sender and withdraw unlocked CNC to `dst`. /// @param dst Destination address to receive unlocked CNC. /// @param lockIds Array of lock IDs to process. /// @return unlocked Amount of CNC unlocked. function executeUnlocks(address dst, uint64[] calldata lockIds) public override returns (uint256) { _feeCheckpoint(msg.sender); uint256 sumUnlockable; uint256 sumBoosted; VoteLock[] storage _pending = voteLocks[msg.sender]; for (uint256 idIndex; idIndex < lockIds.length; idIndex++) { uint256 index = _getLockIndexById(msg.sender, lockIds[idIndex]); require( isShutdown || _pending[index].unlockTime <= block.timestamp, "lock not expired" ); sumUnlockable += _pending[index].amount; sumBoosted += _pending[index].amount.mulDown(_pending[index].boost); _pending[index] = _pending[_pending.length - 1]; _pending.pop(); } totalLocked -= sumUnlockable; totalBoosted -= sumBoosted; lockedBalance[msg.sender] -= sumUnlockable; lockedBoosted[msg.sender] -= sumBoosted; cncToken.safeTransfer(dst, sumUnlockable); emit UnlockExecuted(msg.sender, sumUnlockable); return sumUnlockable; } /// @notice Get unlocked CNC balance for an address /// @param user Address to get unlocked CNC balance for /// @return Unlocked CNC balance function unlockableBalance(address user) public view override returns (uint256) { uint256 sumUnlockable = 0; VoteLock[] storage _pending = voteLocks[user]; uint256 length = _pending.length; for (uint256 i; i < length; i++) { if (_pending[i].unlockTime <= uint128(block.timestamp)) { sumUnlockable += _pending[i].amount; } } return sumUnlockable; } /// @notice Get unlocked boosted CNC balance for an address /// @param user Address to get unlocked boosted CNC balance for /// @return Unlocked boosted CNC balance function unlockableBalanceBoosted(address user) public view override returns (uint256) { uint256 sumUnlockable = 0; VoteLock[] storage _pending = voteLocks[user]; uint256 length = _pending.length; for (uint256 i; i < length; i++) { if (_pending[i].unlockTime <= uint128(block.timestamp)) { sumUnlockable += _pending[i].amount.mulDown(_pending[i].boost); } } return sumUnlockable; } function shutDown() external override onlyOwner { require(!isShutdown, "locker already suspended"); isShutdown = true; emit Shutdown(); } function recoverToken(address token) external override { require( token != address(cncToken) && token != address(crv) && token != address(cvx), "cannot withdraw token" ); IERC20 _token = IERC20(token); _token.safeTransfer(treasury, _token.balanceOf(address(this))); emit TokenRecovered(token); } /// @notice Relock a specific lock /// @dev Users locking CNC can create multiple locks therefore individual locks can be relocked separately. /// @param lockId Id of the lock to relock. /// @param lockTime Duration for which the locks's CNC amount should be relocked for. function relock(uint64 lockId, uint64 lockTime) external override { require(!isShutdown, "locker suspended"); require((_MIN_LOCK_TIME <= lockTime) && (lockTime <= _MAX_LOCK_TIME), "lock time invalid"); _feeCheckpoint(msg.sender); _relock(lockId, lockTime); } /// @notice Relock specified locks /// @param lockIds Ids of the locks to relock. /// @param lockTime Duration for which the locks's CNC amount should be relocked for. function relockMultiple(uint64[] calldata lockIds, uint64 lockTime) external override { require(!isShutdown, "locker suspended"); require((_MIN_LOCK_TIME <= lockTime) && (lockTime <= _MAX_LOCK_TIME), "lock time invalid"); _feeCheckpoint(msg.sender); for (uint256 i; i < lockIds.length; i++) { _relock(lockIds[i], lockTime); } } function _relock(uint64 lockId, uint64 lockTime) internal { uint256 lockIndex = _getLockIndexById(msg.sender, lockId); uint128 boost = computeBoost(lockTime); uint64 unlockTime = uint64(block.timestamp) + lockTime; VoteLock[] storage locks = voteLocks[msg.sender]; require(locks[lockIndex].unlockTime < unlockTime, "cannot move the unlock time up"); uint256 amount = locks[lockIndex].amount; uint256 previousBoostedAmount = locks[lockIndex].amount.mulDown(locks[lockIndex].boost); locks[lockIndex] = locks[locks.length - 1]; locks.pop(); _addVoteLock(msg.sender, amount, unlockTime, boost); uint256 boostedAmount = amount.mulDown(boost); totalBoosted = totalBoosted + boostedAmount - previousBoostedAmount; lockedBoosted[msg.sender] = lockedBoosted[msg.sender] + boostedAmount - previousBoostedAmount; emit Relocked(msg.sender, amount); } function relock(uint64 lockTime) external override { require(!isShutdown, "locker suspended"); require((_MIN_LOCK_TIME <= lockTime) && (lockTime <= _MAX_LOCK_TIME), "lock time invalid"); _feeCheckpoint(msg.sender); uint128 boost = computeBoost(lockTime); uint64 unlockTime = uint64(block.timestamp) + lockTime; uint256 length = voteLocks[msg.sender].length; for (uint256 i; i < length; i++) { require( voteLocks[msg.sender][i].unlockTime < unlockTime, "cannot move the unlock time up" ); } delete voteLocks[msg.sender]; totalBoosted -= lockedBoosted[msg.sender]; lockedBoosted[msg.sender] = 0; _addVoteLock(msg.sender, lockedBalance[msg.sender], unlockTime, boost); uint256 boostedAmount = lockedBalance[msg.sender].mulDown(uint256(boost)); totalBoosted += boostedAmount; lockedBoosted[msg.sender] += boostedAmount; emit Relocked(msg.sender, lockedBalance[msg.sender]); } /// @notice Kick an expired lock function kick(address user, uint64 lockId) external override { uint256 lockIndex = _getLockIndexById(user, lockId); VoteLock[] storage _pending = voteLocks[user]; require( _pending[lockIndex].unlockTime + _GRACE_PERIOD <= uint128(block.timestamp), "cannot kick this lock" ); _feeCheckpoint(user); uint256 amount = _pending[lockIndex].amount; totalLocked -= amount; totalBoosted -= amount.mulDown(_pending[lockIndex].boost); lockedBalance[user] -= amount; lockedBoosted[user] -= amount.mulDown(_pending[lockIndex].boost); uint256 kickPenalty = amount.mulDown(_KICK_PENALTY); if (kickPenalty > _MAX_KICK_PENALTY_AMOUNT) { kickPenalty = _MAX_KICK_PENALTY_AMOUNT; } cncToken.safeTransfer(user, amount - kickPenalty); cncToken.safeTransfer(msg.sender, kickPenalty); emit KickExecuted(user, msg.sender, amount); _pending[lockIndex] = _pending[_pending.length - 1]; _pending.pop(); } function receiveFees(uint256 amountCrv, uint256 amountCvx) external override { crv.safeTransferFrom(msg.sender, address(this), amountCrv); cvx.safeTransferFrom(msg.sender, address(this), amountCvx); accruedFeesIntegralCrv += amountCrv.divDown(totalBoosted); accruedFeesIntegralCvx += amountCvx.divDown(totalBoosted); emit FeesReceived(msg.sender, amountCrv, amountCvx); } function claimFees() external override returns (uint256 crvAmount, uint256 cvxAmount) { _feeCheckpoint(msg.sender); crvAmount = perAccountFeesCrv[msg.sender]; cvxAmount = perAccountFeesCvx[msg.sender]; crv.safeTransfer(msg.sender, crvAmount); cvx.safeTransfer(msg.sender, cvxAmount); perAccountFeesCrv[msg.sender] = 0; perAccountFeesCvx[msg.sender] = 0; emit FeesClaimed(msg.sender, crvAmount, cvxAmount); } function claimAirdropBoost(uint256 amount, MerkleProof.Proof calldata proof) external override { require(block.timestamp < airdropEndTime, "airdrop ended"); require(!claimedAirdrop[msg.sender], "already claimed"); require(amount <= _MAX_AIRDROP_BOOST, "amount exceeds max airdrop boost"); bytes32 node = keccak256(abi.encodePacked(msg.sender, amount)); require(proof.isValid(node, merkleRoot), "invalid proof"); _airdroppedBoost[msg.sender] = amount; emit AirdropBoostClaimed(msg.sender, amount); } function claimableFees(address account) external view override returns (uint256 claimableCrv, uint256 claimableCvx) { uint256 boost_ = lockedBoosted[account]; claimableCrv = perAccountFeesCrv[account] + boost_.mulDown(accruedFeesIntegralCrv - perAccountAccruedCrv[account]); claimableCvx = perAccountFeesCvx[account] + boost_.mulDown(accruedFeesIntegralCvx - perAccountAccruedCvx[account]); } function balanceOf(address user) external view override returns (uint256) { return totalVoteBoost(user); } function _feeCheckpoint(address account) internal { uint256 boost_ = lockedBoosted[account]; perAccountFeesCrv[account] += boost_.mulDown( accruedFeesIntegralCrv - perAccountAccruedCrv[account] ); perAccountAccruedCrv[account] = accruedFeesIntegralCrv; perAccountFeesCvx[account] += boost_.mulDown( accruedFeesIntegralCvx - perAccountAccruedCvx[account] ); perAccountAccruedCvx[account] = accruedFeesIntegralCvx; } function computeBoost(uint128 lockTime) public pure override returns (uint128) { return ((_MAX_BOOST - _MIN_BOOST).mulDownUint128( (lockTime - _MIN_LOCK_TIME).divDownUint128(_MAX_LOCK_TIME - _MIN_LOCK_TIME) ) + _MIN_BOOST); } function airdropBoost(address account) public view override returns (uint256) { if (_airdroppedBoost[account] == 0) return 1e18; return _airdroppedBoost[account]; } function totalVoteBoost(address account) public view override returns (uint256) { return totalRewardsBoost(account).mulDown(controller.lpTokenStaker().getBoost(account)); } function totalRewardsBoost(address account) public view override returns (uint256) { return lockedBoosted[account] - unlockableBalanceBoosted(account) + ICNCVoteLocker(V1_LOCKER).balanceOf(account); } function userLocks(address account) external view override returns (VoteLock[] memory) { return voteLocks[account]; } function _getLockIndexById(address user, uint64 id) internal view returns (uint256) { uint256 length_ = voteLocks[user].length; for (uint256 i; i < length_; i++) { if (voteLocks[user][i].id == id) { return i; } } revert("lock doesn't exist"); } function _addVoteLock( address user, uint256 amount, uint64 unlockTime, uint128 boost ) internal { uint64 id = _nextId; voteLocks[user].push(VoteLock(amount, unlockTime, boost, id)); _nextId = id + 1; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "draft-IERC20Permit.sol"; import "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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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 // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; library ScaledMath { uint256 internal constant DECIMALS = 18; uint256 internal constant ONE = 10**DECIMALS; function mulDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * b) / ONE; } function mulDown( uint256 a, uint256 b, uint256 decimals ) internal pure returns (uint256) { return (a * b) / (10**decimals); } function divDown(uint256 a, uint256 b) internal pure returns (uint256) { return (a * ONE) / b; } function divDown( uint256 a, uint256 b, uint256 decimals ) internal pure returns (uint256) { return (a * 10**decimals) / b; } function divUp(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } return ((a * ONE) - 1) / b + 1; } function mulDown(int256 a, int256 b) internal pure returns (int256) { return (a * b) / int256(ONE); } function mulDownUint128(uint128 a, uint128 b) internal pure returns (uint128) { return (a * b) / uint128(ONE); } function mulDown( int256 a, int256 b, uint256 decimals ) internal pure returns (int256) { return (a * b) / int256(10**decimals); } function divDown(int256 a, int256 b) internal pure returns (int256) { return (a * int256(ONE)) / b; } function divDownUint128(uint128 a, uint128 b) internal pure returns (uint128) { return (a * uint128(ONE)) / b; } function divDown( int256 a, int256 b, uint256 decimals ) internal pure returns (int256) { return (a * int256(10**decimals)) / b; } function convertScale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { if (fromDecimals == toDecimals) return a; if (fromDecimals > toDecimals) return downscale(a, fromDecimals, toDecimals); return upscale(a, fromDecimals, toDecimals); } function convertScale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { if (fromDecimals == toDecimals) return a; if (fromDecimals > toDecimals) return downscale(a, fromDecimals, toDecimals); return upscale(a, fromDecimals, toDecimals); } function upscale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { return a * (10**(toDecimals - fromDecimals)); } function downscale( uint256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (uint256) { return a / (10**(fromDecimals - toDecimals)); } function upscale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { return a * int256(10**(toDecimals - fromDecimals)); } function downscale( int256 a, uint8 fromDecimals, uint8 toDecimals ) internal pure returns (int256) { return a / int256(10**(fromDecimals - toDecimals)); } function intPow(uint256 a, uint256 n) internal pure returns (uint256) { uint256 result = ONE; for (uint256 i; i < n; ) { result = mulDown(result, a); unchecked { ++i; } } return result; } function absSub(uint256 a, uint256 b) internal pure returns (uint256) { unchecked { return a >= b ? a - b : b - a; } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "MerkleProof.sol"; interface ICNCLockerV2 { event Locked(address indexed account, uint256 amount, uint256 unlockTime, bool relocked); event UnlockExecuted(address indexed account, uint256 amount); event Relocked(address indexed account, uint256 amount); event KickExecuted(address indexed account, address indexed kicker, uint256 amount); event FeesReceived(address indexed sender, uint256 crvAmount, uint256 cvxAmount); event FeesClaimed(address indexed claimer, uint256 crvAmount, uint256 cvxAmount); event AirdropBoostClaimed(address indexed claimer, uint256 amount); event Shutdown(); event TokenRecovered(address indexed token); struct VoteLock { uint256 amount; uint64 unlockTime; uint128 boost; uint64 id; } function lock(uint256 amount, uint64 lockTime) external; function lock( uint256 amount, uint64 lockTime, bool relock ) external; function lockFor( uint256 amount, uint64 lockTime, bool relock, address account ) external; function relock(uint64 lockId, uint64 lockTime) external; function relock(uint64 lockTime) external; function relockMultiple(uint64[] calldata lockIds, uint64 lockTime) external; function totalBoosted() external view returns (uint256); function shutDown() external; function recoverToken(address token) external; function executeAvailableUnlocks() external returns (uint256); function executeAvailableUnlocksFor(address dst) external returns (uint256); function executeUnlocks(address dst, uint64[] calldata lockIds) external returns (uint256); function claimAirdropBoost(uint256 amount, MerkleProof.Proof calldata proof) external; // This will need to include the boosts etc. function balanceOf(address user) external view returns (uint256); function unlockableBalance(address user) external view returns (uint256); function unlockableBalanceBoosted(address user) external view returns (uint256); function kick(address user, uint64 lockId) external; function receiveFees(uint256 amountCrv, uint256 amountCvx) external; function claimableFees(address account) external view returns (uint256 claimableCrv, uint256 claimableCvx); function claimFees() external returns (uint256 crvAmount, uint256 cvxAmount); function computeBoost(uint128 lockTime) external view returns (uint128); function airdropBoost(address account) external view returns (uint256); function claimedAirdrop(address account) external view returns (bool); function totalVoteBoost(address account) external view returns (uint256); function totalRewardsBoost(address account) external view returns (uint256); function userLocks(address account) external view returns (VoteLock[] memory); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; library MerkleProof { struct Proof { uint16 nodeIndex; bytes32[] hashes; } function isValid( Proof memory proof, bytes32 node, bytes32 merkleRoot ) internal pure returns (bool) { uint256 length = proof.hashes.length; uint16 nodeIndex = proof.nodeIndex; for (uint256 i = 0; i < length; i++) { if (nodeIndex % 2 == 0) { node = keccak256(abi.encodePacked(node, proof.hashes[i])); } else { node = keccak256(abi.encodePacked(proof.hashes[i], node)); } nodeIndex /= 2; } return node == merkleRoot; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "IERC20.sol"; interface ICNCToken is IERC20 { event MinterAdded(address minter); event MinterRemoved(address minter); event InitialDistributionMinted(uint256 amount); event AirdropMinted(uint256 amount); event AMMRewardsMinted(uint256 amount); event TreasuryRewardsMinted(uint256 amount); event SeedShareMinted(uint256 amount); /// @notice adds a new minter function addMinter(address newMinter) external; /// @notice renounces the minter rights of the sender function renounceMinterRights() external; /// @notice mints the initial distribution amount to the distribution contract function mintInitialDistribution(address distribution) external; /// @notice mints the airdrop amount to the airdrop contract function mintAirdrop(address airdropHandler) external; /// @notice mints the amm rewards function mintAMMRewards(address ammGauge) external; /// @notice mints `amount` to `account` function mint(address account, uint256 amount) external returns (uint256); /// @notice returns a list of all authorized minters function listMinters() external view returns (address[] memory); /// @notice returns the ratio of inflation already minted function inflationMintedRatio() external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface ICNCVoteLocker { event Locked(address indexed account, uint256 amount, uint256 unlockTime, bool relocked); event UnlockExecuted(address indexed account, uint256 amount); function lock(uint256 amount) external; function lock(uint256 amount, bool relock) external; function shutDown() external; function recoverToken(address token) external; function executeAvailableUnlocks() external returns (uint256); function balanceOf(address user) external view returns (uint256); function unlockableBalance(address user) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "IConicPool.sol"; import "IOracle.sol"; import "IInflationManager.sol"; import "ILpTokenStaker.sol"; import "ICurveRegistryCache.sol"; interface IController { event PoolAdded(address indexed pool); event PoolRemoved(address indexed pool); event PoolShutdown(address indexed pool); event ConvexBoosterSet(address convexBooster); event CurveHandlerSet(address curveHandler); event ConvexHandlerSet(address convexHandler); event CurveRegistryCacheSet(address curveRegistryCache); event InflationManagerSet(address inflationManager); event PriceOracleSet(address priceOracle); event WeightUpdateMinDelaySet(uint256 weightUpdateMinDelay); struct WeightUpdate { address conicPoolAddress; IConicPool.PoolWeight[] weights; } // inflation manager function inflationManager() external view returns (IInflationManager); function setInflationManager(address manager) external; // views function curveRegistryCache() external view returns (ICurveRegistryCache); /// lp token staker function setLpTokenStaker(address _lpTokenStaker) external; function lpTokenStaker() external view returns (ILpTokenStaker); // oracle function priceOracle() external view returns (IOracle); function setPriceOracle(address oracle) external; // pool functions function listPools() external view returns (address[] memory); function listActivePools() external view returns (address[] memory); function isPool(address poolAddress) external view returns (bool); function isActivePool(address poolAddress) external view returns (bool); function addPool(address poolAddress) external; function shutdownPool(address poolAddress) external; function removePool(address poolAddress) external; function cncToken() external view returns (address); function lastWeightUpdate(address poolAddress) external view returns (uint256); function updateWeights(WeightUpdate memory update) external; function updateAllWeights(WeightUpdate[] memory weights) external; // handler functions function convexBooster() external view returns (address); function curveHandler() external view returns (address); function convexHandler() external view returns (address); function setConvexBooster(address _convexBooster) external; function setCurveHandler(address _curveHandler) external; function setConvexHandler(address _convexHandler) external; function setCurveRegistryCache(address curveRegistryCache_) external; function emergencyMinter() external view returns (address); function setWeightUpdateMinDelay(uint256 delay) external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "ILpToken.sol"; import "IRewardManager.sol"; import "IOracle.sol"; interface IConicPool { event Deposit( address indexed sender, address indexed receiver, uint256 depositedAmount, uint256 lpReceived ); event Withdraw(address indexed account, uint256 amount); event NewWeight(address indexed curvePool, uint256 newWeight); event NewMaxIdleCurveLpRatio(uint256 newRatio); event ClaimedRewards(uint256 claimedCrv, uint256 claimedCvx); event HandledDepeggedCurvePool(address curvePool_); event HandledInvalidConvexPid(address curvePool_, uint256 pid_); event CurvePoolAdded(address curvePool_); event CurvePoolRemoved(address curvePool_); event Shutdown(); event DepegThresholdUpdated(uint256 newThreshold); event MaxDeviationUpdated(uint256 newMaxDeviation); struct PoolWeight { address poolAddress; uint256 weight; } struct PoolWithAmount { address poolAddress; uint256 amount; } function underlying() external view returns (IERC20Metadata); function lpToken() external view returns (ILpToken); function rewardManager() external view returns (IRewardManager); function depositFor( address _account, uint256 _amount, uint256 _minLpReceived, bool stake ) external returns (uint256); function deposit(uint256 _amount, uint256 _minLpReceived) external returns (uint256); function deposit( uint256 _amount, uint256 _minLpReceived, bool stake ) external returns (uint256); function exchangeRate() external view returns (uint256); function usdExchangeRate() external view returns (uint256); function allCurvePools() external view returns (address[] memory); function curvePoolsCount() external view returns (uint256); function getCurvePoolAtIndex(uint256 _index) external view returns (address); function unstakeAndWithdraw(uint256 _amount, uint256 _minAmount) external returns (uint256); function withdraw(uint256 _amount, uint256 _minAmount) external returns (uint256); function updateWeights(PoolWeight[] memory poolWeights) external; function getWeight(address curvePool) external view returns (uint256); function getWeights() external view returns (PoolWeight[] memory); function getAllocatedUnderlying() external view returns (PoolWithAmount[] memory); function removeCurvePool(address pool) external; function addCurvePool(address pool) external; function totalCurveLpBalance(address curvePool_) external view returns (uint256); function rebalancingRewardActive() external view returns (bool); function totalDeviationAfterWeightUpdate() external view returns (uint256); function computeTotalDeviation() external view returns (uint256); /// @notice returns the total amount of funds held by this pool in terms of underlying function totalUnderlying() external view returns (uint256); function getTotalAndPerPoolUnderlying() external view returns ( uint256 totalUnderlying_, uint256 totalAllocated_, uint256[] memory perPoolUnderlying_ ); /// @notice same as `totalUnderlying` but returns a cached version /// that might be slightly outdated if oracle prices have changed /// @dev this is useful in cases where we want to reduce gas usage and do /// not need a precise value function cachedTotalUnderlying() external view returns (uint256); function handleInvalidConvexPid(address pool) external; function shutdownPool() external; function isShutdown() external view returns (bool); function handleDepeggedCurvePool(address curvePool_) external; function isBalanced() external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "IERC20Metadata.sol"; interface ILpToken is IERC20Metadata { function mint(address account, uint256 amount) external returns (uint256); function burn(address _owner, uint256 _amount) external returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface IRewardManager { event ClaimedRewards(uint256 claimedCrv, uint256 claimedCvx); event SoldRewardTokens(uint256 targetTokenReceived); event ExtraRewardAdded(address reward); event ExtraRewardRemoved(address reward); event ExtraRewardsCurvePoolSet(address extraReward, address curvePool); event FeesSet(uint256 feePercentage); event FeesEnabled(uint256 feePercentage); event EarningsClaimed( address indexed claimedBy, uint256 cncEarned, uint256 crvEarned, uint256 cvxEarned ); struct RewardMeta { uint256 earnedIntegral; uint256 lastEarned; mapping(address => uint256) accountIntegral; mapping(address => uint256) accountShare; } function accountCheckpoint(address account) external; function poolCheckpoint() external returns (bool); function addExtraReward(address reward) external returns (bool); function addBatchExtraRewards(address[] memory rewards) external; function pool() external view returns (address); function setFeePercentage(uint256 _feePercentage) external; function claimableRewards(address account) external view returns ( uint256 cncRewards, uint256 crvRewards, uint256 cvxRewards ); function claimEarnings() external returns ( uint256, uint256, uint256 ); function claimPoolEarningsAndSellRewardTokens() external; }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface IOracle { event TokenUpdated(address indexed token, address feed, uint256 maxDelay, bool isEthPrice); /// @notice returns the price in USD of symbol. function getUSDPrice(address token) external view returns (uint256); /// @notice returns if the given token is supported for pricing. function isTokenSupported(address token) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface IInflationManager { event TokensClaimed(address indexed pool, uint256 cncAmount); event RebalancingRewardHandlerAdded(address indexed pool, address indexed handler); event RebalancingRewardHandlerRemoved(address indexed pool, address indexed handler); event PoolWeightsUpdated(); function executeInflationRateUpdate() external; function updatePoolWeights() external; /// @notice returns the weights of the Conic pools to know how much inflation /// each of them will receive, as well as the total amount of USD value in all the pools function computePoolWeights() external view returns ( address[] memory _pools, uint256[] memory poolWeights, uint256 totalUSDValue ); function computePoolWeight(address pool) external view returns (uint256 poolWeight, uint256 totalUSDValue); function currentInflationRate() external view returns (uint256); function getCurrentPoolInflationRate(address pool) external view returns (uint256); function handleRebalancingRewards( address account, uint256 deviationBefore, uint256 deviationAfter ) external; function addPoolRebalancingRewardHandler(address poolAddress, address rebalancingRewardHandler) external; function removePoolRebalancingRewardHandler( address poolAddress, address rebalancingRewardHandler ) external; function rebalancingRewardHandlers(address poolAddress) external view returns (address[] memory); function hasPoolRebalancingRewardHandlers(address poolAddress, address handler) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface ILpTokenStaker { event LpTokenStaked(address indexed account, uint256 amount); event LpTokenUnstaked(address indexed account, uint256 amount); event TokensClaimed(address indexed pool, uint256 cncAmount); event Shutdown(); function stake(uint256 amount, address conicPool) external; function unstake(uint256 amount, address conicPool) external; function stakeFor( uint256 amount, address conicPool, address account ) external; function unstakeFor( uint256 amount, address conicPool, address account ) external; function unstakeFrom(uint256 amount, address account) external; function getUserBalanceForPool(address conicPool, address account) external view returns (uint256); function getBalanceForPool(address conicPool) external view returns (uint256); function updateBoost(address user) external; function claimCNCRewardsForPool(address pool) external; function claimableCnc(address pool) external view returns (uint256); function checkpoint(address pool) external returns (uint256); function shutdown() external; function getBoost(address user) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "IBooster.sol"; import "CurvePoolUtils.sol"; interface ICurveRegistryCache { function BOOSTER() external view returns (IBooster); function initPool(address pool_) external; function initPool(address pool_, uint256 pid_) external; function lpToken(address pool_) external view returns (address); function assetType(address pool_) external view returns (CurvePoolUtils.AssetType); function isRegistered(address pool_) external view returns (bool); function hasCoinDirectly(address pool_, address coin_) external view returns (bool); function hasCoinAnywhere(address pool_, address coin_) external view returns (bool); function basePool(address pool_) external view returns (address); function coinIndex(address pool_, address coin_) external view returns (int128); function nCoins(address pool_) external view returns (uint256); function coinIndices( address pool_, address from_, address to_ ) external view returns ( int128, int128, bool ); function decimals(address pool_) external view returns (uint256[] memory); function interfaceVersion(address pool_) external view returns (uint256); function poolFromLpToken(address lpToken_) external view returns (address); function coins(address pool_) external view returns (address[] memory); function getPid(address _pool) external view returns (uint256); function getRewardPool(address _pool) external view returns (address); function isShutdownPid(uint256 pid_) external view returns (bool); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface IBooster { function poolInfo(uint256 pid) external view returns ( address lpToken, address token, address gauge, address crvRewards, address stash, bool shutdown ); function poolLength() external view returns (uint256); function deposit( uint256 _pid, uint256 _amount, bool _stake ) external returns (bool); function withdraw(uint256 _pid, uint256 _amount) external returns (bool); function withdrawAll(uint256 _pid) external returns (bool); function depositAll(uint256 _pid, bool _stake) external returns (bool); function earmarkRewards(uint256 _pid) external returns (bool); function isShutdown() external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "ICurvePoolV2.sol"; import "ICurvePoolV1.sol"; import "ScaledMath.sol"; library CurvePoolUtils { using ScaledMath for uint256; uint256 internal constant _DEFAULT_IMBALANCE_THRESHOLD = 0.02e18; enum AssetType { USD, ETH, BTC, OTHER, CRYPTO } struct PoolMeta { address pool; uint256 numberOfCoins; AssetType assetType; uint256[] decimals; uint256[] prices; uint256[] thresholds; } function ensurePoolBalanced(PoolMeta memory poolMeta) internal view { uint256 fromDecimals = poolMeta.decimals[0]; uint256 fromBalance = 10**fromDecimals; uint256 fromPrice = poolMeta.prices[0]; for (uint256 i = 1; i < poolMeta.numberOfCoins; i++) { uint256 toDecimals = poolMeta.decimals[i]; uint256 toPrice = poolMeta.prices[i]; uint256 toExpectedUnscaled = (fromBalance * fromPrice) / toPrice; uint256 toExpected = toExpectedUnscaled.convertScale( uint8(fromDecimals), uint8(toDecimals) ); uint256 toActual; if (poolMeta.assetType == AssetType.CRYPTO) { // Handling crypto pools toActual = ICurvePoolV2(poolMeta.pool).get_dy(0, i, fromBalance); } else { // Handling other pools toActual = ICurvePoolV1(poolMeta.pool).get_dy(0, int128(uint128(i)), fromBalance); } require( _isWithinThreshold(toExpected, toActual, poolMeta.thresholds[i]), "pool is not balanced" ); } } function _isWithinThreshold( uint256 a, uint256 b, uint256 imbalanceTreshold ) internal pure returns (bool) { if (imbalanceTreshold == 0) imbalanceTreshold = _DEFAULT_IMBALANCE_THRESHOLD; if (a > b) return (a - b).divDown(a) <= imbalanceTreshold; return (b - a).divDown(b) <= imbalanceTreshold; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurvePoolV2 { function token() external view returns (address); function coins(uint256 i) external view returns (address); function factory() external view returns (address); function exchange( uint256 i, uint256 j, uint256 dx, uint256 min_dy, bool use_eth, address receiver ) external returns (uint256); function exchange_underlying( uint256 i, uint256 j, uint256 dx, uint256 min_dy, address receiver ) external returns (uint256); function add_liquidity( uint256[2] memory amounts, uint256 min_mint_amount, bool use_eth, address receiver ) external returns (uint256); function add_liquidity(uint256[2] memory amounts, uint256 min_mint_amount) external returns (uint256); function add_liquidity( uint256[3] memory amounts, uint256 min_mint_amount, bool use_eth, address receiver ) external returns (uint256); function add_liquidity(uint256[3] memory amounts, uint256 min_mint_amount) external returns (uint256); function remove_liquidity( uint256 _amount, uint256[2] memory min_amounts, bool use_eth, address receiver ) external; function remove_liquidity(uint256 _amount, uint256[2] memory min_amounts) external; function remove_liquidity( uint256 _amount, uint256[3] memory min_amounts, bool use_eth, address receiver ) external; function remove_liquidity(uint256 _amount, uint256[3] memory min_amounts) external; function remove_liquidity_one_coin( uint256 token_amount, uint256 i, uint256 min_amount, bool use_eth, address receiver ) external returns (uint256); function get_dy( uint256 i, uint256 j, uint256 dx ) external view returns (uint256); function calc_token_amount(uint256[] memory amounts) external view returns (uint256); function calc_withdraw_one_coin(uint256 token_amount, uint256 i) external view returns (uint256); function get_virtual_price() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.17; interface ICurvePoolV1 { function get_virtual_price() external view returns (uint256); function add_liquidity(uint256[8] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[7] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[6] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[5] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[4] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[3] calldata amounts, uint256 min_mint_amount) external; function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external; function remove_liquidity_imbalance(uint256[4] calldata amounts, uint256 max_burn_amount) external; function remove_liquidity_imbalance(uint256[3] calldata amounts, uint256 max_burn_amount) external; function remove_liquidity_imbalance(uint256[2] calldata amounts, uint256 max_burn_amount) external; function lp_token() external view returns (address); function A_PRECISION() external view returns (uint256); function A_precise() external view returns (uint256); function remove_liquidity(uint256 _amount, uint256[3] calldata min_amounts) external; function exchange( int128 from, int128 to, uint256 _from_amount, uint256 _min_to_amount ) external; function coins(uint256 i) external view returns (address); function balances(uint256 i) external view returns (uint256); function get_dy( int128 i, int128 j, uint256 _dx ) external view returns (uint256); function calc_token_amount(uint256[4] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[3] calldata amounts, bool deposit) external view returns (uint256); function calc_token_amount(uint256[2] calldata amounts, bool deposit) external view returns (uint256); function calc_withdraw_one_coin(uint256 _token_amount, int128 i) external view returns (uint256); function remove_liquidity_one_coin( uint256 _token_amount, int128 i, uint256 min_amount ) external; }
{ "evmVersion": "istanbul", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "CNCLockerV2.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_cncToken","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_crv","type":"address"},{"internalType":"address","name":"_cvx","type":"address"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AirdropBoostClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"crvAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cvxAmount","type":"uint256"}],"name":"FeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"crvAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cvxAmount","type":"uint256"}],"name":"FeesReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"kicker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"KickExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"relocked","type":"bool"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Relocked","type":"event"},{"anonymous":false,"inputs":[],"name":"Shutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"TokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnlockExecuted","type":"event"},{"inputs":[],"name":"V1_LOCKER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accruedFeesIntegralCrv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accruedFeesIntegralCvx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"airdropBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"uint16","name":"nodeIndex","type":"uint16"},{"internalType":"bytes32[]","name":"hashes","type":"bytes32[]"}],"internalType":"struct MerkleProof.Proof","name":"proof","type":"tuple"}],"name":"claimAirdropBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"crvAmount","type":"uint256"},{"internalType":"uint256","name":"cvxAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"claimableFees","outputs":[{"internalType":"uint256","name":"claimableCrv","type":"uint256"},{"internalType":"uint256","name":"claimableCvx","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cncToken","outputs":[{"internalType":"contract ICNCToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"lockTime","type":"uint128"}],"name":"computeBoost","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"executeAvailableUnlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"}],"name":"executeAvailableUnlocksFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint64[]","name":"lockIds","type":"uint64[]"}],"name":"executeUnlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"lockId","type":"uint64"}],"name":"kick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"lockTime","type":"uint64"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"lockTime","type":"uint64"},{"internalType":"bool","name":"relock_","type":"bool"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"lockTime","type":"uint64"},{"internalType":"bool","name":"relock_","type":"bool"},{"internalType":"address","name":"account","type":"address"}],"name":"lockFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedBoosted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"perAccountAccruedCrv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"perAccountAccruedCvx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"perAccountFeesCrv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"perAccountFeesCvx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountCrv","type":"uint256"},{"internalType":"uint256","name":"amountCvx","type":"uint256"}],"name":"receiveFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"lockId","type":"uint64"},{"internalType":"uint64","name":"lockTime","type":"uint64"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"lockTime","type":"uint64"}],"name":"relock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"lockIds","type":"uint64[]"},{"internalType":"uint64","name":"lockTime","type":"uint64"}],"name":"relockMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBoosted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalRewardsBoost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalVoteBoost","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":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockableBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"unlockableBalanceBoosted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userLocks","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"unlockTime","type":"uint64"},{"internalType":"uint128","name":"boost","type":"uint128"},{"internalType":"uint64","name":"id","type":"uint64"}],"internalType":"struct ICNCLockerV2.VoteLock[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"voteLocks","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"unlockTime","type":"uint64"},{"internalType":"uint128","name":"boost","type":"uint128"},{"internalType":"uint64","name":"id","type":"uint64"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101606040523480156200001257600080fd5b5060405162003c5538038062003c558339810160408190526200003591620000f6565b620000403362000089565b6001600160a01b03808716610140528581166080528481166101205283811660e0528216610100526200007762eff100426200016e565b60a05260c05250620001969350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000f157600080fd5b919050565b60008060008060008060c087890312156200011057600080fd5b6200011b87620000d9565b95506200012b60208801620000d9565b94506200013b60408801620000d9565b93506200014b60608801620000d9565b92506200015b60808801620000d9565b915060a087015190509295509295509295565b808201808211156200019057634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e0516101005161012051610140516139f462000261600039600081816107520152610f2e01526000818161046f01526117cb0152600081816105e101528181610d9f0152818161173701526121080152600081816104de01528181610d6a015281816116f901526120cc0152600081816103b7015261098401526000818161058e01526108320152600081816104b701528181611416015281816116bc01528181611aa801528181611adc01528181611d6d01526124be01526139f46000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806378f89c2011610167578063a6aed923116100ce578063ddecf66211610087578063ddecf662146106b2578063dfb142ae146106fc578063ea312d761461070f578063f2fde38b1461073a578063f77c47911461074d578063f816144e1461077457600080fd5b8063a6aed9231461065c578063bb3cac541461066f578063bf4b3e6514610682578063bf86d6901461068a578063c5890d2d14610697578063d294f093146106aa57600080fd5b80638da5cb5b116101205780638da5cb5b146105cb578063923c1d61146105dc57806393ed9d0114610603578063984acb49146106165780639ae697bf146106295780639be65a601461064957600080fd5b806378f89c201461051b5780637907706f1461052e5780637bf500c8146105415780637e0b249214610561578063806019c1146105895780638434cf70146105b057600080fd5b80634f3487581161020b57806361d027b3116101c457806361d027b31461046a578063631516c2146104a9578063645d28a8146104b25780636a4874a1146104d957806370a0823114610500578063715018a61461051357600080fd5b80634f348758146103ff5780635219c5121461041257806356891412146104255780635cad88eb1461042e5780635ee26ad0146104375780635f07112f1461045757600080fd5b80631c91607f1161025d5780631c91607f1461036c57806326a4c8421461038c5780632a3246071461039f5780632eb4a7ab146103b25780633efa9979146103d957806346e919d0146103ec57600080fd5b80630259ef58146102a55780630499abd4146102ce5780630b70608f146102fc57806310b9e5831461031157806311e1dc1e146103195780631b93f66d14610339575b600080fd5b6102b86102b33660046130ff565b61077d565b6040516102c5919061311c565b60405180910390f35b6102ee6102dc3660046130ff565b600c6020526000908152604090205481565b6040519081526020016102c5565b61030f61030a366004613195565b610830565b005b61030f610a41565b6102ee6103273660046130ff565b600e6020526000908152604090205481565b61035c6103473660046130ff565b60056020526000908152604090205460ff1681565b60405190151581526020016102c5565b6102ee61037a3660046130ff565b600f6020526000908152604090205481565b61030f61039a366004613249565b610ad4565b6102ee6103ad3660046130ff565b610b98565b6102ee7f000000000000000000000000000000000000000000000000000000000000000081565b61030f6103e736600461329c565b610c92565b6102ee6103fa3660046130ff565b610ca2565b61030f61040d3660046132c8565b610d5d565b6102ee6104203660046130ff565b610e4e565b6102ee60075481565b6102ee600a5481565b6102ee6104453660046130ff565b60026020526000908152604090205481565b61030f6104653660046132f8565b610ef7565b6104917f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c5565b6102ee60085481565b6104917f000000000000000000000000000000000000000000000000000000000000000081565b6104917f000000000000000000000000000000000000000000000000000000000000000081565b6102ee61050e3660046130ff565b610f08565b61030f610f13565b6102ee6105293660046130ff565b610f27565b61030f61053c366004613338565b611029565b6102ee61054f3660046130ff565b600d6020526000908152604090205481565b61057461056f3660046130ff565b6110a4565b604080519283526020830191909152016102c5565b6102ee7f000000000000000000000000000000000000000000000000000000000000000081565b610491733f41480dd3b32f1cc579125f9570dccd07e0766781565b6000546001600160a01b0316610491565b6104917f000000000000000000000000000000000000000000000000000000000000000081565b6102ee610611366004613362565b61115e565b61030f6106243660046133b6565b61147d565b6102ee6106373660046130ff565b60016020526000908152604090205481565b61030f6106573660046130ff565b6116ba565b61030f61066a3660046133d1565b611889565b6102ee61067d3660046130ff565b611c3d565b6102ee611c87565b60095461035c9060ff1681565b61030f6106a53660046133ef565b611c97565b61057461209a565b6106c56106c0366004613440565b612189565b604080519485526001600160401b0393841660208601526001600160801b03909216918401919091521660608201526080016102c5565b6102ee61070a3660046130ff565b6121e9565b61072261071d36600461346c565b612524565b6040516001600160801b0390911681526020016102c5565b61030f6107483660046130ff565b612595565b6104917f000000000000000000000000000000000000000000000000000000000000000081565b6102ee600b5481565b6001600160a01b0381166000908152600360209081526040808320805482518185028101850190935280835260609492939192909184015b828210156108255760008481526020908190206040805160808101825260028602909201805483526001908101546001600160401b03808216858701526001600160801b03600160401b83041693850193909352600160c01b9004909116606083015290835290920191016107b5565b505050509050919050565b7f000000000000000000000000000000000000000000000000000000000000000042106108945760405162461bcd60e51b815260206004820152600d60248201526c185a5c991c9bdc08195b991959609a1b60448201526064015b60405180910390fd5b3360009081526005602052604090205460ff16156108e65760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015260640161088b565b6730927f74c9de000082111561093e5760405162461bcd60e51b815260206004820181905260248201527f616d6f756e742065786365656473206d61782061697264726f7020626f6f7374604482015260640161088b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018390526000906054016040516020818303038152906040528051906020012090506109b4817f0000000000000000000000000000000000000000000000000000000000000000846109ad90613503565b919061260e565b6109f05760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b604482015260640161088b565b3360008181526004602052604090819020859055517ffb7c165a21b698d172209fd3fbb4a907042c12438cd506666064cd98e0a142aa90610a349086815260200190565b60405180910390a2505050565b610a4961270c565b60095460ff1615610a9c5760405162461bcd60e51b815260206004820152601860248201527f6c6f636b657220616c72656164792073757370656e6465640000000000000000604482015260640161088b565b6009805460ff191660011790556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf890600090a1565b60095460ff1615610af75760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e340011801590610b20575063013c68006001600160401b03821611155b610b3c5760405162461bcd60e51b815260040161088b906135f6565b610b4533612766565b60005b82811015610b9257610b80848483818110610b6557610b65613621565b9050602002016020810190610b7a91906133b6565b83612850565b80610b8a8161364d565b915050610b48565b50505050565b6001600160a01b03811660009081526003602052604081208054829190825b81811015610c8857426001600160801b0316838281548110610bdb57610bdb613621565b60009182526020909120600160029092020101546001600160401b031611610c7657610c69838281548110610c1257610c12613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316848381548110610c5257610c52613621565b600091825260209091206002909102015490612b1f565b610c739085613666565b93505b80610c808161364d565b915050610bb7565b5091949350505050565b610c9e82826000610ef7565b5050565b6040516370a0823160e01b81526001600160a01b0382166004820152600090733f41480dd3b32f1cc579125f9570dccd07e07667906370a0823190602401602060405180830381865afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190613679565b610d2a83610b98565b6001600160a01b038416600090815260026020526040902054610d4d9190613692565b610d579190613666565b92915050565b610d926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085612b48565b610dc76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084612b48565b600854610dd5908390612bb3565b600a6000828254610de69190613666565b9091555050600854610df9908290612bb3565b600b6000828254610e0a9190613666565b9091555050604080518381526020810183905233917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a25050565b6001600160a01b03811660009081526003602052604081208054829190825b81811015610c8857426001600160801b0316838281548110610e9157610e91613621565b60009182526020909120600160029092020101546001600160401b031611610ee557828181548110610ec557610ec5613621565b90600052602060002090600202016000015484610ee29190613666565b93505b80610eef8161364d565b915050610e6d565b610f0383838333611c97565b505050565b6000610d5782610f27565b610f1b61270c565b610f256000612bcc565b565b6000610d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348439e7e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae91906136a5565b60405163067ba3d960e41b81526001600160a01b03858116600483015291909116906367ba3d9090602401602060405180830381865afa158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a9190613679565b61102384610ca2565b90612b1f565b60095460ff161561104c5760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e340011801590611075575063013c68006001600160401b03821611155b6110915760405162461bcd60e51b815260040161088b906135f6565b61109a33612766565b610c9e8282612850565b6001600160a01b038116600090815260026020908152604080832054600c909252822054600a548392916110e3916110dc9190613692565b8290612b1f565b6001600160a01b0385166000908152600d60205260409020546111069190613666565b6001600160a01b0385166000908152600e6020526040902054600b54919450611133916110dc9190613692565b6001600160a01b0385166000908152600f60205260409020546111569190613666565b915050915091565b600061116933612766565b3360009081526003602052604081208190815b8581101561138f5760006111b63389898581811061119c5761119c613621565b90506020020160208101906111b191906133b6565b612c1c565b60095490915060ff16806111f85750428382815481106111d8576111d8613621565b60009182526020909120600160029092020101546001600160401b031611155b6112375760405162461bcd60e51b815260206004820152601060248201526f1b1bd8dac81b9bdd08195e1c1a5c995960821b604482015260640161088b565b82818154811061124957611249613621565b906000526020600020906002020160000154856112669190613666565b945061127d838281548110610c1257610c12613621565b6112879085613666565b8354909450839061129a90600190613692565b815481106112aa576112aa613621565b90600052602060002090600202018382815481106112ca576112ca613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b03909116179055825483908061135e5761135e6136c2565b60008281526020812060026000199093019283020181815560010155905550806113878161364d565b91505061117c565b5082600760008282546113a29190613692565b9250508190555081600860008282546113bb9190613692565b909155505033600090815260016020526040812080548592906113df908490613692565b90915550503360009081526002602052604081208054849290611403908490613692565b9091555061143d90506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168885612cf7565b60405183815233907fb291e2a2847a5ad6d47409943306c6d6e8c63a9855b849701b868191e94789709060200160405180910390a2509095945050505050565b60095460ff16156114a05760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e3400118015906114c9575063013c68006001600160401b03821611155b6114e55760405162461bcd60e51b815260040161088b906135f6565b6114ee33612766565b6000611502826001600160401b0316612524565b9050600061151083426136d8565b336000908152600360205260408120549192505b818110156115a55733600090815260036020526040902080546001600160401b03851691908390811061155957611559613621565b60009182526020909120600160029092020101546001600160401b0316106115935760405162461bcd60e51b815260040161088b906136ff565b8061159d8161364d565b915050611524565b503360009081526003602052604081206115be916130af565b3360009081526002602052604081205460088054919290916115e1908490613692565b9091555050336000818152600260209081526040808320839055600190915290205461160f91908486612d27565b33600090815260016020526040812054611632906001600160801b038616612b1f565b905080600860008282546116469190613666565b9091555050336000908152600260205260408120805483929061166a908490613666565b9091555050336000818152600160209081526040918290205491519182527fe2d155d9d74decc198a9a9b4f5bddb24ee0842ee745c9ce57e3573b971e50d9d910160405180910390a25050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415801561172e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b801561176c57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b6117b05760405162461bcd60e51b815260206004820152601560248201527431b0b73737ba103bb4ba34323930bb903a37b5b2b760591b604482015260640161088b565b6040516370a0823160e01b81523060048201528190611851907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561181c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118409190613679565b6001600160a01b0384169190612cf7565b6040516001600160a01b038316907f17a79be10b6da9324a110f0ea6d3043db38f1eee6e2ee1dbfa7272338e39da4590600090a25050565b60006118958383612c1c565b6001600160a01b03841660009081526003602052604090208054919250906001600160801b034216906224ea00908390859081106118d5576118d5613621565b60009182526020909120600160029092020101546118fc91906001600160401b0316613736565b6001600160801b0316111561194b5760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74206b69636b2074686973206c6f636b60581b604482015260640161088b565b61195484612766565b600081838154811061196857611968613621565b9060005260206000209060020201600001549050806007600082825461198e9190613692565b925050819055506119d58284815481106119aa576119aa613621565b60009182526020909120600290910201600101548290600160401b90046001600160801b0316612b1f565b600860008282546119e69190613692565b90915550506001600160a01b03851660009081526001602052604081208054839290611a13908490613692565b92505081905550611a2f8284815481106119aa576119aa613621565b6001600160a01b03861660009081526002602052604081208054909190611a57908490613692565b9091555060009050611a718267016345785d8a0000612b1f565b9050683635c9adc5dea00000811115611a905750683635c9adc5dea000005b611acf86611a9e8385613692565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190612cf7565b611b036001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612cf7565b60405182815233906001600160a01b038816907f9716d4c8630c7c1a47a462f169d1764a38687f7532baf2bd74a791afc20030e69060200160405180910390a382548390611b5390600190613692565b81548110611b6357611b63613621565b9060005260206000209060020201838581548110611b8357611b83613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558254839080611c1757611c176136c2565b600082815260208120600260001990930192830201818155600101559055505050505050565b6001600160a01b0381166000908152600460205260408120548103611c6b5750670de0b6b3a7640000919050565b506001600160a01b031660009081526004602052604090205490565b6000611c92336121e9565b905090565b60095460ff1615611cba5760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038316629e340011801590611ce3575063013c68006001600160401b03841611155b611cff5760405162461bcd60e51b815260040161088b906135f6565b811580611d145750336001600160a01b038216145b611d575760405162461bcd60e51b81526020600482015260146024820152733932b637b1b59037b7363c903337b91039b2b63360611b604482015260640161088b565b611d6081612766565b611d956001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087612b48565b6000611da9846001600160401b0316612524565b90506000611db633611c3d565b9050670de0b6b3a7640000811115611e0857336000908152600560205260409020805460ff19166001179055611df56001600160801b03831682612e12565b3360009081526004602052604081205591505b6000611e1486426136d8565b905060008515611f8f576001600160a01b038516600090815260036020526040812054905b81811015611ec3576001600160a01b038716600090815260036020526040902080546001600160401b038616919083908110611e7757611e77613621565b60009182526020909120600160029092020101546001600160401b031610611eb15760405162461bcd60e51b815260040161088b906136ff565b80611ebb8161364d565b915050611e39565b506001600160a01b0386166000908152600360205260408120611ee5916130af565b6001600160a01b0386166000908152600260205260408120546008805491929091611f11908490613692565b90915550506001600160a01b03861660009081526002602090815260408083208390556001909152902054611f54908790611f4d908c90613666565b8588612d27565b6001600160a01b038616600090815260016020526040902054611f87906001600160801b03871690611023908c90613666565b915050611fb1565b611f9b85898487612d27565b611fae886001600160801b038616612b1f565b90505b8760076000828254611fc39190613666565b925050819055508060086000828254611fdc9190613666565b90915550506001600160a01b038516600090815260016020526040812080548a9290612009908490613666565b90915550506001600160a01b03851660009081526002602052604081208054839290612036908490613666565b9091555050604080518981526001600160401b03841660208201528715158183015290516001600160a01b038716917fca8d506eda84f8ed07c2908ae102299d34888ef5e19b97f56e4d6fcd1104c31e919081900360600190a25050505050505050565b6000806120a633612766565b5050336000818152600d6020908152604080832054600f9092529091205490916120fb907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169084612cf7565b61212f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612cf7565b336000818152600d60209081526040808320839055600f82528083209290925581518581529081018490527f1ac537f0ad67b64ac68a04587ff3a4cb6977de22eb2c37ee560897a92c6d07c7910160405180910390a29091565b600360205281600052604060002081815481106121a557600080fd5b6000918252602090912060029091020180546001909101549092506001600160401b0380821692506001600160801b03600160401b83041691600160c01b90041684565b60006001600160a01b0382166122375760405162461bcd60e51b815260206004820152601360248201527234b73b30b634b2103232b9ba34b730ba34b7b760691b604482015260640161088b565b61224033612766565b33600090815260036020526040812080548291905b801561243857612266600182613692565b60095490915060ff16806122a857504282828154811061228857612288613621565b60009182526020909120600160029092020101546001600160401b031611155b15612433578181815481106122bf576122bf613621565b906000526020600020906002020160000154846122dc9190613666565b93506123338282815481106122f3576122f3613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316838381548110610c5257610c52613621565b61233d9084613666565b8254909350829061235090600190613692565b8154811061236057612360613621565b906000526020600020906002020182828154811061238057612380613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558154829080612414576124146136c2565b6000828152602081206002600019909301928302018181556001015590555b612255565b836007600082825461244a9190613692565b9250508190555082600860008282546124639190613692565b90915550503360009081526001602052604081208054869290612487908490613692565b909155505033600090815260026020526040812080548592906124ab908490613692565b909155506124e590506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168786612cf7565b60405184815233907fb291e2a2847a5ad6d47409943306c6d6e8c63a9855b849701b868191e94789709060200160405180910390a25091949350505050565b6000670de0b6b3a764000061258b612562612546629e340063013c6800613756565b612553629e340087613756565b6001600160801b031690612e34565b61257c670de0b6b3a76400006714d1120d7b160000613756565b6001600160801b031690612e12565b610d579190613736565b61259d61270c565b6001600160a01b0381166126025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b61260b81612bcc565b50565b602083015151835160009190825b828110156127015761262f60028361378c565b61ffff1660000361269057858760200151828151811061265157612651613621565b6020026020010151604051602001612673929190918252602082015260400190565b6040516020818303038152906040528051906020012095506126e2565b866020015181815181106126a6576126a6613621565b6020026020010151866040516020016126c9929190918252602082015260400190565b6040516020818303038152906040528051906020012095505b6126ed6002836137ad565b9150806126f98161364d565b91505061261c565b505050911492915050565b6000546001600160a01b03163314610f255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088b565b6001600160a01b038116600090815260026020908152604080832054600c90925290912054600a5461279b916110dc91613692565b6001600160a01b0383166000908152600d6020526040812080549091906127c3908490613666565b9091555050600a546001600160a01b0383166000908152600c6020908152604080832093909355600e90522054600b54612800916110dc91613692565b6001600160a01b0383166000908152600f602052604081208054909190612828908490613666565b9091555050600b546001600160a01b039092166000908152600e602052604090209190915550565b600061285c3384612c1c565b90506000612872836001600160401b0316612524565b9050600061288084426136d8565b3360009081526003602052604090208054919250906001600160401b038316908290869081106128b2576128b2613621565b60009182526020909120600160029092020101546001600160401b0316106128ec5760405162461bcd60e51b815260040161088b906136ff565b600081858154811061290057612900613621565b9060005260206000209060020201600001549050600061296b83878154811061292b5761292b613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316848881548110610c5257610c52613621565b8354909150839061297e90600190613692565b8154811061298e5761298e613621565b90600052602060002090600202018387815481106129ae576129ae613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558254839080612a4257612a426136c2565b600082815260208120600260001990930192830201818155600101559055612a6c33838688612d27565b6000612a81836001600160801b038816612b1f565b90508181600854612a929190613666565b612a9c9190613692565b600855336000908152600260205260409020548290612abc908390613666565b612ac69190613692565b33600081815260026020526040908190209290925590517fe2d155d9d74decc198a9a9b4f5bddb24ee0842ee745c9ce57e3573b971e50d9d90612b0c9086815260200190565b60405180910390a2505050505050505050565b6000612b2d6012600a6138b2565b612b3783856138be565b612b4191906138d5565b9392505050565b6040516001600160a01b0380851660248301528316604482015260648101829052610b929085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e4d565b600081612bc26012600a6138b2565b612b3790856138be565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600090815260036020526040812054815b81811015612cb9576001600160a01b038516600090815260036020526040902080546001600160401b038616919083908110612c7557612c75613621565b6000918252602090912060029091020160010154600160c01b90046001600160401b031603612ca7579150610d579050565b80612cb18161364d565b915050612c37565b5060405162461bcd60e51b81526020600482015260126024820152711b1bd8dac8191bd95cdb89dd08195e1a5cdd60721b604482015260640161088b565b6040516001600160a01b038316602482015260448101829052610f0390849063a9059cbb60e01b90606401612b7c565b6006546001600160a01b038516600090815260036020908152604080832081516080810183528881526001600160401b038881168286019081526001600160801b03808a1695840195865297821660608401818152855460018181018855968a529790982093516002909702909301958655519483018054945196518216600160c01b026001600160c01b0397909816600160401b026001600160c01b031990951695909116949094179290921793909316939093179055612dea9082906136d8565b6006805467ffffffffffffffff19166001600160401b03929092169190911790555050505050565b6000612e206012600a6138b2565b612e2a83856138e9565b612b419190613914565b600081612e436012600a6138b2565b612e2a90856138e9565b6000612ea2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f1f9092919063ffffffff16565b805190915015610f035780806020019051810190612ec0919061392e565b610f035760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161088b565b6060612f2e8484600085612f36565b949350505050565b606082471015612f975760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161088b565b600080866001600160a01b03168587604051612fb3919061396f565b60006040518083038185875af1925050503d8060008114612ff0576040519150601f19603f3d011682016040523d82523d6000602084013e612ff5565b606091505b509150915061300687838387613011565b979650505050505050565b60608315613080578251600003613079576001600160a01b0385163b6130795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161088b565b5081612f2e565b612f2e83838151156130955781518083602001fd5b8060405162461bcd60e51b815260040161088b919061398b565b508054600082556002029060005260206000209081019061260b91905b808211156130e657600080825560018201556002016130cc565b5090565b6001600160a01b038116811461260b57600080fd5b60006020828403121561311157600080fd5b8135612b41816130ea565b602080825282518282018190526000919060409081850190868401855b8281101561318857815180518552868101516001600160401b0390811688870152868201516001600160801b031687870152606091820151169085015260809093019290850190600101613139565b5091979650505050505050565b600080604083850312156131a857600080fd5b8235915060208301356001600160401b038111156131c557600080fd5b8301604081860312156131d757600080fd5b809150509250929050565b60008083601f8401126131f457600080fd5b5081356001600160401b0381111561320b57600080fd5b6020830191508360208260051b850101111561322657600080fd5b9250929050565b80356001600160401b038116811461324457600080fd5b919050565b60008060006040848603121561325e57600080fd5b83356001600160401b0381111561327457600080fd5b613280868287016131e2565b909450925061329390506020850161322d565b90509250925092565b600080604083850312156132af57600080fd5b823591506132bf6020840161322d565b90509250929050565b600080604083850312156132db57600080fd5b50508035926020909101359150565b801515811461260b57600080fd5b60008060006060848603121561330d57600080fd5b8335925061331d6020850161322d565b9150604084013561332d816132ea565b809150509250925092565b6000806040838503121561334b57600080fd5b6133548361322d565b91506132bf6020840161322d565b60008060006040848603121561337757600080fd5b8335613382816130ea565b925060208401356001600160401b0381111561339d57600080fd5b6133a9868287016131e2565b9497909650939450505050565b6000602082840312156133c857600080fd5b612b418261322d565b600080604083850312156133e457600080fd5b8235613354816130ea565b6000806000806080858703121561340557600080fd5b843593506134156020860161322d565b92506040850135613425816132ea565b91506060850135613435816130ea565b939692955090935050565b6000806040838503121561345357600080fd5b823561345e816130ea565b946020939093013593505050565b60006020828403121561347e57600080fd5b81356001600160801b0381168114612b4157600080fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156134cd576134cd613495565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134fb576134fb613495565b604052919050565b60006040823603121561351557600080fd5b61351d6134ab565b823561ffff8116811461352f57600080fd5b81526020838101356001600160401b038082111561354c57600080fd5b9085019036601f83011261355f57600080fd5b81358181111561357157613571613495565b8060051b91506135828483016134d3565b818152918301840191848101903684111561359c57600080fd5b938501935b838510156135ba578435825293850193908501906135a1565b94860194909452509295945050505050565b60208082526010908201526f1b1bd8dad95c881cdd5cdc195b99195960821b604082015260600190565b6020808252601190820152701b1bd8dac81d1a5b59481a5b9d985b1a59607a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161365f5761365f613637565b5060010190565b80820180821115610d5757610d57613637565b60006020828403121561368b57600080fd5b5051919050565b81810381811115610d5757610d57613637565b6000602082840312156136b757600080fd5b8151612b41816130ea565b634e487b7160e01b600052603160045260246000fd5b6001600160401b038181168382160190808211156136f8576136f8613637565b5092915050565b6020808252601e908201527f63616e6e6f74206d6f76652074686520756e6c6f636b2074696d652075700000604082015260600190565b6001600160801b038181168382160190808211156136f8576136f8613637565b6001600160801b038281168282160390808211156136f8576136f8613637565b634e487b7160e01b600052601260045260246000fd5b600061ffff808416806137a1576137a1613776565b92169190910692915050565b600061ffff808416806137c2576137c2613776565b92169190910492915050565b600181815b808511156138095781600019048211156137ef576137ef613637565b808516156137fc57918102915b93841c93908002906137d3565b509250929050565b60008261382057506001610d57565b8161382d57506000610d57565b8160018114613843576002811461384d57613869565b6001915050610d57565b60ff84111561385e5761385e613637565b50506001821b610d57565b5060208310610133831016604e8410600b841016171561388c575081810a610d57565b61389683836137ce565b80600019048211156138aa576138aa613637565b029392505050565b6000612b418383613811565b8082028115828204841417610d5757610d57613637565b6000826138e4576138e4613776565b500490565b6001600160801b0381811683821602808216919082811461390c5761390c613637565b505092915050565b60006001600160801b03808416806137c2576137c2613776565b60006020828403121561394057600080fd5b8151612b41816132ea565b60005b8381101561396657818101518382015260200161394e565b50506000910152565b6000825161398181846020870161394b565b9190910192915050565b60208152600082518060208401526139aa81604085016020870161394b565b601f01601f1916919091016040019291505056fea26469706673582212209da3b742dc4887a2cb62925f8826e21b57f7f747c6bcfd4ef674ef2fecbd3f6b64736f6c63430008110033000000000000000000000000013a3da6591d3427f164862793ab4e388f9b587e0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a7
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806378f89c2011610167578063a6aed923116100ce578063ddecf66211610087578063ddecf662146106b2578063dfb142ae146106fc578063ea312d761461070f578063f2fde38b1461073a578063f77c47911461074d578063f816144e1461077457600080fd5b8063a6aed9231461065c578063bb3cac541461066f578063bf4b3e6514610682578063bf86d6901461068a578063c5890d2d14610697578063d294f093146106aa57600080fd5b80638da5cb5b116101205780638da5cb5b146105cb578063923c1d61146105dc57806393ed9d0114610603578063984acb49146106165780639ae697bf146106295780639be65a601461064957600080fd5b806378f89c201461051b5780637907706f1461052e5780637bf500c8146105415780637e0b249214610561578063806019c1146105895780638434cf70146105b057600080fd5b80634f3487581161020b57806361d027b3116101c457806361d027b31461046a578063631516c2146104a9578063645d28a8146104b25780636a4874a1146104d957806370a0823114610500578063715018a61461051357600080fd5b80634f348758146103ff5780635219c5121461041257806356891412146104255780635cad88eb1461042e5780635ee26ad0146104375780635f07112f1461045757600080fd5b80631c91607f1161025d5780631c91607f1461036c57806326a4c8421461038c5780632a3246071461039f5780632eb4a7ab146103b25780633efa9979146103d957806346e919d0146103ec57600080fd5b80630259ef58146102a55780630499abd4146102ce5780630b70608f146102fc57806310b9e5831461031157806311e1dc1e146103195780631b93f66d14610339575b600080fd5b6102b86102b33660046130ff565b61077d565b6040516102c5919061311c565b60405180910390f35b6102ee6102dc3660046130ff565b600c6020526000908152604090205481565b6040519081526020016102c5565b61030f61030a366004613195565b610830565b005b61030f610a41565b6102ee6103273660046130ff565b600e6020526000908152604090205481565b61035c6103473660046130ff565b60056020526000908152604090205460ff1681565b60405190151581526020016102c5565b6102ee61037a3660046130ff565b600f6020526000908152604090205481565b61030f61039a366004613249565b610ad4565b6102ee6103ad3660046130ff565b610b98565b6102ee7f1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a781565b61030f6103e736600461329c565b610c92565b6102ee6103fa3660046130ff565b610ca2565b61030f61040d3660046132c8565b610d5d565b6102ee6104203660046130ff565b610e4e565b6102ee60075481565b6102ee600a5481565b6102ee6104453660046130ff565b60026020526000908152604090205481565b61030f6104653660046132f8565b610ef7565b6104917f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea81565b6040516001600160a01b0390911681526020016102c5565b6102ee60085481565b6104917f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc81565b6104917f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b6102ee61050e3660046130ff565b610f08565b61030f610f13565b6102ee6105293660046130ff565b610f27565b61030f61053c366004613338565b611029565b6102ee61054f3660046130ff565b600d6020526000908152604090205481565b61057461056f3660046130ff565b6110a4565b604080519283526020830191909152016102c5565b6102ee7f0000000000000000000000000000000000000000000000000000000064ef545381565b610491733f41480dd3b32f1cc579125f9570dccd07e0766781565b6000546001600160a01b0316610491565b6104917f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b81565b6102ee610611366004613362565b61115e565b61030f6106243660046133b6565b61147d565b6102ee6106373660046130ff565b60016020526000908152604090205481565b61030f6106573660046130ff565b6116ba565b61030f61066a3660046133d1565b611889565b6102ee61067d3660046130ff565b611c3d565b6102ee611c87565b60095461035c9060ff1681565b61030f6106a53660046133ef565b611c97565b61057461209a565b6106c56106c0366004613440565b612189565b604080519485526001600160401b0393841660208601526001600160801b03909216918401919091521660608201526080016102c5565b6102ee61070a3660046130ff565b6121e9565b61072261071d36600461346c565b612524565b6040516001600160801b0390911681526020016102c5565b61030f6107483660046130ff565b612595565b6104917f000000000000000000000000013a3da6591d3427f164862793ab4e388f9b587e81565b6102ee600b5481565b6001600160a01b0381166000908152600360209081526040808320805482518185028101850190935280835260609492939192909184015b828210156108255760008481526020908190206040805160808101825260028602909201805483526001908101546001600160401b03808216858701526001600160801b03600160401b83041693850193909352600160c01b9004909116606083015290835290920191016107b5565b505050509050919050565b7f0000000000000000000000000000000000000000000000000000000064ef545342106108945760405162461bcd60e51b815260206004820152600d60248201526c185a5c991c9bdc08195b991959609a1b60448201526064015b60405180910390fd5b3360009081526005602052604090205460ff16156108e65760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b604482015260640161088b565b6730927f74c9de000082111561093e5760405162461bcd60e51b815260206004820181905260248201527f616d6f756e742065786365656473206d61782061697264726f7020626f6f7374604482015260640161088b565b6040516bffffffffffffffffffffffff193360601b166020820152603481018390526000906054016040516020818303038152906040528051906020012090506109b4817f1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a7846109ad90613503565b919061260e565b6109f05760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b604482015260640161088b565b3360008181526004602052604090819020859055517ffb7c165a21b698d172209fd3fbb4a907042c12438cd506666064cd98e0a142aa90610a349086815260200190565b60405180910390a2505050565b610a4961270c565b60095460ff1615610a9c5760405162461bcd60e51b815260206004820152601860248201527f6c6f636b657220616c72656164792073757370656e6465640000000000000000604482015260640161088b565b6009805460ff191660011790556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf890600090a1565b60095460ff1615610af75760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e340011801590610b20575063013c68006001600160401b03821611155b610b3c5760405162461bcd60e51b815260040161088b906135f6565b610b4533612766565b60005b82811015610b9257610b80848483818110610b6557610b65613621565b9050602002016020810190610b7a91906133b6565b83612850565b80610b8a8161364d565b915050610b48565b50505050565b6001600160a01b03811660009081526003602052604081208054829190825b81811015610c8857426001600160801b0316838281548110610bdb57610bdb613621565b60009182526020909120600160029092020101546001600160401b031611610c7657610c69838281548110610c1257610c12613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316848381548110610c5257610c52613621565b600091825260209091206002909102015490612b1f565b610c739085613666565b93505b80610c808161364d565b915050610bb7565b5091949350505050565b610c9e82826000610ef7565b5050565b6040516370a0823160e01b81526001600160a01b0382166004820152600090733f41480dd3b32f1cc579125f9570dccd07e07667906370a0823190602401602060405180830381865afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190613679565b610d2a83610b98565b6001600160a01b038416600090815260026020526040902054610d4d9190613692565b610d579190613666565b92915050565b610d926001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216333085612b48565b610dc76001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b16333084612b48565b600854610dd5908390612bb3565b600a6000828254610de69190613666565b9091555050600854610df9908290612bb3565b600b6000828254610e0a9190613666565b9091555050604080518381526020810183905233917f213e72af0d3613bd643cff3059f872c1015e6541624e37872bf95eefbaf220a8910160405180910390a25050565b6001600160a01b03811660009081526003602052604081208054829190825b81811015610c8857426001600160801b0316838281548110610e9157610e91613621565b60009182526020909120600160029092020101546001600160401b031611610ee557828181548110610ec557610ec5613621565b90600052602060002090600202016000015484610ee29190613666565b93505b80610eef8161364d565b915050610e6d565b610f0383838333611c97565b505050565b6000610d5782610f27565b610f1b61270c565b610f256000612bcc565b565b6000610d577f000000000000000000000000013a3da6591d3427f164862793ab4e388f9b587e6001600160a01b03166348439e7e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae91906136a5565b60405163067ba3d960e41b81526001600160a01b03858116600483015291909116906367ba3d9090602401602060405180830381865afa158015610ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101a9190613679565b61102384610ca2565b90612b1f565b60095460ff161561104c5760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e340011801590611075575063013c68006001600160401b03821611155b6110915760405162461bcd60e51b815260040161088b906135f6565b61109a33612766565b610c9e8282612850565b6001600160a01b038116600090815260026020908152604080832054600c909252822054600a548392916110e3916110dc9190613692565b8290612b1f565b6001600160a01b0385166000908152600d60205260409020546111069190613666565b6001600160a01b0385166000908152600e6020526040902054600b54919450611133916110dc9190613692565b6001600160a01b0385166000908152600f60205260409020546111569190613666565b915050915091565b600061116933612766565b3360009081526003602052604081208190815b8581101561138f5760006111b63389898581811061119c5761119c613621565b90506020020160208101906111b191906133b6565b612c1c565b60095490915060ff16806111f85750428382815481106111d8576111d8613621565b60009182526020909120600160029092020101546001600160401b031611155b6112375760405162461bcd60e51b815260206004820152601060248201526f1b1bd8dac81b9bdd08195e1c1a5c995960821b604482015260640161088b565b82818154811061124957611249613621565b906000526020600020906002020160000154856112669190613666565b945061127d838281548110610c1257610c12613621565b6112879085613666565b8354909450839061129a90600190613692565b815481106112aa576112aa613621565b90600052602060002090600202018382815481106112ca576112ca613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b03909116179055825483908061135e5761135e6136c2565b60008281526020812060026000199093019283020181815560010155905550806113878161364d565b91505061117c565b5082600760008282546113a29190613692565b9250508190555081600860008282546113bb9190613692565b909155505033600090815260016020526040812080548592906113df908490613692565b90915550503360009081526002602052604081208054849290611403908490613692565b9091555061143d90506001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc168885612cf7565b60405183815233907fb291e2a2847a5ad6d47409943306c6d6e8c63a9855b849701b868191e94789709060200160405180910390a2509095945050505050565b60095460ff16156114a05760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038116629e3400118015906114c9575063013c68006001600160401b03821611155b6114e55760405162461bcd60e51b815260040161088b906135f6565b6114ee33612766565b6000611502826001600160401b0316612524565b9050600061151083426136d8565b336000908152600360205260408120549192505b818110156115a55733600090815260036020526040902080546001600160401b03851691908390811061155957611559613621565b60009182526020909120600160029092020101546001600160401b0316106115935760405162461bcd60e51b815260040161088b906136ff565b8061159d8161364d565b915050611524565b503360009081526003602052604081206115be916130af565b3360009081526002602052604081205460088054919290916115e1908490613692565b9091555050336000818152600260209081526040808320839055600190915290205461160f91908486612d27565b33600090815260016020526040812054611632906001600160801b038616612b1f565b905080600860008282546116469190613666565b9091555050336000908152600260205260408120805483929061166a908490613666565b9091555050336000818152600160209081526040918290205491519182527fe2d155d9d74decc198a9a9b4f5bddb24ee0842ee745c9ce57e3573b971e50d9d910160405180910390a25050505050565b7f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc6001600160a01b0316816001600160a01b03161415801561172e57507f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b0316816001600160a01b031614155b801561176c57507f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b6001600160a01b0316816001600160a01b031614155b6117b05760405162461bcd60e51b815260206004820152601560248201527431b0b73737ba103bb4ba34323930bb903a37b5b2b760591b604482015260640161088b565b6040516370a0823160e01b81523060048201528190611851907f000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea906001600160a01b038416906370a0823190602401602060405180830381865afa15801561181c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118409190613679565b6001600160a01b0384169190612cf7565b6040516001600160a01b038316907f17a79be10b6da9324a110f0ea6d3043db38f1eee6e2ee1dbfa7272338e39da4590600090a25050565b60006118958383612c1c565b6001600160a01b03841660009081526003602052604090208054919250906001600160801b034216906224ea00908390859081106118d5576118d5613621565b60009182526020909120600160029092020101546118fc91906001600160401b0316613736565b6001600160801b0316111561194b5760405162461bcd60e51b815260206004820152601560248201527463616e6e6f74206b69636b2074686973206c6f636b60581b604482015260640161088b565b61195484612766565b600081838154811061196857611968613621565b9060005260206000209060020201600001549050806007600082825461198e9190613692565b925050819055506119d58284815481106119aa576119aa613621565b60009182526020909120600290910201600101548290600160401b90046001600160801b0316612b1f565b600860008282546119e69190613692565b90915550506001600160a01b03851660009081526001602052604081208054839290611a13908490613692565b92505081905550611a2f8284815481106119aa576119aa613621565b6001600160a01b03861660009081526002602052604081208054909190611a57908490613692565b9091555060009050611a718267016345785d8a0000612b1f565b9050683635c9adc5dea00000811115611a905750683635c9adc5dea000005b611acf86611a9e8385613692565b6001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc169190612cf7565b611b036001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc163383612cf7565b60405182815233906001600160a01b038816907f9716d4c8630c7c1a47a462f169d1764a38687f7532baf2bd74a791afc20030e69060200160405180910390a382548390611b5390600190613692565b81548110611b6357611b63613621565b9060005260206000209060020201838581548110611b8357611b83613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558254839080611c1757611c176136c2565b600082815260208120600260001990930192830201818155600101559055505050505050565b6001600160a01b0381166000908152600460205260408120548103611c6b5750670de0b6b3a7640000919050565b506001600160a01b031660009081526004602052604090205490565b6000611c92336121e9565b905090565b60095460ff1615611cba5760405162461bcd60e51b815260040161088b906135cc565b6001600160401b038316629e340011801590611ce3575063013c68006001600160401b03841611155b611cff5760405162461bcd60e51b815260040161088b906135f6565b811580611d145750336001600160a01b038216145b611d575760405162461bcd60e51b81526020600482015260146024820152733932b637b1b59037b7363c903337b91039b2b63360611b604482015260640161088b565b611d6081612766565b611d956001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc16333087612b48565b6000611da9846001600160401b0316612524565b90506000611db633611c3d565b9050670de0b6b3a7640000811115611e0857336000908152600560205260409020805460ff19166001179055611df56001600160801b03831682612e12565b3360009081526004602052604081205591505b6000611e1486426136d8565b905060008515611f8f576001600160a01b038516600090815260036020526040812054905b81811015611ec3576001600160a01b038716600090815260036020526040902080546001600160401b038616919083908110611e7757611e77613621565b60009182526020909120600160029092020101546001600160401b031610611eb15760405162461bcd60e51b815260040161088b906136ff565b80611ebb8161364d565b915050611e39565b506001600160a01b0386166000908152600360205260408120611ee5916130af565b6001600160a01b0386166000908152600260205260408120546008805491929091611f11908490613692565b90915550506001600160a01b03861660009081526002602090815260408083208390556001909152902054611f54908790611f4d908c90613666565b8588612d27565b6001600160a01b038616600090815260016020526040902054611f87906001600160801b03871690611023908c90613666565b915050611fb1565b611f9b85898487612d27565b611fae886001600160801b038616612b1f565b90505b8760076000828254611fc39190613666565b925050819055508060086000828254611fdc9190613666565b90915550506001600160a01b038516600090815260016020526040812080548a9290612009908490613666565b90915550506001600160a01b03851660009081526002602052604081208054839290612036908490613666565b9091555050604080518981526001600160401b03841660208201528715158183015290516001600160a01b038716917fca8d506eda84f8ed07c2908ae102299d34888ef5e19b97f56e4d6fcd1104c31e919081900360600190a25050505050505050565b6000806120a633612766565b5050336000818152600d6020908152604080832054600f9092529091205490916120fb907f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b03169084612cf7565b61212f6001600160a01b037f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b163383612cf7565b336000818152600d60209081526040808320839055600f82528083209290925581518581529081018490527f1ac537f0ad67b64ac68a04587ff3a4cb6977de22eb2c37ee560897a92c6d07c7910160405180910390a29091565b600360205281600052604060002081815481106121a557600080fd5b6000918252602090912060029091020180546001909101549092506001600160401b0380821692506001600160801b03600160401b83041691600160c01b90041684565b60006001600160a01b0382166122375760405162461bcd60e51b815260206004820152601360248201527234b73b30b634b2103232b9ba34b730ba34b7b760691b604482015260640161088b565b61224033612766565b33600090815260036020526040812080548291905b801561243857612266600182613692565b60095490915060ff16806122a857504282828154811061228857612288613621565b60009182526020909120600160029092020101546001600160401b031611155b15612433578181815481106122bf576122bf613621565b906000526020600020906002020160000154846122dc9190613666565b93506123338282815481106122f3576122f3613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316838381548110610c5257610c52613621565b61233d9084613666565b8254909350829061235090600190613692565b8154811061236057612360613621565b906000526020600020906002020182828154811061238057612380613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558154829080612414576124146136c2565b6000828152602081206002600019909301928302018181556001015590555b612255565b836007600082825461244a9190613692565b9250508190555082600860008282546124639190613692565b90915550503360009081526001602052604081208054869290612487908490613692565b909155505033600090815260026020526040812080548592906124ab908490613692565b909155506124e590506001600160a01b037f0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc168786612cf7565b60405184815233907fb291e2a2847a5ad6d47409943306c6d6e8c63a9855b849701b868191e94789709060200160405180910390a25091949350505050565b6000670de0b6b3a764000061258b612562612546629e340063013c6800613756565b612553629e340087613756565b6001600160801b031690612e34565b61257c670de0b6b3a76400006714d1120d7b160000613756565b6001600160801b031690612e12565b610d579190613736565b61259d61270c565b6001600160a01b0381166126025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b61260b81612bcc565b50565b602083015151835160009190825b828110156127015761262f60028361378c565b61ffff1660000361269057858760200151828151811061265157612651613621565b6020026020010151604051602001612673929190918252602082015260400190565b6040516020818303038152906040528051906020012095506126e2565b866020015181815181106126a6576126a6613621565b6020026020010151866040516020016126c9929190918252602082015260400190565b6040516020818303038152906040528051906020012095505b6126ed6002836137ad565b9150806126f98161364d565b91505061261c565b505050911492915050565b6000546001600160a01b03163314610f255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088b565b6001600160a01b038116600090815260026020908152604080832054600c90925290912054600a5461279b916110dc91613692565b6001600160a01b0383166000908152600d6020526040812080549091906127c3908490613666565b9091555050600a546001600160a01b0383166000908152600c6020908152604080832093909355600e90522054600b54612800916110dc91613692565b6001600160a01b0383166000908152600f602052604081208054909190612828908490613666565b9091555050600b546001600160a01b039092166000908152600e602052604090209190915550565b600061285c3384612c1c565b90506000612872836001600160401b0316612524565b9050600061288084426136d8565b3360009081526003602052604090208054919250906001600160401b038316908290869081106128b2576128b2613621565b60009182526020909120600160029092020101546001600160401b0316106128ec5760405162461bcd60e51b815260040161088b906136ff565b600081858154811061290057612900613621565b9060005260206000209060020201600001549050600061296b83878154811061292b5761292b613621565b906000526020600020906002020160010160089054906101000a90046001600160801b03166001600160801b0316848881548110610c5257610c52613621565b8354909150839061297e90600190613692565b8154811061298e5761298e613621565b90600052602060002090600202018387815481106129ae576129ae613621565b6000918252602090912082546002909202019081556001918201805492909101805467ffffffffffffffff1981166001600160401b03948516908117835583546001600160801b03600160401b9182900416026001600160c01b031990921617178082559154600160c01b908190049093169092026001600160c01b039091161790558254839080612a4257612a426136c2565b600082815260208120600260001990930192830201818155600101559055612a6c33838688612d27565b6000612a81836001600160801b038816612b1f565b90508181600854612a929190613666565b612a9c9190613692565b600855336000908152600260205260409020548290612abc908390613666565b612ac69190613692565b33600081815260026020526040908190209290925590517fe2d155d9d74decc198a9a9b4f5bddb24ee0842ee745c9ce57e3573b971e50d9d90612b0c9086815260200190565b60405180910390a2505050505050505050565b6000612b2d6012600a6138b2565b612b3783856138be565b612b4191906138d5565b9392505050565b6040516001600160a01b0380851660248301528316604482015260648101829052610b929085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612e4d565b600081612bc26012600a6138b2565b612b3790856138be565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600090815260036020526040812054815b81811015612cb9576001600160a01b038516600090815260036020526040902080546001600160401b038616919083908110612c7557612c75613621565b6000918252602090912060029091020160010154600160c01b90046001600160401b031603612ca7579150610d579050565b80612cb18161364d565b915050612c37565b5060405162461bcd60e51b81526020600482015260126024820152711b1bd8dac8191bd95cdb89dd08195e1a5cdd60721b604482015260640161088b565b6040516001600160a01b038316602482015260448101829052610f0390849063a9059cbb60e01b90606401612b7c565b6006546001600160a01b038516600090815260036020908152604080832081516080810183528881526001600160401b038881168286019081526001600160801b03808a1695840195865297821660608401818152855460018181018855968a529790982093516002909702909301958655519483018054945196518216600160c01b026001600160c01b0397909816600160401b026001600160c01b031990951695909116949094179290921793909316939093179055612dea9082906136d8565b6006805467ffffffffffffffff19166001600160401b03929092169190911790555050505050565b6000612e206012600a6138b2565b612e2a83856138e9565b612b419190613914565b600081612e436012600a6138b2565b612e2a90856138e9565b6000612ea2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f1f9092919063ffffffff16565b805190915015610f035780806020019051810190612ec0919061392e565b610f035760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161088b565b6060612f2e8484600085612f36565b949350505050565b606082471015612f975760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161088b565b600080866001600160a01b03168587604051612fb3919061396f565b60006040518083038185875af1925050503d8060008114612ff0576040519150601f19603f3d011682016040523d82523d6000602084013e612ff5565b606091505b509150915061300687838387613011565b979650505050505050565b60608315613080578251600003613079576001600160a01b0385163b6130795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161088b565b5081612f2e565b612f2e83838151156130955781518083602001fd5b8060405162461bcd60e51b815260040161088b919061398b565b508054600082556002029060005260206000209081019061260b91905b808211156130e657600080825560018201556002016130cc565b5090565b6001600160a01b038116811461260b57600080fd5b60006020828403121561311157600080fd5b8135612b41816130ea565b602080825282518282018190526000919060409081850190868401855b8281101561318857815180518552868101516001600160401b0390811688870152868201516001600160801b031687870152606091820151169085015260809093019290850190600101613139565b5091979650505050505050565b600080604083850312156131a857600080fd5b8235915060208301356001600160401b038111156131c557600080fd5b8301604081860312156131d757600080fd5b809150509250929050565b60008083601f8401126131f457600080fd5b5081356001600160401b0381111561320b57600080fd5b6020830191508360208260051b850101111561322657600080fd5b9250929050565b80356001600160401b038116811461324457600080fd5b919050565b60008060006040848603121561325e57600080fd5b83356001600160401b0381111561327457600080fd5b613280868287016131e2565b909450925061329390506020850161322d565b90509250925092565b600080604083850312156132af57600080fd5b823591506132bf6020840161322d565b90509250929050565b600080604083850312156132db57600080fd5b50508035926020909101359150565b801515811461260b57600080fd5b60008060006060848603121561330d57600080fd5b8335925061331d6020850161322d565b9150604084013561332d816132ea565b809150509250925092565b6000806040838503121561334b57600080fd5b6133548361322d565b91506132bf6020840161322d565b60008060006040848603121561337757600080fd5b8335613382816130ea565b925060208401356001600160401b0381111561339d57600080fd5b6133a9868287016131e2565b9497909650939450505050565b6000602082840312156133c857600080fd5b612b418261322d565b600080604083850312156133e457600080fd5b8235613354816130ea565b6000806000806080858703121561340557600080fd5b843593506134156020860161322d565b92506040850135613425816132ea565b91506060850135613435816130ea565b939692955090935050565b6000806040838503121561345357600080fd5b823561345e816130ea565b946020939093013593505050565b60006020828403121561347e57600080fd5b81356001600160801b0381168114612b4157600080fd5b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156134cd576134cd613495565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134fb576134fb613495565b604052919050565b60006040823603121561351557600080fd5b61351d6134ab565b823561ffff8116811461352f57600080fd5b81526020838101356001600160401b038082111561354c57600080fd5b9085019036601f83011261355f57600080fd5b81358181111561357157613571613495565b8060051b91506135828483016134d3565b818152918301840191848101903684111561359c57600080fd5b938501935b838510156135ba578435825293850193908501906135a1565b94860194909452509295945050505050565b60208082526010908201526f1b1bd8dad95c881cdd5cdc195b99195960821b604082015260600190565b6020808252601190820152701b1bd8dac81d1a5b59481a5b9d985b1a59607a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161365f5761365f613637565b5060010190565b80820180821115610d5757610d57613637565b60006020828403121561368b57600080fd5b5051919050565b81810381811115610d5757610d57613637565b6000602082840312156136b757600080fd5b8151612b41816130ea565b634e487b7160e01b600052603160045260246000fd5b6001600160401b038181168382160190808211156136f8576136f8613637565b5092915050565b6020808252601e908201527f63616e6e6f74206d6f76652074686520756e6c6f636b2074696d652075700000604082015260600190565b6001600160801b038181168382160190808211156136f8576136f8613637565b6001600160801b038281168282160390808211156136f8576136f8613637565b634e487b7160e01b600052601260045260246000fd5b600061ffff808416806137a1576137a1613776565b92169190910692915050565b600061ffff808416806137c2576137c2613776565b92169190910492915050565b600181815b808511156138095781600019048211156137ef576137ef613637565b808516156137fc57918102915b93841c93908002906137d3565b509250929050565b60008261382057506001610d57565b8161382d57506000610d57565b8160018114613843576002811461384d57613869565b6001915050610d57565b60ff84111561385e5761385e613637565b50506001821b610d57565b5060208310610133831016604e8410600b841016171561388c575081810a610d57565b61389683836137ce565b80600019048211156138aa576138aa613637565b029392505050565b6000612b418383613811565b8082028115828204841417610d5757610d57613637565b6000826138e4576138e4613776565b500490565b6001600160801b0381811683821602808216919082811461390c5761390c613637565b505092915050565b60006001600160801b03808416806137c2576137c2613776565b60006020828403121561394057600080fd5b8151612b41816132ea565b60005b8381101561396657818101518382015260200161394e565b50506000910152565b6000825161398181846020870161394b565b9190910192915050565b60208152600082518060208401526139aa81604085016020870161394b565b601f01601f1916919091016040019291505056fea26469706673582212209da3b742dc4887a2cb62925f8826e21b57f7f747c6bcfd4ef674ef2fecbd3f6b64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000013a3da6591d3427f164862793ab4e388f9b587e0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a7
-----Decoded View---------------
Arg [0] : _controller (address): 0x013A3Da6591d3427F164862793ab4e388F9B587e
Arg [1] : _cncToken (address): 0x9aE380F0272E2162340a5bB646c354271c0F5cFC
Arg [2] : _treasury (address): 0xB27DC5f8286f063F11491c8f349053cB37718bea
Arg [3] : _crv (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [4] : _cvx (address): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B
Arg [5] : _merkleRoot (bytes32): 0x1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a7
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000013a3da6591d3427f164862793ab4e388f9b587e
Arg [1] : 0000000000000000000000009ae380f0272e2162340a5bb646c354271c0f5cfc
Arg [2] : 000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea
Arg [3] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [4] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [5] : 1fb27a93b1597fb63a71400761fa335d34875bc82ed5d1e2182cbb0a966049a7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.158281 | 374.6563 | $59.3 |
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.