Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x9bbd276f7bbdd01dd6289456b5feda13e8a5f4c066b348cd27467d3b62fec8a3 | 31821072 | 394 days 3 hrs ago | Tarot: Deployer | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
BoostMaxxer
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; interface IERC721Receiver { function onERC721Received( address operator, address from, uint tokenId, bytes calldata data ) external returns (bytes4); } interface IVoter { function _ve() external view returns (address); function gauges(address) external view returns (address); function bribes(address) external view returns (address); function length() external view returns(uint256); function pools(uint) external view returns (address); function vote(uint tokenId, address[] calldata _poolVote, int256[] calldata _weights) external; function reset(uint _tokenId) external; function whitelist(address _token, uint _tokenId) external; function createGauge(address _pool) external returns (address); } interface IVeToken { function token() external view returns (address); function ownerOf(uint) external view returns (address); function create_lock(uint _value, uint _lock_duration) external returns (uint); function withdraw(uint _tokenId) external; function increase_amount(uint _tokenId, uint _value) external; function increase_unlock_time(uint _tokenId, uint _lock_duration) external; function merge(uint _from, uint _to) external; function locked(uint) external view returns (uint256, uint256); function safeTransferFrom(address from, address to, uint tokenId) external; } interface IGauge { function bribe() external view returns (address); function isReward(address) external view returns (bool); function getReward(address account, address[] memory tokens) external; function earned(address token, address account) external view returns (uint); function stake() external view returns (address); function deposit(uint amount, uint tokenId) external; function withdraw(uint amount) external; function withdrawToken(uint amount, uint tokenId) external; function tokenIds(address owner) external view returns (uint256 tokenId); } interface IBribe { function isReward(address) external view returns (bool); function getReward(uint tokenId, address[] memory tokens) external; function earned(address token, uint tokenId) external view returns (uint); } // Tarot BoostMaxxer contract BoostMaxxer is Ownable, ReentrancyGuard, IERC721Receiver { using SafeERC20 for IERC20; // Info of each pool. struct PoolInfo { address gauge; // Gauge address address bribe; // Bribe address uint256 totalDepositedAmount; // # of deposit tokens in this pool uint256 lastRewardTime; // Last block time that reward distribution occurred. } // Info of each pool. mapping (address => PoolInfo) public getPoolInfo; // Info of each user that stakes tokens: lp -> user -> depositedAmount mapping (address => mapping (address => uint256)) public userDepositedAmountInfo; // Info of each reward token for a pool: lp -> accRewardPerShare mapping (address => uint256) public accRewardPerShareInfo; // lp -> user -> rewardDebt mapping (address => mapping (address => uint256)) public rewardDebtInfo; // feeBalance uint256 public feeBalance; uint256 public constant MAX_BPS = 10_000; uint256 public constant MIN_FEE_BPS = 0; uint256 public constant MAX_FEE_BPS = MAX_BPS / 2; uint256 public constant GRACE_PERIOD = 14 days; uint256 public constant MIN_DELAY = 2 days; uint256 public constant MAX_DELAY = 30 days; IVoter public voter; IVeToken public veToken; uint256 public veTokenId; IERC20 public immutable baseToken; address public feeTo; address public manager; address public admin; address public pendingAdmin; uint256 public pendingAdminNotBefore; uint256 public feeBps = (MAX_BPS * 15) / 100; // 15% event EmergencyWithdraw(address indexed user, address indexed _poolToken, uint256 amount); event UpdatePendingAdmin(address indexed admin, uint256 notBefore); event UpdateAdmin(address indexed admin); event UpdateFeeBps(uint256 _newFeeBps); event Deposit(address indexed user, address indexed poolToken, uint256 amount); event Withdraw(address indexed user, address indexed poolToken, uint256 amount, uint256 rewardAmount); event CreateLock(address indexed user, uint256 veTokenId, uint256 amount, uint256 unlockTime); event Release(address indexed user, uint256 veTokenId, uint256 amount, uint256 balanceAfter); event IncreaseTime(address indexed user, uint256 veTokenId, uint256 unlockTime); constructor(address _voter) { voter = IVoter(_voter); veToken = IVeToken(voter._ve()); baseToken = IERC20(veToken.token()); } function removeAdmin() external onlyOwner { admin = address(0); delete pendingAdmin; delete pendingAdminNotBefore; emit UpdateAdmin(admin); } function updatePendingAdmin(address _newPendingAdmin, uint256 _notBefore) external onlyOwner nonReentrant { if (_newPendingAdmin == address(0)) { require(_notBefore == 0, "BoostMaxxer: NOT_BEFORE"); } else { require(_newPendingAdmin != admin, "BoostMaxxer: SAME_ADMIN"); require(_notBefore >= block.timestamp + MIN_DELAY, "BoostMaxxer: TOO_SOON"); require(_notBefore < block.timestamp + MAX_DELAY, "BoostMaxxer: TOO_LATE"); } pendingAdmin = _newPendingAdmin; pendingAdminNotBefore = _notBefore; emit UpdatePendingAdmin(_newPendingAdmin, _notBefore); } function updateAdmin() external onlyOwner nonReentrant { require(pendingAdmin != address(0), "BoostMaxxer: INVLD_ADMIN"); require(block.timestamp >= pendingAdminNotBefore, "BoostMaxxer: TOO_SOON"); require(block.timestamp < pendingAdminNotBefore + GRACE_PERIOD, "BoostMaxxer: TOO_LATE"); require(pendingAdmin != admin, "BoostMaxxer: SAME_ADMIN"); admin = pendingAdmin; delete pendingAdmin; delete pendingAdminNotBefore; emit UpdateAdmin(admin); } function updateVeTokenId(uint256 _veTokenId) external onlyOwner { require(_veTokenId == 0 || veToken.ownerOf(_veTokenId) == address(this), "BoostMaxxer: INVLD_VE_TOKEN_ID"); veTokenId = _veTokenId; } function updateManager(address _manager) external onlyOwner { manager = _manager; } function updateFeeTo(address _feeTo) external onlyOwner { feeTo = _feeTo; } function updateFeeBps(uint256 _newFeeBps) external onlyOwner { require(_newFeeBps >= MIN_FEE_BPS && _newFeeBps <= MAX_FEE_BPS, "BoostMaxxer: INVLD_FEE"); feeBps = _newFeeBps; emit UpdateFeeBps(_newFeeBps); } // View function to see pending rewards on frontend. function pendingRewards(address _user, address[] calldata _poolTokens) external view returns (uint256[] memory amounts) { amounts = new uint256[](_poolTokens.length); for (uint256 i = 0; i < _poolTokens.length; i++) { amounts[i] = pendingReward(_user, _poolTokens[i]); } return amounts; } // View function to see pending reward on frontend. function pendingReward(address _user, address _poolToken) public view returns (uint256 amount) { PoolInfo memory pool = getPoolInfo[_poolToken]; if (pool.gauge == address(0)) { return 0; } uint256 userDepositedAmount = userDepositedAmountInfo[_poolToken][_user]; uint256 netReward; netReward += IGauge(pool.gauge).earned(address(baseToken), address(this)); uint256 accRewardPerShare = accRewardPerShareInfo[_poolToken]; if (netReward > 0) { uint256 feeAmount = netReward * feeBps / MAX_BPS; uint256 rewardAmount = netReward - feeAmount; accRewardPerShare += rewardAmount * 1e18 / pool.totalDepositedAmount; } amount = (userDepositedAmount * accRewardPerShare / 1e18) - rewardDebtInfo[_poolToken][_user]; } function updatePool(address _poolToken) public { _updatePool(_poolToken); } // Update reward variables of the given pool to be up-to-date. function _updatePool(address _poolToken) internal { PoolInfo storage pool = getPoolInfo[_poolToken]; require(pool.gauge != address(0), "BoostMaxxer: NO_POOL"); if (block.timestamp <= pool.lastRewardTime) { return; } if (pool.totalDepositedAmount == 0) { pool.lastRewardTime = block.timestamp; return; } uint256 balanceBefore = baseToken.balanceOf(address(this)); address[] memory tokens = new address[](1); tokens[0] = address(baseToken); IGauge(pool.gauge).getReward(address(this), tokens); uint256 balanceAfter = baseToken.balanceOf(address(this)); if (balanceAfter > balanceBefore) { uint256 netReward = balanceAfter - balanceBefore; uint256 feeAmount = netReward * feeBps / MAX_BPS; feeBalance += feeAmount; netReward -= feeAmount; accRewardPerShareInfo[_poolToken] += netReward * 1e18 / pool.totalDepositedAmount; } pool.lastRewardTime = block.timestamp; } // Deposit tokens. function deposit(address _poolToken, uint256 _amount) external nonReentrant { require(veTokenId > 0, "BoostMaxxer: INVLD_VE_TOKEN_ID"); require(_amount > 0, "BoostMaxxer: ZERO_AMOUNT"); address gauge = getPoolInfo[_poolToken].gauge; if (gauge == address(0)) { gauge = voter.gauges(_poolToken); if (gauge == address(0)) { gauge = voter.createGauge(_poolToken); } getPoolInfo[_poolToken].gauge = gauge; getPoolInfo[_poolToken].bribe = voter.bribes(gauge); getPoolInfo[_poolToken].lastRewardTime = block.timestamp; } else { _updatePool(_poolToken); } uint256 userDepositedAmount = userDepositedAmountInfo[_poolToken][msg.sender]; uint256 accRewardPerShare = accRewardPerShareInfo[_poolToken]; uint256 amountToSend = (userDepositedAmount * accRewardPerShare / 1e18) - rewardDebtInfo[_poolToken][msg.sender]; if (amountToSend > 0) { safeTransfer(baseToken, msg.sender, amountToSend); } rewardDebtInfo[_poolToken][msg.sender] = (userDepositedAmount + _amount) * accRewardPerShare / 1e18; userDepositedAmountInfo[_poolToken][msg.sender] = userDepositedAmount + _amount; getPoolInfo[_poolToken].totalDepositedAmount += _amount; IERC20(_poolToken).safeTransferFrom(address(msg.sender), address(this), _amount); // Stake in gauge IERC20(_poolToken).safeApprove(address(gauge), 0); IERC20(_poolToken).safeApprove(address(gauge), _amount); IGauge(gauge).deposit(_amount, veTokenId); emit Deposit(msg.sender, _poolToken, _amount); } // Withdraw tokens. function withdraw(address _poolToken, uint256 _amount) external nonReentrant returns (uint256 rewardAmount) { uint256 userDepositedAmount = userDepositedAmountInfo[_poolToken][msg.sender]; require(userDepositedAmount >= _amount, "BoostMaxxer: INVLD_AMOUNT"); if (_amount == 0 && getPoolInfo[_poolToken].gauge == address(0)) { return 0; } require(getPoolInfo[_poolToken].gauge != address(0), "BoostMaxxer: NO_POOL"); _updatePool(_poolToken); uint256 accRewardPerShare = accRewardPerShareInfo[_poolToken]; rewardAmount = (userDepositedAmount * accRewardPerShare / 1e18) - rewardDebtInfo[_poolToken][msg.sender]; if (rewardAmount > 0) { safeTransfer(baseToken, msg.sender, rewardAmount); } rewardDebtInfo[_poolToken][msg.sender] = (userDepositedAmount - _amount) * accRewardPerShare / 1e18; if (_amount > 0) { userDepositedAmountInfo[_poolToken][msg.sender] = userDepositedAmount - _amount; getPoolInfo[_poolToken].totalDepositedAmount -= _amount; // Unstake from gauge IGauge(getPoolInfo[_poolToken].gauge).withdraw(_amount); safeTransfer(IERC20(_poolToken), address(msg.sender), _amount); } emit Withdraw(msg.sender, _poolToken, _amount, rewardAmount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(address _poolToken) external nonReentrant { PoolInfo storage pool = getPoolInfo[_poolToken]; require(pool.gauge != address(0), "BoostMaxxer: NO_POOL"); uint256 withdrawAmount = userDepositedAmountInfo[_poolToken][msg.sender]; pool.totalDepositedAmount -= withdrawAmount; userDepositedAmountInfo[_poolToken][msg.sender] = 0; rewardDebtInfo[_poolToken][msg.sender] = 0; // Unstake from gauge IGauge(pool.gauge).withdraw(withdrawAmount); safeTransfer(IERC20(_poolToken), address(msg.sender), withdrawAmount); emit EmergencyWithdraw(msg.sender, _poolToken, withdrawAmount); } function sendFees(address _poolToken, address[] calldata _gaugeRewards, address[] calldata _bribeRewards) public nonReentrant { require(feeTo != address(0), "BoostMaxxer: INVLD_FEE_TO"); IGauge gauge = IGauge(getPoolInfo[_poolToken].gauge); require(address(gauge) != address(0), "BoostMaxxer: NO_POOL"); _updatePool(_poolToken); if (_gaugeRewards.length > 0) { gauge.getReward(address(this), _gaugeRewards); for (uint256 i = 0; i < _gaugeRewards.length; i++) { IERC20 reward = IERC20(_gaugeRewards[i]); require(address(reward) != address(baseToken), "BoostMaxxer: BASE_TOKEN"); uint256 rewardAmount = reward.balanceOf(address(this)); if (rewardAmount > 0) { safeTransfer(reward, address(feeTo), rewardAmount); } } } if (_bribeRewards.length > 0) { uint256 baseTokenBalanceBefore = baseToken.balanceOf(address(this)); IBribe bribe = IBribe(getPoolInfo[_poolToken].bribe); bribe.getReward(veTokenId, _bribeRewards); for (uint256 i = 0; i < _bribeRewards.length; i++) { IERC20 reward = IERC20(_bribeRewards[i]); if (address(reward) == address(baseToken)) { uint256 baseTokenBalanceAfter = baseToken.balanceOf(address(this)); if (baseTokenBalanceAfter > baseTokenBalanceBefore) { feeBalance += baseTokenBalanceAfter - baseTokenBalanceBefore; } } else { uint256 rewardAmount = reward.balanceOf(address(this)); if (rewardAmount > 0) { safeTransfer(reward, address(feeTo), rewardAmount); } } } } if (feeBalance > 0) { uint256 feeBalanceToSend = feeBalance; feeBalance = 0; safeTransfer(baseToken, address(feeTo), feeBalanceToSend); } } function withdrawBaseToken(uint256 _amount) external onlyOwner nonReentrant { require(feeTo != address(0), "BoostMaxxer: INVLD_FEE_TO"); require(_amount <= feeBalance, "BoostMaxxer: INSUFFICIENT_BALANCE"); feeBalance -= _amount; safeTransfer(baseToken, address(feeTo), _amount); } function createLock(uint256 _amount, uint256 _lock_duration) external onlyOwner nonReentrant { require(veTokenId == 0, "BoostMaxxer: INVLD"); require(_amount > 0, "BoostMaxxer: INVLD_AMOUNT"); baseToken.safeTransferFrom(address(msg.sender), address(this), _amount); baseToken.safeApprove(address(veToken), 0); baseToken.safeApprove(address(veToken), _amount); veTokenId = veToken.create_lock(_amount, _lock_duration); emit CreateLock(msg.sender, veTokenId, _amount, _lock_duration); } function release(uint256 _veTokenId) external onlyOwner nonReentrant { require(_veTokenId > 0 && veTokenId != _veTokenId, "BoostMaxxer: INVLD_VE_TOKEN_ID"); uint256 baseTokenBalanceBefore = baseToken.balanceOf(address(this)); veToken.withdraw(_veTokenId); uint256 baseTokenBalanceAfter = baseToken.balanceOf(address(this)); uint256 releaseAmount = baseTokenBalanceAfter - baseTokenBalanceBefore; feeBalance += releaseAmount; emit Release(msg.sender, _veTokenId, releaseAmount, baseTokenBalanceAfter); } function increaseUnlockTime(uint256 _veTokenId, uint256 _lock_duration) external onlyOwnerOrManager nonReentrant { veToken.increase_unlock_time(_veTokenId, _lock_duration); emit IncreaseTime(msg.sender, _veTokenId, _lock_duration); } function vote(uint256 _veTokenId, address[] calldata _tokenVote, int256[] calldata _weights) external onlyOwnerOrManager { voter.vote(_veTokenId, _tokenVote, _weights); } function resetVote(uint256 _veTokenId) external onlyOwnerOrManager nonReentrant { voter.reset(_veTokenId); } function whitelist(address _token, uint256 _veTokenId) external onlyOwnerOrManager nonReentrant { voter.whitelist(_token, _veTokenId); } function withdrawVeTokenFromGauge(address _poolToken, uint256 _veTokenId) external onlyOwner nonReentrant { _updatePool(_poolToken); IGauge(getPoolInfo[_poolToken].gauge).withdrawToken(0, _veTokenId); } function transferVeToken(address _to, uint256 _veTokenId) external onlyOwner nonReentrant { if (veTokenId == _veTokenId) { veTokenId = 0; } veToken.safeTransferFrom(address(this), _to, _veTokenId); } // Safe erc20 transfer function, just in case if rounding error causes pool to not have enough reward tokens. function safeTransfer(IERC20 token, address _to, uint256 _amount) internal { uint256 bal = token.balanceOf(address(this)); if (_amount > bal) { token.safeTransfer(_to, bal); } else { token.safeTransfer(_to, _amount); } } function onERC721Received( address operator, address from, uint tokenId, bytes calldata data ) external override view returns (bytes4) { operator; from; tokenId; data; require(msg.sender == address(veToken), "BoostMaxxer: NOT_VE"); return bytes4(keccak256("onERC721Received(address,address,uint,bytes)")); } // Admin functions function execute( address to, uint256 value, bytes calldata data ) external onlyAdmin returns (bool, bytes memory) { (bool success, bytes memory result) = to.call{value: value}(data); return (success, result); } modifier onlyOwnerOrManager() { require(msg.sender == owner() || msg.sender == manager, "BoostMaxxer: RESTRICTED"); _; } modifier onlyAdmin() { require(msg.sender == admin, "BoostMaxxer: ONLY_ADMIN"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.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 functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // 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: 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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"CreateLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"_poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"IncreaseTime","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"veTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balanceAfter","type":"uint256"}],"name":"Release","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"UpdateAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newFeeBps","type":"uint256"}],"name":"UpdateFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"notBefore","type":"uint256"}],"name":"UpdatePendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accRewardPerShareInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getPoolInfo","outputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"bribe","type":"address"},{"internalType":"uint256","name":"totalDepositedAmount","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veTokenId","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"increaseUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdminNotBefore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_poolToken","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_poolTokens","type":"address[]"}],"name":"pendingRewards","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"resetVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"rewardDebtInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"},{"internalType":"address[]","name":"_gaugeRewards","type":"address[]"},{"internalType":"address[]","name":"_bribeRewards","type":"address[]"}],"name":"sendFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"transferVeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFeeBps","type":"uint256"}],"name":"updateFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"updateFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"updateManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPendingAdmin","type":"address"},{"internalType":"uint256","name":"_notBefore","type":"uint256"}],"name":"updatePendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"updateVeTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userDepositedAmountInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veToken","outputs":[{"internalType":"contract IVeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_veTokenId","type":"uint256"},{"internalType":"address[]","name":"_tokenVote","type":"address[]"},{"internalType":"int256[]","name":"_weights","type":"int256[]"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"contract IVoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolToken","type":"address"},{"internalType":"uint256","name":"_veTokenId","type":"uint256"}],"name":"withdrawVeTokenFromGauge","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052606462000015612710600f6200023c565b6200002191906200021b565b600f553480156200003157600080fd5b5060405162003fd538038062003fd58339810160408190526200005491620001eb565b6200005f336200019b565b60018055600780546001600160a01b0319166001600160a01b03831690811790915560408051638dd598fb60e01b81529051638dd598fb91600480820192602092909190829003018186803b158015620000b857600080fd5b505afa158015620000cd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000f39190620001eb565b600880546001600160a01b0319166001600160a01b0392909216918217905560408051637e062a3560e11b8152905163fc0c546a91600480820192602092909190829003018186803b1580156200014957600080fd5b505afa1580156200015e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001849190620001eb565b60601b6001600160601b0319166080525062000268565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620001fd578081fd5b81516001600160a01b038116811462000214578182fd5b9392505050565b6000826200023757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156200026357634e487b7160e01b81526011600452602481fd5b500290565b60805160601c613cd7620002fe6000396000818161061a01528181610a3701528181610b0401528181610bfc015281816110fa0152818161146b015281816115ba0152818161170201528181611752015281816118d201528181611de00152818161215001528181612189015281816121c4015281816129f201528181612e3d01528181612ee70152612fae0152613cd76000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80638018f8a311610182578063c55dae63116100e9578063e93900a3116100a2578063f851a4401161007c578063f851a440146106a9578063fcbbfca2146106bc578063fd967f47146106cf578063fecdad60146106d857600080fd5b8063e93900a31461067a578063f2fde38b14610683578063f3fef3a31461069657600080fd5b8063c55dae6314610615578063cbaa1a471461063c578063cdec2f2314610644578063d3b2f59814610657578063d55be8c61461065f578063dbe6768c1461066757600080fd5b80639d507b8b1161013b5780639d507b8b146105b15780639f81aed7146105c4578063b52c05fe146105ce578063b61d27f6146105e1578063b7288b6a14610602578063c1a287e21461060b57600080fd5b80638018f8a31461053f5780638da5cb5b1461055f57806396a1cd271461057057806398fc55d8146105835780639a202d47146105965780639ced7e761461059e57600080fd5b80633ec1608b1161022657806360b71d4e116101df57806360b71d4e146104e25780636cbb4b38146104eb5780636ff1c9bc146104fe578063715018a61461051157806376b010db146105195780637b46c54f1461052c57600080fd5b80633ec1608b146104615780634125ff901461048c57806346c96aac1461049657806347e7ef24146104a9578063481c6a75146104bc57806358aba00f146104cf57600080fd5b8063257deb2711610278578063257deb27146103ca57806326782247146103f55780632fd33ddb1461040857806337bdc99b1461041b5780633b92eb231461042e5780633df8161c1461044157600080fd5b8063017e7e58146102c057806306bfa938146102f05780630cc3b1c81461035f578063150b7a021461037457806315ba1072146103a057806324a9d853146103b3575b600080fd5b600a546102d3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6103346102fe3660046135df565b600260208190526000918252604090912080546001820154928201546003909201546001600160a01b0391821693909116919084565b604080516001600160a01b0395861681529490931660208501529183015260608201526080016102e7565b61037261036d366004613827565b6106eb565b005b61038761038236600461364f565b6107c0565b6040516001600160e01b031990911681526020016102e7565b6103726103ae366004613782565b61083e565b6103bc600f5481565b6040519081526020016102e7565b6103bc6103d8366004613617565b600360209081526000928352604080842090915290825290205481565b600d546102d3906001600160a01b031681565b610372610416366004613827565b610915565b610372610429366004613827565b610a6d565b6008546102d3906001600160a01b031681565b61045461044f3660046136c0565b610cf3565b6040516102e791906139d7565b6103bc61046f366004613617565b600560209081526000928352604080842090915290825290205481565b6103bc62278d0081565b6007546102d3906001600160a01b031681565b6103726104b7366004613782565b610dd2565b600b546102d3906001600160a01b031681565b6103726104dd3660046135df565b6112b4565b6103bc60065481565b6103726104f9366004613713565b611300565b61037261050c3660046135df565b61190e565b610372611a96565b610372610527366004613782565b611acc565b61037261053a3660046135df565b611b6e565b6103bc61054d3660046135df565b60046020526000908152604090205481565b6000546001600160a01b03166102d3565b61037261057e366004613827565b611b7a565b610372610591366004613782565b611c34565b610372611cd4565b6103bc6105ac366004613617565b611d4b565b6103726105bf36600461388c565b611f50565b6103bc6202a30081565b6103726105dc36600461388c565b612060565b6105f46105ef3660046137ad565b6122b6565b6040516102e7929190613a1b565b6103bc600e5481565b6103bc6212750081565b6102d37f000000000000000000000000000000000000000000000000000000000000000081565b6103bc600081565b6103726106523660046135df565b612386565b6103726123d2565b6103bc6125d5565b610372610675366004613782565b6125e5565b6103bc60095481565b6103726106913660046135df565b6127ea565b6103bc6106a4366004613782565b612882565b600c546102d3906001600160a01b031681565b6103726106ca366004613827565b612b88565b6103bc61271081565b6103726106e6366004613857565b612c62565b6000546001600160a01b031633148061070e5750600b546001600160a01b031633145b6107335760405162461bcd60e51b815260040161072a90613b1a565b60405180910390fd5b600260015414156107565760405162461bcd60e51b815260040161072a90613ae3565b600260015560075460405163310bd74b60e01b8152600481018390526001600160a01b039091169063310bd74b90602401600060405180830381600087803b1580156107a157600080fd5b505af11580156107b5573d6000803e3d6000fd5b505060018055505050565b6008546000906001600160a01b031633146108135760405162461bcd60e51b8152602060048201526013602482015272426f6f73744d61787865723a204e4f545f564560681b604482015260640161072a565b507f7f7579b984318bcc498f1f3a15446ad7e3d6945324c308204daaa2f366f8277b95945050505050565b6000546001600160a01b031633146108685760405162461bcd60e51b815260040161072a90613a80565b6002600154141561088b5760405162461bcd60e51b815260040161072a90613ae3565b60026001556009548114156108a05760006009555b600854604051632142170760e11b81523060048201526001600160a01b03848116602483015260448201849052909116906342842e0e906064015b600060405180830381600087803b1580156108f557600080fd5b505af1158015610909573d6000803e3d6000fd5b50506001805550505050565b6000546001600160a01b0316331461093f5760405162461bcd60e51b815260040161072a90613a80565b600260015414156109625760405162461bcd60e51b815260040161072a90613ae3565b6002600155600a546001600160a01b03166109bb5760405162461bcd60e51b8152602060048201526019602482015278426f6f73744d61787865723a20494e564c445f4645455f544f60381b604482015260640161072a565b600654811115610a175760405162461bcd60e51b815260206004820152602160248201527f426f6f73744d61787865723a20494e53554646494349454e545f42414c414e436044820152604560f81b606482015260840161072a565b8060066000828254610a299190613c18565b9091555050600a54610a66907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612d12565b5060018055565b6000546001600160a01b03163314610a975760405162461bcd60e51b815260040161072a90613a80565b60026001541415610aba5760405162461bcd60e51b815260040161072a90613ae3565b60026001558015801590610ad057508060095414155b610aec5760405162461bcd60e51b815260040161072a90613a49565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610b4e57600080fd5b505afa158015610b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b86919061383f565b600854604051632e1a7d4d60e01b8152600481018590529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015610bcd57600080fd5b505af1158015610be1573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a082319060240160206040518083038186803b158015610c4757600080fd5b505afa158015610c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7f919061383f565b90506000610c8d8383613c18565b90508060066000828254610ca19190613bc1565b9091555050604080518581526020810183905290810183905233907f6d0f8bf20fdbf0501c403fa7863679b821f006a63b09c689ee2687d00220edf99060600160405180910390a25050600180555050565b60608167ffffffffffffffff811115610d1c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d45578160200160208202803683370190505b50905060005b82811015610dc957610d8c85858584818110610d7757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105ac91906135df565b828281518110610dac57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610dc181613c5b565b915050610d4b565b505b9392505050565b60026001541415610df55760405162461bcd60e51b815260040161072a90613ae3565b6002600155600954610e195760405162461bcd60e51b815260040161072a90613a49565b60008111610e695760405162461bcd60e51b815260206004820152601860248201527f426f6f73744d61787865723a205a45524f5f414d4f554e540000000000000000604482015260640161072a565b6001600160a01b03808316600090815260026020526040902054168061107a5760075460405163b9a09fd560e01b81526001600160a01b0385811660048301529091169063b9a09fd59060240160206040518083038186803b158015610ece57600080fd5b505afa158015610ee2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0691906135fb565b90506001600160a01b038116610f98576007546040516352fa180f60e11b81526001600160a01b0385811660048301529091169063a5f4301e90602401602060405180830381600087803b158015610f5d57600080fd5b505af1158015610f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9591906135fb565b90505b6001600160a01b038381166000908152600260205260409081902080546001600160a01b0319168484169081179091556007549151635462ecad60e11b8152600481019190915291169063a8c5d95a9060240160206040518083038186803b15801561100357600080fd5b505afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b91906135fb565b6001600160a01b0384811660009081526002602052604090206001810180546001600160a01b0319169390921692909217905542600390910155611083565b61108383612dc9565b6001600160a01b038316600081815260036020908152604080832033808552908352818420549484526004835281842054600584528285209185529252822054909190670de0b6b3a76400006110d98486613bf9565b6110e39190613bd9565b6110ed9190613c18565b90508015611120576111207f00000000000000000000000000000000000000000000000000000000000000003383612d12565b670de0b6b3a7640000826111348786613bc1565b61113e9190613bf9565b6111489190613bd9565b6001600160a01b03871660009081526005602090815260408083203384529091529020556111768584613bc1565b6001600160a01b03871660008181526003602090815260408083203384528252808320949094559181526002918290529182200180548792906111ba908490613bc1565b909155506111d590506001600160a01b0387163330886130ee565b6111ea6001600160a01b038716856000613159565b6111fe6001600160a01b0387168587613159565b600954604051631c57762b60e31b81526001600160a01b0386169163e2bbb15891611236918991600401918252602082015260400190565b600060405180830381600087803b15801561125057600080fd5b505af1158015611264573d6000803e3d6000fd5b50506040518781526001600160a01b03891692503391507f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f629060200160405180910390a350506001805550505050565b6000546001600160a01b031633146112de5760405162461bcd60e51b815260040161072a90613a80565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600260015414156113235760405162461bcd60e51b815260040161072a90613ae3565b6002600155600a546001600160a01b031661137c5760405162461bcd60e51b8152602060048201526019602482015278426f6f73744d61787865723a20494e564c445f4645455f544f60381b604482015260640161072a565b6001600160a01b0380861660009081526002602052604090205416806113b45760405162461bcd60e51b815260040161072a90613ab5565b6113bd86612dc9565b831561159c576040516331279d3d60e01b81526001600160a01b038216906331279d3d906113f39030908990899060040161394d565b600060405180830381600087803b15801561140d57600080fd5b505af1158015611421573d6000803e3d6000fd5b5050505060005b8481101561159a57600086868381811061145257634e487b7160e01b600052603260045260246000fd5b905060200201602081019061146791906135df565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614156114eb5760405162461bcd60e51b815260206004820152601760248201527f426f6f73744d61787865723a20424153455f544f4b454e000000000000000000604482015260640161072a565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561152d57600080fd5b505afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611565919061383f565b9050801561158557600a546115859083906001600160a01b031683612d12565b5050808061159290613c5b565b915050611428565b505b81156118b8576040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561160457600080fd5b505afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c919061383f565b6001600160a01b038089166000908152600260205260409081902060010154600954915163f5f8d36560e01b815293945090911691829163f5f8d3659161168a919089908990600401613b51565b600060405180830381600087803b1580156116a457600080fd5b505af11580156116b8573d6000803e3d6000fd5b5050505060005b848110156118b45760008686838181106116e957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906116fe91906135df565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415611805576040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561179c57600080fd5b505afa1580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d4919061383f565b9050848111156117ff576117e88582613c18565b600660008282546117f99190613bc1565b90915550505b506118a1565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561184757600080fd5b505afa15801561185b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187f919061383f565b9050801561189f57600a5461189f9083906001600160a01b031683612d12565b505b50806118ac81613c5b565b9150506116bf565b5050505b6006541561090957600680546000909155600a54611901907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612d12565b5050506001805550505050565b600260015414156119315760405162461bcd60e51b815260040161072a90613ae3565b600260018190556001600160a01b038083166000908152602092909252604090912080549091166119745760405162461bcd60e51b815260040161072a90613ab5565b6001600160a01b0382166000908152600360209081526040808320338452909152812054600283018054919283926119ad908490613c18565b90915550506001600160a01b03838116600081815260036020908152604080832033808552908352818420849055938352600582528083209383529290528181205583549051632e1a7d4d60e01b815260048101849052911690632e1a7d4d90602401600060405180830381600087803b158015611a2a57600080fd5b505af1158015611a3e573d6000803e3d6000fd5b50505050611a4d833383612d12565b6040518181526001600160a01b0384169033907ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f38833285049060200160405180910390a350506001805550565b6000546001600160a01b03163314611ac05760405162461bcd60e51b815260040161072a90613a80565b611aca6000613282565b565b6000546001600160a01b03163314611af65760405162461bcd60e51b815260040161072a90613a80565b60026001541415611b195760405162461bcd60e51b815260040161072a90613ae3565b6002600155611b2782612dc9565b6001600160a01b0380831660009081526002602052604080822054905163fdb483c760e01b815292169163fdb483c7916108db918590600401918252602082015260400190565b611b7781612dc9565b50565b6000546001600160a01b03163314611ba45760405162461bcd60e51b815260040161072a90613a80565b611bb16002612710613bd9565b811115611bf95760405162461bcd60e51b8152602060048201526016602482015275426f6f73744d61787865723a20494e564c445f46454560501b604482015260640161072a565b600f8190556040518181527f464285156ea7288194429c32afd38e4980047fef24f2f2c851d9749260435b6f9060200160405180910390a150565b6000546001600160a01b0316331480611c575750600b546001600160a01b031633145b611c735760405162461bcd60e51b815260040161072a90613b1a565b60026001541415611c965760405162461bcd60e51b815260040161072a90613ae3565b600260015560075460405163131f8abb60e31b81526001600160a01b03848116600483015260248201849052909116906398fc55d8906044016108db565b6000546001600160a01b03163314611cfe5760405162461bcd60e51b815260040161072a90613a80565b600c80546001600160a01b0319908116909155600d805490911690556000600e8190556040517fbfc8d7754fec5096becc28e0816011e8d0adcfe752ffa1c88924a7f88b00a41d908290a2565b6001600160a01b038082166000908152600260208181526040808420815160808101835281548716808252600183015490971693810193909352928301549082015260039091015460608201529091611da8576000915050611f4a565b6001600160a01b0383811660009081526003602090815260408083208885168452909152808220548451915163211dc32d60e01b81527f0000000000000000000000000000000000000000000000000000000000000000851660048201523060248201529093919091169063211dc32d9060440160206040518083038186803b158015611e3457600080fd5b505afa158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6c919061383f565b611e769082613bc1565b6001600160a01b0386166000908152600460205260409020549091508115611ef6576000612710600f5484611eab9190613bf9565b611eb59190613bd9565b90506000611ec38285613c18565b6040870151909150611edd82670de0b6b3a7640000613bf9565b611ee79190613bd9565b611ef19084613bc1565b925050505b6001600160a01b038087166000908152600560209081526040808320938b1683529290522054670de0b6b3a7640000611f2f8386613bf9565b611f399190613bd9565b611f439190613c18565b9450505050505b92915050565b6000546001600160a01b0316331480611f735750600b546001600160a01b031633145b611f8f5760405162461bcd60e51b815260040161072a90613b1a565b60026001541415611fb25760405162461bcd60e51b815260040161072a90613ae3565b600260015560085460405163a4d855df60e01b815260048101849052602481018390526001600160a01b039091169063a4d855df90604401600060405180830381600087803b15801561200457600080fd5b505af1158015612018573d6000803e3d6000fd5b505060408051858152602081018590523393507f15a2a2f6ef7fd65a99aa82fc65e795a69026b12c7e31bcdc052f8d776ed722019250015b60405180910390a2505060018055565b6000546001600160a01b0316331461208a5760405162461bcd60e51b815260040161072a90613a80565b600260015414156120ad5760405162461bcd60e51b815260040161072a90613ae3565b6002600155600954156120f75760405162461bcd60e51b8152602060048201526012602482015271109bdbdcdd13585e1e195c8e88125395931160721b604482015260640161072a565b600082116121435760405162461bcd60e51b8152602060048201526019602482015278109bdbdcdd13585e1e195c8e88125395931117d05353d55395603a1b604482015260640161072a565b6121786001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330856130ee565b6008546121b3906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691166000613159565b6008546121ed906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911684613159565b6008546040516365fc387360e01b815260048101849052602481018390526001600160a01b03909116906365fc387390604401602060405180830381600087803b15801561223a57600080fd5b505af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061383f565b60098190556040805191825260208201849052810182905233907f133e6f671a17d15981c6269ce9d49d721e64d359ebfd0787e56bbe73c15ba01490606001612050565b600c546000906060906001600160a01b031633146123165760405162461bcd60e51b815260206004820152601760248201527f426f6f73744d61787865723a204f4e4c595f41444d494e000000000000000000604482015260640161072a565b600080876001600160a01b0316878787604051612334929190613921565b60006040518083038185875af1925050503d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b5090999098509650505050505050565b6000546001600160a01b031633146123b05760405162461bcd60e51b815260040161072a90613a80565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146123fc5760405162461bcd60e51b815260040161072a90613a80565b6002600154141561241f5760405162461bcd60e51b815260040161072a90613ae3565b6002600155600d546001600160a01b031661247c5760405162461bcd60e51b815260206004820152601860248201527f426f6f73744d61787865723a20494e564c445f41444d494e0000000000000000604482015260640161072a565b600e544210156124c65760405162461bcd60e51b81526020600482015260156024820152742137b7b9ba26b0bc3c32b91d102a27a7afa9a7a7a760591b604482015260640161072a565b62127500600e546124d79190613bc1565b421061251d5760405162461bcd60e51b8152602060048201526015602482015274426f6f73744d61787865723a20544f4f5f4c41544560581b604482015260640161072a565b600c54600d546001600160a01b03908116911614156125785760405162461bcd60e51b81526020600482015260176024820152762137b7b9ba26b0bc3c32b91d1029a0a6a2afa0a226a4a760491b604482015260640161072a565b600d8054600c80546001600160a01b0383166001600160a01b031991821681179092559091169091556000600e8190556040517fbfc8d7754fec5096becc28e0816011e8d0adcfe752ffa1c88924a7f88b00a41d9190a260018055565b6125e26002612710613bd9565b81565b6000546001600160a01b0316331461260f5760405162461bcd60e51b815260040161072a90613a80565b600260015414156126325760405162461bcd60e51b815260040161072a90613ae3565b60026001556001600160a01b0382166126985780156126935760405162461bcd60e51b815260206004820152601760248201527f426f6f73744d61787865723a204e4f545f4245464f5245000000000000000000604482015260640161072a565b612797565b600c546001600160a01b03838116911614156126f05760405162461bcd60e51b81526020600482015260176024820152762137b7b9ba26b0bc3c32b91d1029a0a6a2afa0a226a4a760491b604482015260640161072a565b6126fd6202a30042613bc1565b8110156127445760405162461bcd60e51b81526020600482015260156024820152742137b7b9ba26b0bc3c32b91d102a27a7afa9a7a7a760591b604482015260640161072a565b61275162278d0042613bc1565b81106127975760405162461bcd60e51b8152602060048201526015602482015274426f6f73744d61787865723a20544f4f5f4c41544560581b604482015260640161072a565b600d80546001600160a01b0319166001600160a01b038416908117909155600e8290556040518281527f37e965718536a11d3393b25632e56ee66f49858100d869b8eb44219d8c42fa5190602001612050565b6000546001600160a01b031633146128145760405162461bcd60e51b815260040161072a90613a80565b6001600160a01b0381166128795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161072a565b611b7781613282565b6000600260015414156128a75760405162461bcd60e51b815260040161072a90613ae3565b60026001556001600160a01b03831660009081526003602090815260408083203384529091529020548281101561291c5760405162461bcd60e51b8152602060048201526019602482015278109bdbdcdd13585e1e195c8e88125395931117d05353d55395603a1b604482015260640161072a565b8215801561294257506001600160a01b0384811660009081526002602052604090205416155b15612951576000915050612b7e565b6001600160a01b03848116600090815260026020526040902054166129885760405162461bcd60e51b815260040161072a90613ab5565b61299184612dc9565b6001600160a01b0384166000908152600460209081526040808320546005835281842033855290925290912054670de0b6b3a76400006129d18385613bf9565b6129db9190613bd9565b6129e59190613c18565b92508215612a1857612a187f00000000000000000000000000000000000000000000000000000000000000003385612d12565b670de0b6b3a764000081612a2c8685613c18565b612a369190613bf9565b612a409190613bd9565b6001600160a01b03861660009081526005602090815260408083203384529091529020558315612b3557612a748483613c18565b6001600160a01b0386166000818152600360209081526040808320338452825280832094909455918152600291829052918220018054869290612ab8908490613c18565b90915550506001600160a01b0385811660009081526002602052604090819020549051632e1a7d4d60e01b815260048101879052911690632e1a7d4d90602401600060405180830381600087803b158015612b1257600080fd5b505af1158015612b26573d6000803e3d6000fd5b50505050612b35853386612d12565b60408051858152602081018590526001600160a01b0387169133917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567910160405180910390a350505b6001805592915050565b6000546001600160a01b03163314612bb25760405162461bcd60e51b815260040161072a90613a80565b801580612c4157506008546040516331a9108f60e11b81526004810183905230916001600160a01b031690636352211e9060240160206040518083038186803b158015612bfe57600080fd5b505afa158015612c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c3691906135fb565b6001600160a01b0316145b612c5d5760405162461bcd60e51b815260040161072a90613a49565b600955565b6000546001600160a01b0316331480612c855750600b546001600160a01b031633145b612ca15760405162461bcd60e51b815260040161072a90613b1a565b6007546040516307f66d6b60e51b81526001600160a01b039091169063fecdad6090612cd99088908890889088908890600401613b6b565b600060405180830381600087803b158015612cf357600080fd5b505af1158015612d07573d6000803e3d6000fd5b505050505050505050565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b158015612d5457600080fd5b505afa158015612d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8c919061383f565b905080821115612daf57612daa6001600160a01b03851684836132d2565b612dc3565b612dc36001600160a01b03851684846132d2565b50505050565b6001600160a01b0380821660009081526002602052604090208054909116612e035760405162461bcd60e51b815260040161072a90613ab5565b80600301544211612e12575050565b6002810154612e25574260039091015550565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015612e8757600080fd5b505afa158015612e9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ebf919061383f565b60408051600180825281830190925291925060009190602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110612f2757634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015283546040516331279d3d60e01b81529116906331279d3d90612f65903090859060040161397b565b600060405180830381600087803b158015612f7f57600080fd5b505af1158015612f93573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a082319060240160206040518083038186803b158015612ff957600080fd5b505afa15801561300d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613031919061383f565b9050828111156130de5760006130478483613c18565b90506000612710600f548361305c9190613bf9565b6130669190613bd9565b9050806006600082825461307a9190613bc1565b9091555061308a90508183613c18565b60028701549092506130a483670de0b6b3a7640000613bf9565b6130ae9190613bd9565b6001600160a01b038816600090815260046020526040812080549091906130d6908490613bc1565b909155505050505b4284600301819055505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612dc39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613302565b8015806131e25750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156131a857600080fd5b505afa1580156131bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e0919061383f565b155b61324d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161072a565b6040516001600160a01b03831660248201526044810182905261327d90849063095ea7b360e01b90606401613122565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261327d90849063a9059cbb60e01b90606401613122565b6000613357826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166133d49092919063ffffffff16565b80519091501561327d57808060200190518101906133759190613807565b61327d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161072a565b60606133e384846000856133eb565b949350505050565b60608247101561344c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161072a565b6001600160a01b0385163b6134a35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161072a565b600080866001600160a01b031685876040516134bf9190613931565b60006040518083038185875af1925050503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915061351182828661351c565b979650505050505050565b6060831561352b575081610dcb565b82511561353b5782518084602001fd5b8160405162461bcd60e51b815260040161072a9190613a36565b60008083601f840112613566578182fd5b50813567ffffffffffffffff81111561357d578182fd5b6020830191508360208260051b850101111561359857600080fd5b9250929050565b60008083601f8401126135b0578182fd5b50813567ffffffffffffffff8111156135c7578182fd5b60208301915083602082850101111561359857600080fd5b6000602082840312156135f0578081fd5b8135610dcb81613c8c565b60006020828403121561360c578081fd5b8151610dcb81613c8c565b60008060408385031215613629578081fd5b823561363481613c8c565b9150602083013561364481613c8c565b809150509250929050565b600080600080600060808688031215613666578081fd5b853561367181613c8c565b9450602086013561368181613c8c565b935060408601359250606086013567ffffffffffffffff8111156136a3578182fd5b6136af8882890161359f565b969995985093965092949392505050565b6000806000604084860312156136d4578283fd5b83356136df81613c8c565b9250602084013567ffffffffffffffff8111156136fa578283fd5b61370686828701613555565b9497909650939450505050565b60008060008060006060868803121561372a578081fd5b853561373581613c8c565b9450602086013567ffffffffffffffff80821115613751578283fd5b61375d89838a01613555565b90965094506040880135915080821115613775578283fd5b506136af88828901613555565b60008060408385031215613794578182fd5b823561379f81613c8c565b946020939093013593505050565b600080600080606085870312156137c2578384fd5b84356137cd81613c8c565b935060208501359250604085013567ffffffffffffffff8111156137ef578283fd5b6137fb8782880161359f565b95989497509550505050565b600060208284031215613818578081fd5b81518015158114610dcb578182fd5b600060208284031215613838578081fd5b5035919050565b600060208284031215613850578081fd5b5051919050565b60008060008060006060868803121561386e578081fd5b85359450602086013567ffffffffffffffff80821115613751578283fd5b6000806040838503121561389e578182fd5b50508035926020909101359150565b81835260006020808501945082825b858110156138ea5781356138cf81613c8c565b6001600160a01b0316875295820195908201906001016138bc565b509495945050505050565b6000815180845261390d816020860160208601613c2f565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251613943818460208701613c2f565b9190910192915050565b6001600160a01b038416815260406020820181905260009061397290830184866138ad565b95945050505050565b6001600160a01b038381168252604060208084018290528451918401829052600092858201929091906060860190855b818110156139c95785518516835294830194918301916001016139ab565b509098975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613a0f578351835292840192918401916001016139f3565b50909695505050505050565b82151581526040602082015260006133e360408301846138f5565b602081526000610dcb60208301846138f5565b6020808252601e908201527f426f6f73744d61787865723a20494e564c445f56455f544f4b454e5f49440000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273109bdbdcdd13585e1e195c8e881393d7d413d3d360621b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526017908201527f426f6f73744d61787865723a2052455354524943544544000000000000000000604082015260600190565b8381526040602082015260006139726040830184866138ad565b85815260006020606081840152613b866060840187896138ad565b838103604085015284815285908201835b86811015613bb357823582529183019190830190600101613b97565b509998505050505050505050565b60008219821115613bd457613bd4613c76565b500190565b600082613bf457634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613c1357613c13613c76565b500290565b600082821015613c2a57613c2a613c76565b500390565b60005b83811015613c4a578181015183820152602001613c32565b83811115612dc35750506000910152565b6000600019821415613c6f57613c6f613c76565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611b7757600080fdfea264697066735822122096478394570cd92c81d46aa95783b3c257c721b026acebf09d6ac9865b0de5f864736f6c63430008040033000000000000000000000000dc819f5d05a6859d2facbb4a44e5ab105762dbae
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dc819f5d05a6859d2facbb4a44e5ab105762dbae
-----Decoded View---------------
Arg [0] : _voter (address): 0xdc819f5d05a6859d2facbb4a44e5ab105762dbae
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000dc819f5d05a6859d2facbb4a44e5ab105762dbae
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.