编译器
0.8.25+commit.b61c2a91
文件 1 的 7:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 7:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from, address to, uint256 amount) external returns (bool);
}
文件 3 的 7:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 4 的 7:IYearnBoostedStaker.sol
pragma solidity ^0.8.22;
import {IERC20, SafeERC20} from "./SafeERC20.sol";
interface IYearnBoostedStaker {
struct AccountData {
uint112 realizedStake;
uint112 pendingStake;
uint16 lastUpdateWeek;
uint8 updateWeeksBitmap;
}
struct ToRealize {
uint112 weightPersistent;
uint112 weight;
}
enum ApprovalStatus {
None,
StakeOnly,
UnstakeOnly,
StakeAndUnstake
}
function MAX_STAKE_GROWTH_WEEKS() external view returns (uint);
function MAX_WEEK_BIT() external view returns (uint8);
function START_TIME() external view returns (uint);
function stakeToken() external view returns (IERC20);
function globalGrowthRate() external view returns (uint112);
function globalLastUpdateWeek() external view returns (uint16);
function totalSupply() external view returns (uint);
function decimals() external view returns (uint8);
function owner() external view returns (address);
function pendingOwner() external view returns (address);
function approvedCaller(address account, address caller) external view returns (ApprovalStatus);
function approvedWeightedStaker(address staker) external view returns (bool);
function accountWeeklyToRealize(address account, uint week) external view returns (ToRealize memory);
function globalWeeklyToRealize(uint week) external view returns (ToRealize memory);
function accountWeeklyMaxStake(address account, uint week) external view returns (uint);
function globalWeeklyMaxStake(uint week) external view returns (uint);
event Stake(address indexed account, uint indexed week, uint amount, uint newUserWeight, uint weightAdded);
event Unstake(address indexed account, uint indexed week, uint amount, uint newUserWeight, uint weightRemoved);
event ApprovedCallerSet(address indexed account, address indexed caller, ApprovalStatus status);
event WeightedStakerSet(address indexed staker, bool approved);
event OwnershipTransferred(address indexed newOwner);
function stake(uint _amount) external returns (uint);
function stakeFor(address _account, uint _amount) external returns (uint);
function stakeAsMaxWeighted(address _account, uint _amount) external returns (uint);
function unstake(uint _amount, address _receiver) external returns (uint);
function unstakeFor(address _account, uint _amount, address _receiver) external returns (uint);
function checkpointAccount(address _account) external returns (AccountData memory acctData, uint weight);
function checkpointAccountWithLimit(address _account, uint _week) external returns (AccountData memory acctData, uint weight);
function getAccountWeight(address account) external view returns (uint);
function getAccountWeightAt(address _account, uint _week) external view returns (uint);
function checkpointGlobal() external returns (uint);
function getGlobalWeight() external view returns (uint);
function getGlobalWeightAt(uint week) external view returns (uint);
function getAccountWeightRatio(address _account) external view returns (uint);
function getAccountWeightRatioAt(address _account, uint _week) external view returns (uint);
function balanceOf(address _account) external view returns (uint);
function setApprovedCaller(address _caller, ApprovalStatus _status) external;
function setWeightedStaker(address _staker, bool _approved) external;
function transferOwnership(address _pendingOwner) external;
function acceptOwnership() external;
function sweep(address _token) external;
function getWeek() external view returns (uint);
}
文件 5 的 7:SafeERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./IERC20Permit.sol";
import "./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 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
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");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 6 的 7:SingleTokenRewardDistributor.sol
pragma solidity ^0.8.22;
import {WeekStart, IYearnBoostedStaker} from "./WeekStart.sol";
import {IERC20, SafeERC20} from "./SafeERC20.sol";
contract SingleTokenRewardDistributor is WeekStart {
using SafeERC20 for IERC20;
uint constant public PRECISION = 1e27;
IYearnBoostedStaker public immutable staker;
IERC20 public immutable rewardToken;
uint public immutable START_WEEK;
uint immutable MAX_STAKE_GROWTH_WEEKS;
struct AccountInfo {
address recipient;
uint96 lastClaimWeek;
}
mapping(uint week => uint amount) public weeklyRewardAmount;
mapping(address account => AccountInfo info) public accountInfo;
mapping(address account => mapping(address claimer => bool approved)) public approvedClaimer;
event RewardDeposited(uint indexed week, address indexed depositor, uint rewardAmount);
event RewardsClaimed(address indexed account, uint indexed week, uint rewardAmount);
event RecipientConfigured(address indexed account, address indexed recipient);
event ClaimerApproved(address indexed account, address indexed, bool approved);
event RewardPushed(uint indexed fromWeek, uint indexed toWeek, uint amount);
constructor(
IYearnBoostedStaker _staker,
IERC20 _rewardToken
)
WeekStart(_staker) {
staker = _staker;
rewardToken = _rewardToken;
START_WEEK = staker.getWeek();
MAX_STAKE_GROWTH_WEEKS = staker.MAX_STAKE_GROWTH_WEEKS();
}
function depositReward(uint _amount) external {
if (_amount > 0) {
uint week = getWeek();
weeklyRewardAmount[week] += _amount;
rewardToken.safeTransferFrom(msg.sender, address(this), _amount);
emit RewardDeposited(week, msg.sender, _amount);
}
}
function pushRewards(uint _week) external returns (bool) {
uint week = getWeek();
uint amount = pushableRewards(_week);
if(amount == 0) return false;
weeklyRewardAmount[_week] = 0;
weeklyRewardAmount[week] += amount;
emit RewardPushed(_week, week, amount);
return true;
}
function pushableRewards(uint _week) public view returns (uint) {
uint week = getWeek();
if(_week >= week) return 0;
if(adjustedGlobalWeightAt(_week) != 0) return 0;
return weeklyRewardAmount[_week];
}
function claim() external returns (uint amountClaimed) {
uint currentWeek = getWeek();
currentWeek = currentWeek == 0 ? 0 : currentWeek - 1;
return _claimWithRange(msg.sender, 0, currentWeek);
}
function claimFor(address _account) external returns (uint amountClaimed) {
require(_onlyClaimers(_account), "!approvedClaimer");
uint currentWeek = getWeek();
currentWeek = currentWeek == 0 ? 0 : currentWeek - 1;
return _claimWithRange(_account, 0, currentWeek);
}
function claimWithRange(
uint _claimStartWeek,
uint _claimEndWeek
) external returns (uint amountClaimed) {
return _claimWithRange(msg.sender, _claimStartWeek, _claimEndWeek);
}
function claimWithRangeFor(
address _account,
uint _claimStartWeek,
uint _claimEndWeek
) external returns (uint amountClaimed) {
require(_onlyClaimers(_account), "!approvedClaimer");
return _claimWithRange(_account, _claimStartWeek, _claimEndWeek);
}
function _claimWithRange(
address _account,
uint _claimStartWeek,
uint _claimEndWeek
) internal returns (uint amountClaimed) {
uint currentWeek = getWeek();
if(_claimEndWeek >= currentWeek) return 0;
AccountInfo storage info = accountInfo[_account];
uint _minStartWeek = info.lastClaimWeek == 0 ? START_WEEK : info.lastClaimWeek;
_claimStartWeek = max(_minStartWeek, _claimStartWeek);
if(_claimStartWeek > _claimEndWeek) return 0;
amountClaimed = _getTotalClaimableByRange(_account, _claimStartWeek, _claimEndWeek);
_claimEndWeek += 1;
info.lastClaimWeek = uint96(_claimEndWeek);
if (amountClaimed > 0) {
address recipient = info.recipient == address(0) ? _account : info.recipient;
rewardToken.safeTransfer(recipient, amountClaimed);
emit RewardsClaimed(_account, _claimEndWeek, amountClaimed);
}
}
function computeSharesAt(address _account, uint _week) public view returns (uint) {
require(_week <= getWeek(), "Invalid week");
uint adjAcctWeight = adjustedAccountWeightAt(_account, _week);
if (adjAcctWeight == 0) return 0;
uint adjGlobalWeight = adjustedGlobalWeightAt(_week);
if (adjGlobalWeight == 0) return 0;
return adjAcctWeight * PRECISION / adjGlobalWeight;
}
function adjustedAccountWeightAt(address _account, uint _week) public view returns (uint) {
uint acctWeight = staker.getAccountWeightAt(_account, _week);
if (acctWeight == 0) return 0;
return acctWeight - staker.accountWeeklyToRealize(_account, _week + MAX_STAKE_GROWTH_WEEKS).weightPersistent;
}
function adjustedGlobalWeightAt(uint _week) public view returns (uint) {
uint globalWeight = staker.getGlobalWeightAt(_week);
if (globalWeight == 0) return 0;
return globalWeight - staker.globalWeeklyToRealize(_week + MAX_STAKE_GROWTH_WEEKS).weightPersistent;
}
function getClaimable(address _account) external view returns (uint claimable) {
(uint claimStartWeek, uint claimEndWeek) = getSuggestedClaimRange(_account);
return _getTotalClaimableByRange(_account, claimStartWeek, claimEndWeek);
}
function getTotalClaimableByRange(
address _account,
uint _claimStartWeek,
uint _claimEndWeek
) external view returns (uint claimable) {
uint currentWeek = getWeek();
if (_claimEndWeek >= currentWeek) _claimEndWeek = currentWeek - 1;
return _getTotalClaimableByRange(_account, _claimStartWeek, _claimEndWeek);
}
function _getTotalClaimableByRange(
address _account,
uint _claimStartWeek,
uint _claimEndWeek
) internal view returns (uint claimableAmount) {
for (uint i = _claimStartWeek; i <= _claimEndWeek; ++i) {
claimableAmount += _getClaimableAt(_account, i);
}
}
function getSuggestedClaimRange(address _account) public view returns (uint claimStartWeek, uint claimEndWeek) {
uint currentWeek = getWeek();
if (currentWeek == 0) return (0, 0);
bool canClaim;
uint lastClaimWeek = accountInfo[_account].lastClaimWeek;
claimStartWeek = START_WEEK > lastClaimWeek ? START_WEEK : lastClaimWeek;
for (claimStartWeek; claimStartWeek <= currentWeek; claimStartWeek++) {
if (_getClaimableAt(_account, claimStartWeek) > 0) {
canClaim = true;
break;
}
}
if (!canClaim) return (0,0);
for (claimEndWeek = currentWeek - 1; claimEndWeek > claimStartWeek; claimEndWeek--) {
if (_getClaimableAt(_account, claimEndWeek) > 0) {
break;
}
}
return (claimStartWeek, claimEndWeek);
}
function getClaimableAt(
address _account,
uint _week
) external view returns (uint rewardAmount) {
if(_week >= getWeek()) return 0;
return _getClaimableAt(_account, _week);
}
function _getClaimableAt(
address _account,
uint _week
) internal view returns (uint rewardAmount) {
if(_week < accountInfo[_account].lastClaimWeek) return 0;
uint rewardShare = computeSharesAt(_account, _week);
uint totalWeeklyAmount = weeklyRewardAmount[_week];
rewardAmount = rewardShare * totalWeeklyAmount / PRECISION;
}
function _onlyClaimers(address _account) internal view returns (bool approved) {
return approvedClaimer[_account][msg.sender] || _account == msg.sender;
}
function configureRecipient(address _recipient) external {
accountInfo[msg.sender].recipient = _recipient;
emit RecipientConfigured(msg.sender, _recipient);
}
function approveClaimer(address _claimer, bool _approved) external {
approvedClaimer[msg.sender][_claimer] = _approved;
emit ClaimerApproved(msg.sender, _claimer, _approved);
}
function max(uint a, uint b) internal pure returns (uint) {
return a < b ? b : a;
}
}
文件 7 的 7:WeekStart.sol
pragma solidity ^0.8.22;
import {IYearnBoostedStaker} from "./IYearnBoostedStaker.sol";
contract WeekStart {
uint256 public immutable START_TIME;
constructor(IYearnBoostedStaker staker) {
START_TIME = staker.START_TIME();
}
function getWeek() public view returns (uint256 week) {
return (block.timestamp - START_TIME) / 1 weeks;
}
}
{
"compilationTarget": {
"SingleTokenRewardDistributor.sol": "SingleTokenRewardDistributor"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IYearnBoostedStaker","name":"_staker","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ClaimerApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"RecipientConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"week","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"RewardDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromWeek","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toWeek","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"week","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"START_WEEK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountInfo","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint96","name":"lastClaimWeek","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"adjustedAccountWeightAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"adjustedGlobalWeightAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_claimer","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"approveClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"claimer","type":"address"}],"name":"approvedClaimer","outputs":[{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimFor","outputs":[{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimStartWeek","type":"uint256"},{"internalType":"uint256","name":"_claimEndWeek","type":"uint256"}],"name":"claimWithRange","outputs":[{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_claimStartWeek","type":"uint256"},{"internalType":"uint256","name":"_claimEndWeek","type":"uint256"}],"name":"claimWithRangeFor","outputs":[{"internalType":"uint256","name":"amountClaimed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"computeSharesAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"configureRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getClaimable","outputs":[{"internalType":"uint256","name":"claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"getClaimableAt","outputs":[{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getSuggestedClaimRange","outputs":[{"internalType":"uint256","name":"claimStartWeek","type":"uint256"},{"internalType":"uint256","name":"claimEndWeek","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_claimStartWeek","type":"uint256"},{"internalType":"uint256","name":"_claimEndWeek","type":"uint256"}],"name":"getTotalClaimableByRange","outputs":[{"internalType":"uint256","name":"claimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWeek","outputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"pushRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_week","type":"uint256"}],"name":"pushableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staker","outputs":[{"internalType":"contract IYearnBoostedStaker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"week","type":"uint256"}],"name":"weeklyRewardAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"}]