编译器
0.8.11+commit.d7f03943
文件 1 的 12:Address.sol
pragma solidity ^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
) internal 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 的 12:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 12:IBalancerCore.sol
pragma solidity 0.8.11;
import { IERC20 } from "@openzeppelin/contracts-0.8/token/ERC20/IERC20.sol";
interface IPriceOracle {
struct OracleAverageQuery {
Variable variable;
uint256 secs;
uint256 ago;
}
enum Variable {
PAIR_PRICE,
BPT_PRICE,
INVARIANT
}
function getTimeWeightedAverage(OracleAverageQuery[] memory queries)
external
view
returns (uint256[] memory results);
}
interface IBalancerVault {
enum PoolSpecialization {
GENERAL,
MINIMAL_SWAP_INFO,
TWO_TOKEN
}
enum JoinKind {
INIT,
EXACT_TOKENS_IN_FOR_BPT_OUT,
TOKEN_IN_FOR_EXACT_BPT_OUT,
ALL_TOKENS_IN_FOR_EXACT_BPT_OUT
}
enum SwapKind {
GIVEN_IN,
GIVEN_OUT
}
struct BatchSwapStep {
bytes32 poolId;
uint256 assetInIndex;
uint256 assetOutIndex;
uint256 amount;
bytes userData;
}
function batchSwap(
SwapKind kind,
BatchSwapStep[] memory swaps,
IAsset[] memory assets,
FundManagement memory funds,
int256[] memory limits,
uint256 deadline
) external payable returns (int256[] memory);
struct SingleSwap {
bytes32 poolId;
SwapKind kind;
IAsset assetIn;
IAsset assetOut;
uint256 amount;
bytes userData;
}
struct FundManagement {
address sender;
bool fromInternalBalance;
address payable recipient;
bool toInternalBalance;
}
struct JoinPoolRequest {
IAsset[] assets;
uint256[] maxAmountsIn;
bytes userData;
bool fromInternalBalance;
}
function getPool(bytes32 poolId) external view returns (address, PoolSpecialization);
function getPoolTokens(bytes32 poolId)
external
view
returns (
address[] memory tokens,
uint256[] memory balances,
uint256 lastChangeBlock
);
function joinPool(
bytes32 poolId,
address sender,
address recipient,
JoinPoolRequest memory request
) external payable;
function swap(
SingleSwap memory singleSwap,
FundManagement memory funds,
uint256 limit,
uint256 deadline
) external returns (uint256 amountCalculated);
function exitPool(
bytes32 poolId,
address sender,
address payable recipient,
ExitPoolRequest memory request
) external;
function getInternalBalance(address user, address[] memory tokens) external view returns (uint256[] memory);
function queryBatchSwap(
SwapKind kind,
BatchSwapStep[] memory swaps,
IAsset[] memory assets,
FundManagement memory funds
) external returns (int256[] memory assetDeltas);
struct ExitPoolRequest {
IAsset[] assets;
uint256[] minAmountsOut;
bytes userData;
bool toInternalBalance;
}
enum ExitKind {
EXACT_BPT_IN_FOR_ONE_TOKEN_OUT,
EXACT_BPT_IN_FOR_TOKENS_OUT,
BPT_IN_FOR_EXACT_TOKENS_OUT,
MANAGEMENT_FEE_TOKENS_OUT
}
}
interface IAsset {
}
interface IBalancerPool {
function getPoolId() external view returns (bytes32);
function getNormalizedWeights() external view returns (uint256[] memory);
function getSwapEnabled() external view returns (bool);
function getOwner() external view returns (address);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
}
interface ILBPFactory {
function create(
string memory name,
string memory symbol,
IERC20[] memory tokens,
uint256[] memory weights,
uint256 swapFeePercentage,
address owner,
bool swapEnabledOnStart
) external returns (address);
}
interface ILBP {
function setSwapEnabled(bool swapEnabled) external;
function updateWeightsGradually(
uint256 startTime,
uint256 endTime,
uint256[] memory endWeights
) external;
function getGradualWeightUpdateParams()
external
view
returns (
uint256 startTime,
uint256 endTime,
uint256[] memory endWeights
);
}
interface IStablePoolFactory {
function create(
string memory name,
string memory symbol,
IERC20[] memory tokens,
uint256 amplificationParameter,
uint256 swapFeePercentage,
address owner
) external returns (address);
}
interface IWeightedPool2TokensFactory {
function create(
string memory name,
string memory symbol,
IERC20[] memory tokens,
uint256[] memory weights,
uint256 swapFeePercentage,
bool oracleEnabled,
address owner
) external returns (address);
}
interface IRateProvider {
function getRate() external view returns (uint256);
}
interface IWeightedPoolFactory {
function create(
string memory name,
string memory symbol,
IERC20[] memory tokens,
uint256[] memory normalizedWeights,
IRateProvider[] memory rateProviders,
uint256 swapFeePercentage,
address owner
) external returns (address);
}
文件 4 的 12:IBasicRewards.sol
pragma solidity 0.8.11;
interface IBasicRewards {
function stakeFor(address, uint256) external returns (bool);
function balanceOf(address) external view returns (uint256);
function totalSupply() external view returns (uint256);
function earned(address) external view returns (uint256);
function withdrawAll(bool) external returns (bool);
function withdraw(uint256, bool) external returns (bool);
function withdraw(address, uint256) external;
function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);
function getReward() external returns (bool);
function stake(uint256) external returns (bool);
function stake(address, uint256) external;
function extraRewards(uint256) external view returns (address);
function exit() external returns (bool);
}
文件 5 的 12:IERC20.sol
pragma solidity ^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);
}
文件 6 的 12:IGenericVault.sol
pragma solidity 0.8.11;
interface IGenericVault {
function withdraw(address _to, uint256 _shares) external returns (uint256 withdrawn);
function withdrawAll(address _to) external returns (uint256 withdrawn);
function depositAll(address _to) external returns (uint256 _shares);
function deposit(address _to, uint256 _amount) external returns (uint256 _shares);
function harvest() external;
function balanceOfUnderlying(address user) external view returns (uint256 amount);
function totalUnderlying() external view returns (uint256 total);
function totalSupply() external view returns (uint256 total);
function underlying() external view returns (address);
function strategy() external view returns (address);
function platform() external view returns (address);
function setPlatform(address _platform) external;
function setPlatformFee(uint256 _fee) external;
function setCallIncentive(uint256 _incentive) external;
function setWithdrawalPenalty(uint256 _penalty) external;
function setApprovals() external;
function callIncentive() external view returns (uint256);
function withdrawalPenalty() external view returns (uint256);
function platformFee() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function extraRewardsLength() external view returns (uint256);
function extraRewards(uint256) external view returns (address);
}
文件 7 的 12:IRewardHandler.sol
pragma solidity 0.8.11;
interface IRewardHandler {
function sell() external;
function setPendingOwner(address _po) external;
function applyPendingOwner() external;
function rescueToken(address _token, address _to) external;
}
文件 8 的 12:IVirtualRewards.sol
pragma solidity 0.8.11;
interface IVirtualRewardFactory {
function createVirtualReward(
address,
address,
address
) external returns (address);
}
interface IVirtualRewards {
function queueNewRewards(uint256) external;
function rewardToken() external view returns (address);
}
文件 9 的 12:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 10 的 12:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
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));
}
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
function _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");
}
}
}
文件 11 的 12:Strategy.sol
pragma solidity 0.8.11;
import { Ownable } from "@openzeppelin/contracts-0.8/access/Ownable.sol";
import { SafeERC20 } from "@openzeppelin/contracts-0.8/token/ERC20/utils/SafeERC20.sol";
import { IERC20 } from "@openzeppelin/contracts-0.8/token/ERC20/IERC20.sol";
import { IGenericVault } from "../interfaces/IGenericVault.sol";
import { IRewardHandler } from "../interfaces/balancer/IRewardHandler.sol";
import { IVirtualRewards } from "../interfaces/IVirtualRewards.sol";
import { AuraBalStrategyBase } from "./StrategyBase.sol";
contract AuraBalStrategy is Ownable, AuraBalStrategyBase {
using SafeERC20 for IERC20;
address public immutable vault;
address[] public rewardTokens;
mapping(address => address) public rewardHandlers;
uint256 public constant FEE_DENOMINATOR = 10000;
constructor(
address _vault,
address _balVault,
address _auraBalStaking,
address _balToken,
address _wethToken,
address _auraToken,
address _auraBalToken,
address _bbusdToken,
bytes32 _auraBalBalETHBptPoolId,
bytes32 _balETHPoolId
)
AuraBalStrategyBase(
_balVault,
_auraBalStaking,
_balToken,
_wethToken,
_auraToken,
_auraBalToken,
_bbusdToken,
_auraBalBalETHBptPoolId,
_balETHPoolId
)
{
vault = _vault;
}
function setApprovals() external {
IERC20(AURABAL_TOKEN).safeApprove(address(auraBalStaking), 0);
IERC20(AURABAL_TOKEN).safeApprove(address(auraBalStaking), type(uint256).max);
IERC20(BAL_TOKEN).safeApprove(address(balVault), 0);
IERC20(BAL_TOKEN).safeApprove(address(balVault), type(uint256).max);
IERC20(WETH_TOKEN).safeApprove(address(balVault), 0);
IERC20(WETH_TOKEN).safeApprove(address(balVault), type(uint256).max);
IERC20(BAL_ETH_POOL_TOKEN).safeApprove(address(balVault), 0);
IERC20(BAL_ETH_POOL_TOKEN).safeApprove(address(balVault), type(uint256).max);
}
function _updateRewardToken(address _token, address _handler) internal {
rewardHandlers[_token] = _handler;
}
function addRewardToken(address _token, address _handler) external onlyOwner {
rewardTokens.push(_token);
_updateRewardToken(_token, _handler);
}
function updateRewardToken(address _token, address _handler) external onlyOwner {
_updateRewardToken(_token, _handler);
}
function totalRewardTokens() external view returns (uint256) {
return rewardTokens.length;
}
function totalUnderlying() public view returns (uint256 total) {
return auraBalStaking.balanceOf(address(this));
}
function stake(uint256 _amount) public onlyVault {
auraBalStaking.stake(_amount);
}
function withdraw(uint256 _amount) external onlyVault {
auraBalStaking.withdraw(_amount, false);
IERC20(AURABAL_TOKEN).safeTransfer(vault, _amount);
}
function harvest(uint256 _minAmountOut) public onlyVault returns (uint256 harvested) {
auraBalStaking.getReward();
uint256 extraRewardCount = IGenericVault(vault).extraRewardsLength();
for (uint256 i; i < extraRewardCount; ++i) {
address rewards = IGenericVault(vault).extraRewards(i);
address token = IVirtualRewards(rewards).rewardToken();
uint256 balance = IERC20(token).balanceOf(address(this));
if (balance > 0) {
IERC20(token).safeTransfer(rewards, balance);
IVirtualRewards(rewards).queueNewRewards(balance);
}
}
address[] memory _rewardTokens = rewardTokens;
for (uint256 i; i < _rewardTokens.length; ++i) {
address _tokenHandler = rewardHandlers[_rewardTokens[i]];
if (_tokenHandler == address(0)) {
continue;
}
uint256 _tokenBalance = IERC20(_rewardTokens[i]).balanceOf(address(this));
if (_tokenBalance > 0) {
IERC20(_rewardTokens[i]).safeTransfer(_tokenHandler, _tokenBalance);
IRewardHandler(_tokenHandler).sell();
}
}
uint256 _wethBalance = IERC20(WETH_TOKEN).balanceOf(address(this));
uint256 _balBalance = IERC20(BAL_TOKEN).balanceOf(address(this));
if (_wethBalance + _balBalance == 0) {
return 0;
}
_depositToBalEthPool(_balBalance, _wethBalance, 0);
uint256 _bptBalance = IERC20(BAL_ETH_POOL_TOKEN).balanceOf(address(this));
_swapBptToAuraBal(_bptBalance, _minAmountOut);
uint256 _auraBalBalance = IERC20(AURABAL_TOKEN).balanceOf(address(this));
if (_auraBalBalance > 0) {
stake(_auraBalBalance);
return _auraBalBalance;
}
return 0;
}
modifier onlyVault() {
require(vault == msg.sender, "Vault calls only");
_;
}
}
文件 12 的 12:StrategyBase.sol
pragma solidity 0.8.11;
import { IBasicRewards } from "../interfaces/IBasicRewards.sol";
import { IAsset, IBalancerVault } from "../interfaces/balancer/IBalancerCore.sol";
contract AuraBalStrategyBase {
address public immutable BBUSD_TOKEN;
address public immutable AURA_TOKEN;
address public immutable AURABAL_TOKEN;
address public immutable WETH_TOKEN;
address public immutable BAL_TOKEN;
address public immutable BAL_ETH_POOL_TOKEN;
bytes32 private immutable AURABAL_BAL_ETH_BPT_POOL_ID;
bytes32 private immutable BAL_ETH_POOL_ID;
IBasicRewards public immutable auraBalStaking;
IBalancerVault public immutable balVault;
constructor(
address _balVault,
address _auraBalStaking,
address _balToken,
address _wethToken,
address _auraToken,
address _auraBalToken,
address _bbusdToken,
bytes32 _auraBalBalETHBptPoolId,
bytes32 _balETHPoolId
) {
(
address balEthPoolToken,
) = IBalancerVault(_balVault).getPool(_balETHPoolId);
require(balEthPoolToken != address(0), "!balEthPoolToken");
balVault = IBalancerVault(_balVault);
auraBalStaking = IBasicRewards(_auraBalStaking);
BAL_TOKEN = _balToken;
WETH_TOKEN = _wethToken;
AURA_TOKEN = _auraToken;
AURABAL_TOKEN = _auraBalToken;
BBUSD_TOKEN = _bbusdToken;
BAL_ETH_POOL_TOKEN = balEthPoolToken;
AURABAL_BAL_ETH_BPT_POOL_ID = _auraBalBalETHBptPoolId;
BAL_ETH_POOL_ID = _balETHPoolId;
}
function _depositToBalEthPool(
uint256 _balAmount,
uint256 _wethAmount,
uint256 _minAmountOut
) internal {
IAsset[] memory _assets = new IAsset[](2);
_assets[0] = IAsset(BAL_TOKEN);
_assets[1] = IAsset(WETH_TOKEN);
uint256[] memory _amountsIn = new uint256[](2);
_amountsIn[0] = _balAmount;
_amountsIn[1] = _wethAmount;
balVault.joinPool(
BAL_ETH_POOL_ID,
address(this),
address(this),
IBalancerVault.JoinPoolRequest(
_assets,
_amountsIn,
abi.encode(IBalancerVault.JoinKind.EXACT_TOKENS_IN_FOR_BPT_OUT, _amountsIn, _minAmountOut),
false
)
);
}
function _swapBptToAuraBal(uint256 _amount, uint256 _minAmountOut) internal returns (uint256) {
IBalancerVault.SingleSwap memory _auraSwapParams = IBalancerVault.SingleSwap({
poolId: AURABAL_BAL_ETH_BPT_POOL_ID,
kind: IBalancerVault.SwapKind.GIVEN_IN,
assetIn: IAsset(BAL_ETH_POOL_TOKEN),
assetOut: IAsset(AURABAL_TOKEN),
amount: _amount,
userData: new bytes(0)
});
return balVault.swap(_auraSwapParams, _createSwapFunds(), _minAmountOut, block.timestamp + 1);
}
function _createSwapFunds() internal view returns (IBalancerVault.FundManagement memory) {
return
IBalancerVault.FundManagement({
sender: address(this),
fromInternalBalance: false,
recipient: payable(address(this)),
toInternalBalance: false
});
}
}
{
"compilationTarget": {
"contracts/compounder/Strategy.sol": "AuraBalStrategy"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_balVault","type":"address"},{"internalType":"address","name":"_auraBalStaking","type":"address"},{"internalType":"address","name":"_balToken","type":"address"},{"internalType":"address","name":"_wethToken","type":"address"},{"internalType":"address","name":"_auraToken","type":"address"},{"internalType":"address","name":"_auraBalToken","type":"address"},{"internalType":"address","name":"_bbusdToken","type":"address"},{"internalType":"bytes32","name":"_auraBalBalETHBptPoolId","type":"bytes32"},{"internalType":"bytes32","name":"_balETHPoolId","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"AURABAL_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"AURA_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BAL_ETH_POOL_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BAL_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BBUSD_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_handler","type":"address"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auraBalStaking","outputs":[{"internalType":"contract IBasicRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balVault","outputs":[{"internalType":"contract IBalancerVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountOut","type":"uint256"}],"name":"harvest","outputs":[{"internalType":"uint256","name":"harvested","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardHandlers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewardTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUnderlying","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_handler","type":"address"}],"name":"updateRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]