编译器
0.8.23+commit.f704f362
文件 1 的 11: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 的 11: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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
文件 3 的 11:IChefIncentivesController.sol
pragma solidity ^0.8.0;
import './IOnwardIncentivesController.sol';
interface IChefIncentivesController {
struct UserInfo {
uint amount;
uint rewardDebt;
}
struct PoolInfo {
uint totalSupply;
uint allocPoint;
uint lastRewardTime;
uint accRewardPerShare;
IOnwardIncentivesController onwardIncentives;
}
struct EmissionPoint {
uint128 startTimeOffset;
uint128 rewardsPerSecond;
}
function mintedTokens() external view returns (uint);
function rewardsPerSecond() external view returns (uint);
function startTime() external view returns (uint);
function poolInfo(address token) external view returns (PoolInfo memory);
function registeredTokens(uint idx) external view returns (address);
function poolLength() external view returns (uint);
function userInfo(address token, address user) external view returns (UserInfo memory);
function userBaseClaimable(address user) external view returns (uint);
function handleAction(address user, uint256 userBalance, uint256 totalSupply) external;
function addPool(address _token, uint256 _allocPoint) external;
function claim(address _user, address[] calldata _tokens) external;
function setClaimReceiver(address _user, address _receiver) external;
function emissionSchedule(uint256 index) external returns (EmissionPoint memory);
function maxMintableTokens() external returns (uint);
}
文件 4 的 11: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);
}
文件 5 的 11: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);
}
文件 6 的 11:IMultiFeeDistribution.sol
pragma solidity ^0.8.0;
interface IMultiFeeDistribution {
function mint(address user, uint256 amount) external;
}
文件 7 的 11:IOnwardIncentivesController.sol
pragma solidity ^0.8.0;
interface IOnwardIncentivesController {
function handleAction(
address _token,
address _user,
uint256 _balance,
uint256 _totalSupply
) external;
}
文件 8 的 11:IncentivesControllerV3.sol
pragma solidity 0.8.23;
import './interfaces/IMultiFeeDistribution.sol';
import './interfaces/IOnwardIncentivesController.sol';
import './interfaces/IChefIncentivesController.sol';
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import '@openzeppelin/contracts/utils/math/SafeMath.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
contract IncentivesControllerV3 is Ownable {
using SafeMath for uint;
using SafeERC20 for IERC20;
struct UserInfo {
uint amount;
uint rewardDebt;
}
struct PoolInfo {
uint totalSupply;
uint allocPoint;
uint lastRewardTime;
uint accRewardPerShare;
IOnwardIncentivesController onwardIncentives;
}
struct EmissionPoint {
uint128 startTimeOffset;
uint128 rewardsPerSecond;
}
mapping(address => bool) public isPoolConfigurator;
IMultiFeeDistribution public rewardMinter;
IChefIncentivesController public immutable incentivesController;
uint public rewardsPerSecond;
uint public maxMintableTokens;
uint public mintedTokens;
address[] public registeredTokens;
mapping(address => PoolInfo) public poolInfo;
mapping(address => bool) public blacklisted;
EmissionPoint[] public emissionSchedule;
mapping(address => mapping(address => UserInfo)) public userInfo;
mapping(address => uint) public userBaseClaimable;
uint public totalAllocPoint;
uint public startTime;
mapping(address => address) public claimReceiver;
bool private setuped;
mapping(address => mapping(address => bool)) private userInfoInitiated;
mapping(address => bool) private userBaseClaimableInitiated;
event BalanceUpdated(address indexed token, address indexed user, uint balance, uint totalSupply);
event PoolAdded(address indexed token, uint allocPoint);
event AllocPointUpdated(address indexed token, uint allocPoint);
event Blacklisted(address indexed account, bool indexed blacklisted);
event OnwardIncentivesSet(address indexed tokeen, address indexed onwardIncentives);
event PoolConfiguratorSet(address indexed configurator, bool indexed isConfigurator);
event RewardMinterSet(address indexed rewardMinter);
event ClaimReceiverSet(address indexed user, address indexed receiver);
constructor(
address _poolConfigurator,
IMultiFeeDistribution _rewardMinter,
IChefIncentivesController _incentivesController
) {
require(_poolConfigurator != address(0), 'pool configurator not set');
require(address(_rewardMinter) != address(0), 'reward minter not set');
require(address(_incentivesController) != address(0), 'incentives controller not set');
rewardMinter = _rewardMinter;
incentivesController = _incentivesController;
_setPoolConfigurator(_poolConfigurator, true);
}
function addPool(address _token, uint _allocPoint) external {
require(_token != address(0), 'token cannot be zero address');
require(isPoolConfigurator[msg.sender], 'only pool configurator can add pools');
require(poolInfo[_token].lastRewardTime == 0, 'pool already registered');
_updateEmissions();
_massUpdatePools();
totalAllocPoint = totalAllocPoint.add(_allocPoint);
registeredTokens.push(_token);
poolInfo[_token] = PoolInfo({
totalSupply: 0,
allocPoint: _allocPoint,
lastRewardTime: block.timestamp,
accRewardPerShare: 0,
onwardIncentives: IOnwardIncentivesController(address(0))
});
emit PoolAdded(_token, _allocPoint);
}
function handleAction(address _user, uint _balance, uint _totalSupply) external {
_initiateUserInfo(_user, msg.sender);
_initiateUserBaseClaimable(_user);
PoolInfo storage pool = poolInfo[msg.sender];
require(pool.lastRewardTime != 0, 'pool not registered');
_updateEmissions();
_updatePool(pool, totalAllocPoint);
UserInfo storage user = userInfo[msg.sender][_user];
uint256 amount = user.amount;
uint256 accRewardPerShare = pool.accRewardPerShare;
if (amount != 0) {
uint256 pending = amount.mul(accRewardPerShare).div(1e12).sub(user.rewardDebt);
if (pending != 0) {
userBaseClaimable[_user] = userBaseClaimable[_user].add(pending);
}
}
user.amount = _balance;
user.rewardDebt = _balance.mul(accRewardPerShare).div(1e12);
pool.totalSupply = _totalSupply;
if (pool.onwardIncentives != IOnwardIncentivesController(address(0))) {
pool.onwardIncentives.handleAction(msg.sender, _user, _balance, _totalSupply);
}
emit BalanceUpdated(msg.sender, _user, _balance, _totalSupply);
}
function setPoolConfigurator(
address _poolConfigurator,
bool _isPoolConfigurator
) external onlyOwner {
_setPoolConfigurator(_poolConfigurator, _isPoolConfigurator);
}
function setBlacklist(address _user, bool _isBlacklisted) external onlyOwner {
blacklisted[_user] = _isBlacklisted;
emit Blacklisted(_user, _isBlacklisted);
}
function batchUpdateAllocPoint(
address[] calldata _tokens,
uint[] calldata _allocPoints
) external onlyOwner {
require(_tokens.length == _allocPoints.length, 'arrays not same length');
_massUpdatePools();
uint _totalAllocPoint = totalAllocPoint;
for (uint i = 0; i < _tokens.length; i++) {
PoolInfo storage pool = poolInfo[_tokens[i]];
require(pool.lastRewardTime != 0, 'pool not registered');
_totalAllocPoint = _totalAllocPoint.sub(pool.allocPoint).add(_allocPoints[i]);
pool.allocPoint = _allocPoints[i];
emit AllocPointUpdated(_tokens[i], _allocPoints[i]);
}
totalAllocPoint = _totalAllocPoint;
require(totalAllocPoint != 0, 'total points cannot be zero');
}
function setOnwardIncentives(
address _token,
IOnwardIncentivesController _incentives
) external onlyOwner {
require(poolInfo[_token].lastRewardTime != 0, 'pool not registered');
poolInfo[_token].onwardIncentives = _incentives;
emit OnwardIncentivesSet(_token, address(_incentives));
}
function setRewardMinter(IMultiFeeDistribution _miner) external onlyOwner {
rewardMinter = _miner;
emit RewardMinterSet(address(_miner));
}
function setup() external onlyOwner {
require(!setuped, 'already setuped');
uint length = incentivesController.poolLength();
for (uint i = 0; i < length; i++) {
address token = incentivesController.registeredTokens(i);
IChefIncentivesController.PoolInfo memory oldInfo = incentivesController.poolInfo(token);
poolInfo[token] = PoolInfo(
oldInfo.totalSupply,
oldInfo.allocPoint,
oldInfo.lastRewardTime,
oldInfo.accRewardPerShare,
oldInfo.onwardIncentives
);
registeredTokens.push(token);
totalAllocPoint = totalAllocPoint.add(poolInfo[token].allocPoint);
}
_copyEmissionSchedule();
startTime = incentivesController.startTime();
rewardsPerSecond = incentivesController.rewardsPerSecond();
mintedTokens = incentivesController.mintedTokens();
maxMintableTokens = incentivesController.maxMintableTokens();
setuped = true;
}
function claim(address _user, address[] calldata _tokens) external {
for (uint i = 0; i < _tokens.length; i++) {
_initiateUserInfo(_user, _tokens[i]);
}
_initiateUserBaseClaimable(_user);
_updateEmissions();
uint256 pending = userBaseClaimable[_user];
userBaseClaimable[_user] = 0;
for (uint i = 0; i < _tokens.length; i++) {
PoolInfo storage pool = poolInfo[_tokens[i]];
require(pool.lastRewardTime != 0, 'pool not registered');
_updatePool(pool, totalAllocPoint);
UserInfo storage user = userInfo[_tokens[i]][_user];
uint256 rewardDebt = user.amount.mul(pool.accRewardPerShare).div(1e12);
pending = pending.add(rewardDebt.sub(user.rewardDebt));
user.rewardDebt = rewardDebt;
}
_mint(_user, pending);
}
function setClaimReceiver(address _user, address _receiver) external {
require(!blacklisted[msg.sender], 'Account blacklisted');
require(msg.sender == _user || msg.sender == owner());
claimReceiver[_user] = _receiver;
emit ClaimReceiverSet(_user, _receiver);
}
function poolLength() external view returns (uint) {
return registeredTokens.length;
}
function claimableReward(
address _user,
address[] calldata _tokens
) external view returns (uint[] memory) {
uint256[] memory claimable = new uint256[](_tokens.length);
for (uint256 i = 0; i < _tokens.length; i++) {
address token = _tokens[i];
PoolInfo memory pool = poolInfo[token];
UserInfo memory user;
if (userInfoInitiated[token][_user]) {
user = userInfo[token][_user];
} else {
IChefIncentivesController.UserInfo memory userInfoPrev = incentivesController.userInfo(
token,
_user
);
user = UserInfo({amount: userInfoPrev.amount, rewardDebt: userInfoPrev.rewardDebt});
}
uint256 accRewardPerShare = pool.accRewardPerShare;
uint256 lpSupply = pool.totalSupply;
if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
uint256 duration = block.timestamp.sub(pool.lastRewardTime);
uint256 reward = duration.mul(rewardsPerSecond).mul(pool.allocPoint).div(totalAllocPoint);
accRewardPerShare = accRewardPerShare.add(reward.mul(1e12).div(lpSupply));
}
claimable[i] = user.amount.mul(accRewardPerShare).div(1e12).sub(user.rewardDebt);
}
return claimable;
}
function _copyEmissionSchedule() internal {
uint256 idx;
do {
try incentivesController.emissionSchedule(idx) returns (
IChefIncentivesController.EmissionPoint memory _point
) {
emissionSchedule.push(EmissionPoint(_point.startTimeOffset, _point.rewardsPerSecond));
idx++;
} catch {
break;
}
} while (true);
}
function _setPoolConfigurator(address _poolConfigurator, bool _isPoolConfigurator) internal {
require(_poolConfigurator != address(0), 'pool configurator address zero');
isPoolConfigurator[_poolConfigurator] = _isPoolConfigurator;
emit PoolConfiguratorSet(_poolConfigurator, _isPoolConfigurator);
}
function _updateEmissions() internal {
uint length = emissionSchedule.length;
if (startTime != 0 && length != 0) {
EmissionPoint memory e = emissionSchedule[length - 1];
if (block.timestamp.sub(startTime) > e.startTimeOffset) {
_massUpdatePools();
rewardsPerSecond = uint(e.rewardsPerSecond);
emissionSchedule.pop();
}
}
}
function _massUpdatePools() internal {
uint totalAP = totalAllocPoint;
uint length = registeredTokens.length;
for (uint i = 0; i < length; ++i) {
_updatePool(poolInfo[registeredTokens[i]], totalAP);
}
}
function _updatePool(PoolInfo storage pool, uint _totalAllocPoint) internal {
if (block.timestamp <= pool.lastRewardTime) {
return;
}
uint lpSupply = pool.totalSupply;
if (lpSupply == 0) {
pool.lastRewardTime = block.timestamp;
return;
}
uint duration = block.timestamp.sub(pool.lastRewardTime);
uint reward = duration.mul(rewardsPerSecond).mul(pool.allocPoint).div(_totalAllocPoint);
pool.accRewardPerShare = pool.accRewardPerShare.add(reward.mul(1e12).div(lpSupply));
pool.lastRewardTime = block.timestamp;
}
function _mint(address _user, uint _amount) internal {
uint minted = mintedTokens;
if (minted.add(_amount) > maxMintableTokens) {
_amount = maxMintableTokens.sub(minted);
}
if (_amount != 0) {
mintedTokens = minted.add(_amount);
address receiver = claimReceiver[_user];
if (receiver == address(0)) receiver = _user;
rewardMinter.mint(receiver, _amount);
}
}
function _initiateUserBaseClaimable(address user) internal {
if (!userBaseClaimableInitiated[user]) {
userBaseClaimable[user] = incentivesController.userBaseClaimable(user);
userBaseClaimableInitiated[user] = true;
}
}
function _initiateUserInfo(address user, address token) internal {
if (!userInfoInitiated[token][user]) {
IChefIncentivesController.UserInfo memory userInfoPrev = incentivesController.userInfo(
token,
user
);
userInfo[token][user] = UserInfo({
amount: userInfoPrev.amount,
rewardDebt: userInfoPrev.rewardDebt
});
userInfoInitiated[token][user] = true;
}
}
}
文件 9 的 11: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());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
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 的 11:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.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 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));
}
}
文件 11 的 11:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
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) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
{
"compilationTarget": {
"contracts/staking/IncentivesControllerV3.sol": "IncentivesControllerV3"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_poolConfigurator","type":"address"},{"internalType":"contract IMultiFeeDistribution","name":"_rewardMinter","type":"address"},{"internalType":"contract IChefIncentivesController","name":"_incentivesController","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AllocPointUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"BalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"}],"name":"ClaimReceiverSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokeen","type":"address"},{"indexed":true,"internalType":"address","name":"onwardIncentives","type":"address"}],"name":"OnwardIncentivesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"configurator","type":"address"},{"indexed":true,"internalType":"bool","name":"isConfigurator","type":"bool"}],"name":"PoolConfiguratorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardMinter","type":"address"}],"name":"RewardMinterSet","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"}],"name":"batchUpdateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"claimableReward","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"emissionSchedule","outputs":[{"internalType":"uint128","name":"startTimeOffset","type":"uint128"},{"internalType":"uint128","name":"rewardsPerSecond","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"}],"name":"handleAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"incentivesController","outputs":[{"internalType":"contract IChefIncentivesController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPoolConfigurator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"contract IOnwardIncentivesController","name":"onwardIncentives","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardMinter","outputs":[{"internalType":"contract IMultiFeeDistribution","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_isBlacklisted","type":"bool"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"setClaimReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"contract IOnwardIncentivesController","name":"_incentives","type":"address"}],"name":"setOnwardIncentives","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolConfigurator","type":"address"},{"internalType":"bool","name":"_isPoolConfigurator","type":"bool"}],"name":"setPoolConfigurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMultiFeeDistribution","name":"_miner","type":"address"}],"name":"setRewardMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userBaseClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]