编译器
0.6.12+commit.27d51765
文件 1 的 6:Address.sol
pragma solidity >=0.6.2 <0.8.0;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
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);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
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);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 6:Booster.sol
pragma solidity 0.6.12;
import "./interfaces/Interfaces.sol";
import "@openzeppelin/contracts-0.6/math/SafeMath.sol";
import "@openzeppelin/contracts-0.6/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts-0.6/utils/Address.sol";
import "@openzeppelin/contracts-0.6/token/ERC20/SafeERC20.sol";
contract Booster{
using SafeERC20 for IERC20;
using Address for address;
using SafeMath for uint256;
uint256 public constant MAX_PENALTY_SHARE = 3000;
uint256 public constant DENOMINATOR = 10000;
address public immutable crv;
address public immutable cvx;
address public immutable weth;
address public immutable voterProxy;
address public owner;
address public feeManager;
address public poolManager;
address public rewardFactory;
address public tokenFactory;
address public earmarkDelegate;
address public crvLockRewards;
address public cvxLocker;
address public reservoirMinter;
address public mintManager;
mapping(address => bool) public voteDelegate;
IExtraRewardsDistributor public extraRewardsDist;
uint256 public penaltyShare = 0;
mapping(uint256 => uint256) public customPenaltyShare;
bool public earmarkOnDeposit;
uint256 public minMintRatio;
uint256 public maxMintRatio;
uint256 public mintRatio;
bool public paused;
mapping(uint256 => uint256) public customMintRatio;
bool public isShutdown;
struct PoolInfo {
address lptoken;
address token;
address gauge;
address crvRewards;
bool shutdown;
}
PoolInfo[] public poolInfo;
mapping(address => bool) public votingMap;
mapping(address => address[]) public lpPendingRewardTokens;
mapping(address => mapping(address => uint256)) public lpPendingRewards;
event Deposited(address indexed user, uint256 indexed poolid, uint256 amount);
event Withdrawn(address indexed user, uint256 indexed poolid, uint256 amount);
event PoolAdded(address indexed lpToken, address gauge, address token, address crvRewards, uint256 pid);
event PoolShutdown(uint256 indexed poolId);
event RewardMigrate(address indexed crvRewards, address indexed newBooster, uint256 indexed poolId);
event OwnerUpdated(address newOwner);
event FeeManagerUpdated(address newFeeManager);
event PoolManagerUpdated(address newPoolManager);
event FactoriesUpdated(address rewardFactory, address tokenFactory);
event ExtraRewardsDistributorUpdated(address newDist);
event LpPendingRewardTokensUpdated(address indexed lpToken, address[] pendingRewardTokens);
event PenaltyShareUpdated(uint256 newPenalty);
event VoteDelegateUpdated(address voteDelegate, bool enabled);
event EarmarkDelegateUpdated(address newEarmarkDelegate);
event VotingMapUpdated(address voting, bool valid);
event LockRewardContractsUpdated(address lockRewards, address cvxLocker);
event MintParamsUpdated(uint256 mintRatio, address reservoirMinter, address mintManager);
event SetPaused(bool paused);
event CustomMintRatioUpdated(uint256 indexed pid, uint256 mintRatio);
event CustomPenaltyShareUpdated(uint256 indexed pid, uint256 penaltyShare);
event SetEarmarkOnDeposit(bool earmarkOnDeposit);
event FeeInfoUpdated(address feeDistro, address lockFees, address feeToken);
event FeeInfoChanged(address feeToken, bool active);
event EarmarkRewards(uint256 indexed pid, address indexed lpToken, address indexed rewardToken, uint256 amount);
event EarmarkRewardsTransfer(uint256 indexed pid, address indexed lpToken, address indexed rewardToken, uint256 amount, address distro, bool queue);
event RewardClaimed(uint256 indexed pid, address indexed user, uint256 amount, bool indexed lock, uint256 mintAmount, uint256 penalty);
event MinterMint(address indexed recipient, uint256 amount);
constructor(
address _voterProxy,
address _reservoirMinter,
address _cvx,
address _crv,
address _weth,
uint256 _minMintRatio,
uint256 _maxMintRatio
) public {
voterProxy = _voterProxy;
reservoirMinter = _reservoirMinter;
cvx = _cvx;
crv = _crv;
weth = _weth;
isShutdown = false;
minMintRatio = _minMintRatio;
maxMintRatio = _maxMintRatio;
owner = msg.sender;
feeManager = msg.sender;
poolManager = msg.sender;
emit OwnerUpdated(msg.sender);
emit FeeManagerUpdated(msg.sender);
emit PoolManagerUpdated(msg.sender);
}
function setOwner(address _owner) external {
require(msg.sender == owner, "!auth");
owner = _owner;
emit OwnerUpdated(_owner);
}
function setFeeManager(address _feeM) external {
require(msg.sender == owner, "!auth");
feeManager = _feeM;
emit FeeManagerUpdated(_feeM);
}
function setPoolManager(address _poolM) external {
require(msg.sender == poolManager || msg.sender == owner, "!auth");
poolManager = _poolM;
emit PoolManagerUpdated(_poolM);
}
function setFactories(address _rfactory, address _tfactory) external {
require(msg.sender == owner, "!auth");
require(rewardFactory == address(0), "!zero");
rewardFactory = _rfactory;
tokenFactory = _tfactory;
emit FactoriesUpdated(_rfactory, _tfactory);
}
function setExtraRewardsDistributor(address _dist) external {
require(msg.sender==owner, "!auth");
extraRewardsDist = IExtraRewardsDistributor(_dist);
IERC20(cvx).safeApprove(_dist, 0);
IERC20(cvx).safeApprove(_dist, type(uint256).max);
emit ExtraRewardsDistributorUpdated(_dist);
}
function setRewardClaimedPenalty(uint256 _penaltyShare) external {
require(msg.sender==owner, "!auth");
require(_penaltyShare <= MAX_PENALTY_SHARE, ">max");
penaltyShare = _penaltyShare;
emit PenaltyShareUpdated(_penaltyShare);
}
function setRewardTokenPausedInPools(address[] memory _rewardPools, address _token, bool _paused) external {
require(msg.sender==owner, "!auth");
for (uint256 i = 0; i < _rewardPools.length; i++) {
IRewards(_rewardPools[i]).setRewardTokenPaused(_token, _paused);
}
}
function setVoteDelegate(address _voteDelegate, bool _enabled) external {
require(msg.sender==owner, "!auth");
voteDelegate[_voteDelegate] = _enabled;
emit VoteDelegateUpdated(_voteDelegate, _enabled);
}
function setVotingValid(address _voting, bool _valid) external {
require(msg.sender == owner || voteDelegate[msg.sender], "!auth");
votingMap[_voting] = _valid;
emit VotingMapUpdated(_voting, _valid);
}
function setEarmarkDelegate(address _earmarkDelegate) external {
require(msg.sender==owner, "!auth");
earmarkDelegate = _earmarkDelegate;
emit EarmarkDelegateUpdated(_earmarkDelegate);
}
function setLpPendingRewardTokens(address _lpToken, address[] memory _addresses) external {
require(msg.sender==owner, "!auth");
lpPendingRewardTokens[_lpToken] = _addresses;
emit LpPendingRewardTokensUpdated(_lpToken, _addresses);
}
function updateLpPendingRewardTokensByGauge(uint256 _pid) external {
require(msg.sender==owner, "!auth");
PoolInfo storage p = poolInfo[_pid];
lpPendingRewardTokens[p.lptoken] = IStaker(voterProxy).getGaugeRewardTokens(p.lptoken, p.gauge);
emit LpPendingRewardTokensUpdated(p.lptoken, lpPendingRewardTokens[p.lptoken]);
}
function setLockRewardContracts(address _crvLockRewards, address _cvxLocker) external {
require(msg.sender == owner, "!auth");
if (crvLockRewards == address(0)){
crvLockRewards = _crvLockRewards;
cvxLocker = _cvxLocker;
IERC20(cvx).approve(cvxLocker, type(uint256).max);
emit LockRewardContractsUpdated(_crvLockRewards, _cvxLocker);
}
}
function setMintParams(uint256 _mintRatio, address _reservoirMinter, address _mintManager) external {
require(msg.sender == owner, "!auth");
if (_mintRatio != 0) {
require(_mintRatio >= minMintRatio && _mintRatio <= maxMintRatio, "!boundaries");
}
mintRatio = _mintRatio;
reservoirMinter = _reservoirMinter;
mintManager = _mintManager;
emit MintParamsUpdated(_mintRatio, _reservoirMinter, _mintManager);
}
function setPaused(bool _paused) external {
require(msg.sender == owner, "!auth");
paused = _paused;
emit SetPaused(_paused);
}
function setCustomMintRatioMultiple(uint256[] memory _pids, uint256[] memory _mintRatios) external {
require(msg.sender == owner, "!auth");
uint256 len = _pids.length;
require(len == _mintRatios.length, "!len");
for(uint256 i = 0; i < len; i++) {
if (_mintRatios[i] != 0) {
require(_mintRatios[i] >= minMintRatio && _mintRatios[i] <= maxMintRatio, "!boundaries");
}
customMintRatio[_pids[i]] = _mintRatios[i];
emit CustomMintRatioUpdated(_pids[i], _mintRatios[i]);
}
}
function setCustomPenaltyShareMultiple(uint256[] memory _pids, uint256[] memory _penaltyShares) external {
require(msg.sender == owner, "!auth");
uint256 len = _pids.length;
require(len == _penaltyShares.length, "!len");
for(uint256 i = 0; i < len; i++) {
customPenaltyShare[_pids[i]] = _penaltyShares[i];
emit CustomPenaltyShareUpdated(_pids[i], _penaltyShares[i]);
}
}
function setEarmarkOnDeposit(bool _earmarkOnDeposit) external{
require(msg.sender == owner, "!auth");
earmarkOnDeposit = _earmarkOnDeposit;
emit SetEarmarkOnDeposit(_earmarkOnDeposit);
}
function addPool(address _lptoken, address _gauge) external returns (uint256) {
uint256 pid = poolInfo.length;
address token = ITokenFactory(tokenFactory).CreateDepositToken(_lptoken);
address newRewardPool = IRewardFactory(rewardFactory).CreateCrvRewards(pid,token,_lptoken);
return addCreatedPool(_lptoken, _gauge, token, newRewardPool);
}
function addCreatedPool(address _lptoken, address _gauge, address _token, address _crvRewards) public returns (uint256){
require(msg.sender == poolManager && !isShutdown, "!add");
require(_gauge != address(0) && _lptoken != address(0),"!param");
uint256 pid = poolInfo.length;
if (IRewards(_crvRewards).pid() != pid) {
IRewards(_crvRewards).updateOperatorData(address(this), pid);
}
IERC20(_token).safeApprove(_crvRewards, 0);
IERC20(_token).safeApprove(_crvRewards, type(uint256).max);
poolInfo.push(
PoolInfo({
lptoken: _lptoken,
token: _token,
gauge: _gauge,
crvRewards: _crvRewards,
shutdown: false
})
);
emit PoolAdded(_lptoken, _gauge, _token, _crvRewards, pid);
return poolInfo.length.sub(1);
}
function shutdownPool(uint256 _pid) external returns(bool) {
require(msg.sender == poolManager, "!auth");
PoolInfo storage pool = poolInfo[_pid];
IStaker(voterProxy).withdrawAllLp(pool.lptoken,pool.gauge);
pool.shutdown = true;
emit PoolShutdown(_pid);
return true;
}
function forceShutdownPool(uint256 _pid) external returns(bool){
require(msg.sender==poolManager, "!auth");
PoolInfo storage pool = poolInfo[_pid];
uint128 amount = getLpBalance(pool.gauge, pool.lptoken);
try IStaker(voterProxy).withdrawLp(pool.lptoken, pool.gauge, amount) {} catch {}
pool.shutdown = true;
emit PoolShutdown(_pid);
return true;
}
function shutdownSystem() external{
require(msg.sender == owner, "!auth");
isShutdown = true;
for(uint i=0; i < poolInfo.length; i++){
PoolInfo storage pool = poolInfo[i];
if (pool.shutdown) continue;
uint128 amount = getLpBalance(pool.gauge, pool.lptoken);
try IStaker(voterProxy).withdrawLp(pool.lptoken, pool.gauge, amount) {
pool.shutdown = true;
}catch{}
}
}
function migrateRewards(address[] calldata _rewards, uint256[] calldata _pids, address _newBooster) external {
require(msg.sender == owner, "!auth");
require(isShutdown, "!shutdown");
uint256 len = _rewards.length;
require(len == _pids.length, "!length");
for (uint256 i = 0; i < len; i++) {
if (_rewards[i] == address(0)) {
continue;
}
IRewards(_rewards[i]).updateOperatorData(_newBooster, _pids[i]);
if (_rewards[i] != crvLockRewards) {
address stakingToken = IRewards(_rewards[i]).stakingToken();
ITokenMinter(stakingToken).updateOperator(_newBooster);
}
emit RewardMigrate(_rewards[i], _newBooster, _pids[i]);
}
}
function deposit(uint256 _pid, uint256 _amount, bool _stake) public returns(bool){
return depositFor(_pid, _amount, _stake, msg.sender);
}
function depositFor(uint256 _pid, uint256 _amount, bool _stake, address _receiver) public returns(bool){
require(!isShutdown,"shutdown");
require(!paused, "paused");
PoolInfo storage pool = poolInfo[_pid];
require(pool.shutdown == false, "closed");
address lptoken = pool.lptoken;
IERC20(lptoken).safeTransferFrom(msg.sender, voterProxy, _amount);
address gauge = pool.gauge;
require(gauge != address(0),"!gauge");
uint256[] memory rewardBalancesBefore = getPendingRewards(lptoken);
IStaker(voterProxy).deposit(lptoken, gauge);
_writePendingRewards(lptoken, rewardBalancesBefore);
if (earmarkOnDeposit) {
IBoosterEarmark(earmarkDelegate).earmarkRewardsIfAvailable(_pid);
}
address token = pool.token;
if(_stake){
ITokenMinter(token).mint(address(this), _amount);
IRewards(pool.crvRewards).stakeFor(_receiver, _amount);
}else{
ITokenMinter(token).mint(_receiver, _amount);
}
emit Deposited(_receiver, _pid, _amount);
return true;
}
function _withdraw(uint256 _pid, uint256 _amount, address _from, address _to) internal {
require(!paused, "paused");
PoolInfo storage pool = poolInfo[_pid];
address lptoken = pool.lptoken;
address gauge = pool.gauge;
address token = pool.token;
ITokenMinter(token).burn(_from,_amount);
if (!pool.shutdown) {
uint256[] memory rewardBalancesBefore = getPendingRewards(lptoken);
IStaker(voterProxy).withdrawLp(lptoken, gauge, _amount);
_writePendingRewards(lptoken, rewardBalancesBefore);
if (earmarkOnDeposit) {
IBoosterEarmark(earmarkDelegate).earmarkRewards(_pid);
}
}
IERC20(lptoken).safeTransfer(_to, _amount);
emit Withdrawn(_to, _pid, _amount);
}
function withdraw(uint256 _pid, uint256 _amount) public returns(bool){
_withdraw(_pid,_amount,msg.sender,msg.sender);
return true;
}
function withdrawTo(uint256 _pid, uint256 _amount, address _to) external returns(bool){
address rewardContract = poolInfo[_pid].crvRewards;
require(msg.sender == rewardContract,"!auth");
_withdraw(_pid,_amount,msg.sender,_to);
return true;
}
function getPendingRewardTokens(address _lptoken) public view returns (address[] memory tokens) {
if (lpPendingRewardTokens[_lptoken].length > 0) {
return lpPendingRewardTokens[_lptoken];
} else {
tokens = new address[](1);
tokens[0] = crv;
}
}
function getPendingRewards(address _lptoken) public view returns (uint256[] memory result) {
address[] memory tokens = getPendingRewardTokens(_lptoken);
uint256 len = tokens.length;
result = new uint256[](len);
for (uint256 i = 0; i < len; i++) {
uint256 balance = IERC20(tokens[i]).balanceOf(voterProxy);
if (tokens[i] == weth) {
balance = balance.add(voterProxy.balance);
}
result[i] = balance;
}
}
function _writePendingRewards(address _lptoken, uint256[] memory _rewardsBefore) internal {
address[] memory tokens = getPendingRewardTokens(_lptoken);
uint256 len = _rewardsBefore.length;
for (uint256 i = 0; i < len; i++) {
address token = tokens[i];
uint256 balance = IERC20(token).balanceOf(voterProxy);
if (token == weth) {
balance = balance.add(voterProxy.balance);
}
lpPendingRewards[_lptoken][token] = lpPendingRewards[_lptoken][token].add(balance.sub(_rewardsBefore[i]));
}
}
function setVote(bytes32 _hash, bool valid) external returns(bool){
require(voteDelegate[msg.sender], "!auth");
IStaker(voterProxy).setVote(_hash, valid);
return true;
}
function voteExecute(address _voting, uint256 _value, bytes calldata _data) external payable returns(bytes memory result) {
require(voteDelegate[msg.sender], "!auth");
require(votingMap[_voting], "!voting");
(, result) = IStaker(voterProxy).execute{value:_value}(_voting, _value, _data);
return result;
}
function voterProxyClaimRewards(uint256 _pid, address[] memory _pendingTokens) external returns (uint256[] memory pendingRewards) {
require(earmarkDelegate == msg.sender, "!auth");
PoolInfo storage pool = poolInfo[_pid];
address lptoken = pool.lptoken;
IStaker(voterProxy).claimCrv(lptoken, pool.gauge);
uint256 tLen = _pendingTokens.length;
pendingRewards = new uint256[](tLen);
for (uint256 i = 0; i < tLen; i++) {
pendingRewards[i] = lpPendingRewards[lptoken][_pendingTokens[i]];
if (lpPendingRewards[lptoken][_pendingTokens[i]] > 0) {
lpPendingRewards[lptoken][_pendingTokens[i]] = 0;
}
}
}
function distributeRewards(
uint256 _pid,
address _lpToken,
address _rewardToken,
address[] memory _transferTo,
uint256[] memory _transferAmount,
bool[] memory _callQueue
) external {
require(!paused, "paused");
require(earmarkDelegate == msg.sender, "!auth");
uint256 tLen = _transferTo.length;
require(tLen == _transferAmount.length && tLen == _callQueue.length, "!len");
uint256 sum = 0;
for (uint256 i = 0; i < tLen; i++) {
sum = sum.add(_transferAmount[i]);
if (_callQueue[i]) {
IRewards(_transferTo[i]).queueNewRewards(_rewardToken, _transferAmount[i]);
} else {
IERC20(_rewardToken).safeTransfer(_transferTo[i], _transferAmount[i]);
}
emit EarmarkRewardsTransfer(_pid, _lpToken, _rewardToken, _transferAmount[i], _transferTo[i], _callQueue[i]);
}
emit EarmarkRewards(_pid, _lpToken, _rewardToken, sum);
}
function approveDistribution(address _distro, address[] memory _distributionTokens, uint256 _amount) external {
require(earmarkDelegate == msg.sender, "!auth");
uint256 distTokensLen = _distributionTokens.length;
for (uint256 i = 0; i < distTokensLen; i++) {
IERC20(_distributionTokens[i]).safeApprove(_distro, 0);
if (_amount > 0) {
IERC20(_distributionTokens[i]).safeApprove(_distro, _amount);
}
}
}
function approvePoolsCrvRewardsDistribution(address _token) external {
require(earmarkDelegate == msg.sender, "!auth");
uint256 poolLen = poolInfo.length;
for (uint256 i = 0; i < poolLen; i++) {
IERC20(_token).safeApprove(poolInfo[i].crvRewards, 0);
IERC20(_token).safeApprove(poolInfo[i].crvRewards, type(uint256).max);
}
}
function rewardClaimed(uint256 _pid, address _address, uint256 _amount, bool _lock) external returns(bool){
require(!paused, "paused");
address rewardContract = poolInfo[_pid].crvRewards;
require(msg.sender == rewardContract || msg.sender == crvLockRewards, "!auth");
uint256 mintAmount = _amount;
uint256 poolMintRatio = customMintRatio[_pid];
if (poolMintRatio == 0) {
poolMintRatio = mintRatio;
}
if (poolMintRatio > 0) {
mintAmount = mintAmount.mul(poolMintRatio).div(DENOMINATOR);
}
uint256 poolPenaltyShare = customPenaltyShare[_pid];
if (poolPenaltyShare == 0) {
poolPenaltyShare = penaltyShare;
} else if (poolPenaltyShare == 1) {
poolPenaltyShare = 0;
}
ITokenMinter tokenMinter = reservoirMinter == address(0) ? ITokenMinter(cvx) : ITokenMinter(reservoirMinter);
uint256 penalty;
if (_lock) {
uint256 balanceBefore = IERC20(cvx).balanceOf(address(this));
tokenMinter.mint(address(this), mintAmount);
ICvxLocker(cvxLocker).lock(_address, IERC20(cvx).balanceOf(address(this)).sub(balanceBefore));
} else {
penalty = mintAmount.mul(poolPenaltyShare).div(DENOMINATOR);
mintAmount = mintAmount.sub(penalty);
tokenMinter.mint(_address, mintAmount);
if (penalty > 0) {
uint256 balanceBefore = IERC20(cvx).balanceOf(address(this));
tokenMinter.mint(address(this), penalty);
extraRewardsDist.addReward(cvx, IERC20(cvx).balanceOf(address(this)).sub(balanceBefore));
}
}
emit RewardClaimed(_pid, _address, _amount, _lock, mintAmount, penalty);
return true;
}
function minterMint(address _address, uint256 _amount) external returns(bool){
require(msg.sender == mintManager, "!auth");
ITokenMinter(cvx).mint(_address, _amount);
emit MinterMint(_address, _amount);
return true;
}
function getLpBalance(address _gauge, address _lptoken) public returns (uint128 amount) {
uint256 mwPid = IStaker(voterProxy).lpTokenToPid(_gauge, _lptoken);
(amount, , ,) = IMasterWombat(_gauge).userInfo(mwPid, voterProxy);
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
}
文件 3 的 6:IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 4 的 6:Interfaces.sol
pragma solidity 0.6.12;
interface IMasterWombat {
function deposit(uint256 _pid, uint256 _amount) external;
function balanceOf(address) external view returns(uint256);
function userInfo(uint256, address) external view returns (uint128 amount, uint128 factor, uint128 rewardDebt, uint128 pendingWom);
function withdraw(uint256 _pid, uint256 _amount) external;
function poolLength() external view returns(uint256);
function poolInfo(uint256 _pid) external view returns (address lpToken, uint96 allocPoint, IMasterWombatRewarder rewarder, uint256 sumOfFactors, uint104 accWomPerShare, uint104 accWomPerFactorShare, uint40 lastRewardTimestamp);
function migrate(uint256[] calldata _pids) external view;
function newMasterWombat() external view returns (address);
}
interface IMasterWombatRewarder {
function rewardTokens() external view returns (address[] memory tokens);
}
interface IBooster {
function owner() external view returns(address);
}
interface IVeWom {
function mint(uint256 amount, uint256 lockDays) external returns (uint256 veWomAmount);
function burn(uint256 slot) external;
function vote(uint256, bool, bool) external;
}
interface IVoting{
function vote(uint256, bool, bool) external;
function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory);
function vote_for_gauge_weights(address,uint256) external;
}
interface IMinter{
function mint(address) external;
function updateOperator() external;
function operator() external returns(address);
}
interface ICvxLocker {
function lock(address _account, uint256 _amount) external;
}
interface IStaker{
function deposit(address, address) external returns (bool);
function withdraw(address) external returns (uint256);
function withdrawLp(address, address, uint256) external returns (bool);
function withdrawAllLp(address, address) external returns (bool);
function lock(uint256 _lockDays) external;
function releaseLock(uint256 _slot) external returns(uint256);
function getGaugeRewardTokens(address _lptoken, address _gauge) external returns (address[] memory tokens);
function claimCrv(address, address) external returns (address[] memory tokens);
function balanceOfPool(address, address) external view returns (uint256);
function operator() external view returns (address);
function execute(address _to, uint256 _value, bytes calldata _data) external payable returns (bool, bytes memory);
function setVote(bytes32 hash, bool valid) external;
function setOperator(address _operator) external;
function setOwner(address _owner) external;
function setDepositor(address _depositor) external;
function lpTokenToPid(address _gauge, address _lptoken) external view returns (uint256);
function lpTokenPidSet(address _gauge, address _lptoken) external view returns (bool);
}
interface IBoosterEarmark {
function earmarkRewards(uint256 _pid) external;
function earmarkRewardsIfAvailable(uint256 _pid) external;
function earmarkIncentive() external view returns (uint256);
function earmarkPeriod() external view returns (uint256);
function distributionByTokenLength(address _token) external view returns (uint256);
function distributionByTokens(address, uint256) external view returns (address, uint256, bool);
function distributionTokenList() external view returns (address[] memory);
function updateDistributionByTokens(address _token, address[] memory _distros, uint256[] memory _shares, bool[] memory _callQueue) external;
function setEarmarkConfig(uint256 _earmarkIncentive, uint256 _earmarkPeriod) external;
function transferOwnership(address newOwner) external;
function addPool(address _lptoken, address _gauge) external returns (uint256);
function addCreatedPool(address _lptoken, address _gauge, address _token, address _crvRewards) external returns (uint256);
}
interface IRewards{
function pid() external view returns(uint256);
function stake(address, uint256) external;
function stakeFor(address, uint256) external;
function withdraw(address, uint256) external;
function exit(address) external;
function getReward(address) external;
function queueNewRewards(address, uint256) external;
function notifyRewardAmount(uint256) external;
function setRewardTokenPaused(address, bool) external;
function updateOperatorData(address, uint256) external;
function addExtraReward(address) external;
function extraRewardsLength() external view returns (uint256);
function stakingToken() external view returns (address);
function rewardToken() external view returns(address);
function earned(address account) external view returns (uint256);
function setRatioData(uint256 duration_, uint256 newRewardRatio_) external;
}
interface ITokenMinter{
function mint(address,uint256) external;
function burn(address,uint256) external;
function updateOperator(address) external;
}
interface IDeposit{
function isShutdown() external view returns(bool);
function balanceOf(address _account) external view returns(uint256);
function totalSupply() external view returns(uint256);
function poolInfo(uint256) external view returns(address,address,address,address,address, bool);
function rewardClaimed(uint256,address,uint256,bool) external;
function withdrawTo(uint256,uint256,address) external;
function claimRewards(uint256,address) external returns(bool);
function rewardArbitrator() external returns(address);
function setGaugeRedirect(uint256 _pid) external returns(bool);
function owner() external returns(address);
function deposit(uint256 _pid, uint256 _amount, bool _stake) external returns(bool);
}
interface ICrvDeposit{
function deposit(uint256, bool) external;
function lockIncentive() external view returns(uint256);
}
interface IRewardFactory{
function setAccess(address,bool) external;
function CreateCrvRewards(uint256,address,address) external returns(address);
function CreateTokenRewards(address,address,address) external returns(address);
function activeRewardCount(address) external view returns(uint256);
function addActiveReward(address,uint256) external returns(bool);
function removeActiveReward(address,uint256) external returns(bool);
}
interface IStashFactory{
function CreateStash(uint256,address,address,uint256) external returns(address);
}
interface ITokenFactory{
function CreateDepositToken(address) external returns(address);
}
interface IPools{
function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
function forceAddPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool);
function shutdownPool(uint256 _pid) external returns(bool);
function poolInfo(uint256) external view returns(address,address,address,address,address,bool);
function poolLength() external view returns (uint256);
function gaugeMap(address) external view returns(bool);
function setPoolManager(address _poolM) external;
}
interface IVestedEscrow{
function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool);
}
interface IRewardDeposit {
function addReward(address, uint256) external;
}
interface IWETH {
function deposit() external payable;
}
interface IExtraRewardsDistributor {
function addReward(address _token, uint256 _amount) external;
}
文件 5 的 6:SafeERC20.sol
pragma solidity >=0.6.0 <0.8.0;
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
library SafeERC20 {
using SafeMath for uint256;
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));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
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).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 6 的 6:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/vendor/Booster.sol": "Booster"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_voterProxy","type":"address"},{"internalType":"address","name":"_reservoirMinter","type":"address"},{"internalType":"address","name":"_cvx","type":"address"},{"internalType":"address","name":"_crv","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"uint256","name":"_minMintRatio","type":"uint256"},{"internalType":"uint256","name":"_maxMintRatio","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintRatio","type":"uint256"}],"name":"CustomMintRatioUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penaltyShare","type":"uint256"}],"name":"CustomPenaltyShareUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newEarmarkDelegate","type":"address"}],"name":"EarmarkDelegateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EarmarkRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"distro","type":"address"},{"indexed":false,"internalType":"bool","name":"queue","type":"bool"}],"name":"EarmarkRewardsTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDist","type":"address"}],"name":"ExtraRewardsDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewardFactory","type":"address"},{"indexed":false,"internalType":"address","name":"tokenFactory","type":"address"}],"name":"FactoriesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"FeeInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeDistro","type":"address"},{"indexed":false,"internalType":"address","name":"lockFees","type":"address"},{"indexed":false,"internalType":"address","name":"feeToken","type":"address"}],"name":"FeeInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newFeeManager","type":"address"}],"name":"FeeManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lockRewards","type":"address"},{"indexed":false,"internalType":"address","name":"cvxLocker","type":"address"}],"name":"LockRewardContractsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"pendingRewardTokens","type":"address[]"}],"name":"LpPendingRewardTokensUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintRatio","type":"uint256"},{"indexed":false,"internalType":"address","name":"reservoirMinter","type":"address"},{"indexed":false,"internalType":"address","name":"mintManager","type":"address"}],"name":"MintParamsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinterMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPenalty","type":"uint256"}],"name":"PenaltyShareUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"address","name":"gauge","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"crvRewards","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPoolManager","type":"address"}],"name":"PoolManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolShutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"lock","type":"bool"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"crvRewards","type":"address"},{"indexed":true,"internalType":"address","name":"newBooster","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"RewardMigrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"earmarkOnDeposit","type":"bool"}],"name":"SetEarmarkOnDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"SetPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voteDelegate","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"VoteDelegateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"voting","type":"address"},{"indexed":false,"internalType":"bool","name":"valid","type":"bool"}],"name":"VotingMapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"poolid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PENALTY_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_crvRewards","type":"address"}],"name":"addCreatedPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"addPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distro","type":"address"},{"internalType":"address[]","name":"_distributionTokens","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"approvePoolsCrvRewardsDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crvLockRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"customMintRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"customPenaltyShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cvxLocker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"deposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"depositFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address[]","name":"_transferTo","type":"address[]"},{"internalType":"uint256[]","name":"_transferAmount","type":"uint256[]"},{"internalType":"bool[]","name":"_callQueue","type":"bool[]"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earmarkDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earmarkOnDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraRewardsDist","outputs":[{"internalType":"contract IExtraRewardsDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"forceShutdownPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_lptoken","type":"address"}],"name":"getLpBalance","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"}],"name":"getPendingRewardTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lptoken","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256[]","name":"result","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpPendingRewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"lpPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewards","type":"address[]"},{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"address","name":"_newBooster","type":"address"}],"name":"migrateRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minMintRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"minterMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penaltyShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"lptoken","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"crvRewards","type":"address"},{"internalType":"bool","name":"shutdown","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservoirMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"rewardClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintRatios","type":"uint256[]"}],"name":"setCustomMintRatioMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_penaltyShares","type":"uint256[]"}],"name":"setCustomPenaltyShareMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_earmarkDelegate","type":"address"}],"name":"setEarmarkDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_earmarkOnDeposit","type":"bool"}],"name":"setEarmarkOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dist","type":"address"}],"name":"setExtraRewardsDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rfactory","type":"address"},{"internalType":"address","name":"_tfactory","type":"address"}],"name":"setFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeM","type":"address"}],"name":"setFeeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crvLockRewards","type":"address"},{"internalType":"address","name":"_cvxLocker","type":"address"}],"name":"setLockRewardContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"setLpPendingRewardTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRatio","type":"uint256"},{"internalType":"address","name":"_reservoirMinter","type":"address"},{"internalType":"address","name":"_mintManager","type":"address"}],"name":"setMintParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolM","type":"address"}],"name":"setPoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_penaltyShare","type":"uint256"}],"name":"setRewardClaimedPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardPools","type":"address[]"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setRewardTokenPausedInPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"},{"internalType":"bool","name":"valid","type":"bool"}],"name":"setVote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voteDelegate","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setVoteDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voting","type":"address"},{"internalType":"bool","name":"_valid","type":"bool"}],"name":"setVotingValid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"shutdownPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shutdownSystem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updateLpPendingRewardTokensByGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"voteDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_voting","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"voteExecute","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"voterProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address[]","name":"_pendingTokens","type":"address[]"}],"name":"voterProxyClaimRewards","outputs":[{"internalType":"uint256[]","name":"pendingRewards","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votingMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]