编译器
0.8.20+commit.a1b79de6
文件 1 的 9: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 的 9:BoringERC20.sol
pragma solidity ^0.8.7;
import "./IBoringERC20.sol";
library BoringERC20 {
bytes4 private constant SIG_SYMBOL = 0x95d89b41;
bytes4 private constant SIG_NAME = 0x06fdde03;
bytes4 private constant SIG_DECIMALS = 0x313ce567;
bytes4 private constant SIG_TRANSFER = 0xa9059cbb;
bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd;
function returnDataToString(bytes memory data)
internal
pure
returns (string memory)
{
if (data.length >= 64) {
return abi.decode(data, (string));
} else if (data.length == 32) {
uint8 i = 0;
while (i < 32 && data[i] != 0) {
i++;
}
bytes memory bytesArray = new bytes(i);
for (i = 0; i < 32 && data[i] != 0; i++) {
bytesArray[i] = data[i];
}
return string(bytesArray);
} else {
return "???";
}
}
function safeSymbol(IBoringERC20 token)
internal
view
returns (string memory)
{
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_SYMBOL)
);
return success ? returnDataToString(data) : "???";
}
function safeName(IBoringERC20 token)
internal
view
returns (string memory)
{
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_NAME)
);
return success ? returnDataToString(data) : "???";
}
function safeDecimals(IBoringERC20 token) internal view returns (uint8) {
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_DECIMALS)
);
return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
}
function safeTransfer(
IBoringERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(SIG_TRANSFER, to, amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"BoringERC20: Transfer failed"
);
}
function safeTransferFrom(
IBoringERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"BoringERC20: TransferFrom failed"
);
}
}
文件 3 的 9: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;
}
}
文件 4 的 9:EsComplexRewarder.sol
pragma solidity ^0.8.2;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./IEsRewarder.sol";
import "../IBasedDistributorV2.sol";
import "../libraries/BoringERC20.sol";
contract EsComplexRewarder is IEsRewarder, Ownable, ReentrancyGuard {
using BoringERC20 for IBoringERC20;
bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd;
IBoringERC20 public immutable override rewardToken;
IBasedDistributorV2 public immutable distributorV2;
bool public immutable isNative;
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
uint256 accTokenPerShare;
uint256 startTimestamp;
uint256 lastRewardTimestamp;
uint256 totalRewards;
}
struct RewardInfo {
uint256 startTimestamp;
uint256 endTimestamp;
uint256 rewardPerSec;
}
mapping(uint256 => PoolInfo) public poolInfo;
mapping(uint256 => RewardInfo[]) public poolRewardInfo;
uint256[] public poolIds;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 public immutable rewardInfoLimit = 52;
uint256 private immutable ACC_TOKEN_PRECISION;
event OnReward(address indexed user, uint256 amount);
event RewardRateUpdated(uint256 oldRate, uint256 newRate);
event AddPool(uint256 indexed pid);
event UpdatePool(
uint256 indexed pid,
uint256 lastRewardTimestamp,
uint256 lpSupply,
uint256 accTokenPerShare
);
event AddRewardInfo(
uint256 indexed pid,
uint256 indexed phase,
uint256 endTimestamp,
uint256 rewardPerSec
);
modifier onlyDistributorV2() {
require(
msg.sender == address(distributorV2),
"onlyDistributorV2: only DistributorV2 can call this function"
);
_;
}
constructor(
IBoringERC20 _rewardToken,
IBasedDistributorV2 _distributorV2,
bool _isNative
) {
require(
Address.isContract(address(_rewardToken)),
"constructor: reward token must be a valid contract"
);
require(
Address.isContract(address(_distributorV2)),
"constructor: BasedDistributorV2 must be a valid contract"
);
rewardToken = _rewardToken;
distributorV2 = _distributorV2;
isNative = _isNative;
uint256 decimalsRewardToken = uint256(
_isNative ? 18 : _rewardToken.safeDecimals()
);
require(
decimalsRewardToken < 30,
"constructor: reward token decimals must be inferior to 30"
);
ACC_TOKEN_PRECISION = uint256(
10**(uint256(30) - (decimalsRewardToken))
);
}
function add(uint256 _pid, uint256 _startTimestamp) public onlyOwner {
require(poolInfo[_pid].lastRewardTimestamp == 0, "pool already exists");
poolInfo[_pid] = PoolInfo({
startTimestamp: _startTimestamp,
lastRewardTimestamp: _startTimestamp,
accTokenPerShare: 0,
totalRewards: 0
});
poolIds.push(_pid);
emit AddPool(_pid);
}
function addRewardInfo(
uint256 _pid,
uint256 _endTimestamp,
uint256 _rewardPerSec
) external payable onlyOwner {
RewardInfo[] storage rewardInfo = poolRewardInfo[_pid];
PoolInfo storage pool = poolInfo[_pid];
require(
rewardInfo.length < rewardInfoLimit,
"add reward info: reward info length exceeds the limit"
);
require(
rewardInfo.length == 0 ||
rewardInfo[rewardInfo.length - 1].endTimestamp < _endTimestamp,
"add reward info: bad new endTimestamp"
);
uint256 startTimestamp = rewardInfo.length == 0
? pool.startTimestamp
: rewardInfo[rewardInfo.length - 1].endTimestamp;
uint256 timeRange = _endTimestamp - startTimestamp;
uint256 totalRewards = timeRange * _rewardPerSec;
if (!isNative) {
_safeTransferFrom(rewardToken, msg.sender, address(this), totalRewards);
} else {
require(
msg.value == totalRewards,
"add reward info: not enough funds to transfer"
);
}
pool.totalRewards += totalRewards;
rewardInfo.push(
RewardInfo({
startTimestamp: startTimestamp,
endTimestamp: _endTimestamp,
rewardPerSec: _rewardPerSec
})
);
emit AddRewardInfo(
_pid,
rewardInfo.length - 1,
_endTimestamp,
_rewardPerSec
);
}
function _endTimestampOf(uint256 _pid, uint256 _timestamp)
internal
view
returns (uint256)
{
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
uint256 len = rewardInfo.length;
if (len == 0) {
return 0;
}
for (uint256 i = 0; i < len; ++i) {
if (_timestamp <= rewardInfo[i].endTimestamp)
return rewardInfo[i].endTimestamp;
}
return rewardInfo[len - 1].endTimestamp;
}
function currentEndTimestamp(uint256 _pid) external view returns (uint256) {
return _endTimestampOf(_pid, block.timestamp);
}
function _getTimeElapsed(
uint256 _from,
uint256 _to,
uint256 _endTimestamp
) public pure returns (uint256) {
if ((_from >= _endTimestamp) || (_from > _to)) {
return 0;
}
if (_to <= _endTimestamp) {
return _to - _from;
}
return _endTimestamp - _from;
}
function updatePool(uint256 _pid)
external
nonReentrant
returns (PoolInfo memory pool)
{
return _updatePool(_pid);
}
function _updatePool(uint256 pid) public returns (PoolInfo memory pool) {
pool = poolInfo[pid];
RewardInfo[] memory rewardInfo = poolRewardInfo[pid];
if (block.timestamp <= pool.lastRewardTimestamp) {
return pool;
}
uint256 lpSupply = distributorV2.poolTotalLp(pid);
if (lpSupply == 0) {
if (block.timestamp > _endTimestampOf(pid, block.timestamp)) {
pool.lastRewardTimestamp = block.timestamp;
emit UpdatePool(
pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accTokenPerShare
);
}
return pool;
}
for (uint256 i = 0; i < rewardInfo.length; ++i) {
uint256 timeElapsed = _getTimeElapsed(
pool.lastRewardTimestamp,
block.timestamp,
rewardInfo[i].endTimestamp
);
if (timeElapsed == 0) continue;
if (block.timestamp > rewardInfo[i].endTimestamp) {
pool.lastRewardTimestamp = rewardInfo[i].endTimestamp;
} else {
pool.lastRewardTimestamp = block.timestamp;
}
uint256 tokenReward = (timeElapsed * rewardInfo[i].rewardPerSec);
pool.accTokenPerShare += ((tokenReward * ACC_TOKEN_PRECISION) /
lpSupply);
}
poolInfo[pid] = pool;
emit UpdatePool(
pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accTokenPerShare
);
return pool;
}
function massUpdatePools() public nonReentrant {
_massUpdatePools();
}
function _massUpdatePools() internal {
uint256 length = poolIds.length;
for (uint256 pid = 0; pid < length; ++pid) {
_updatePool(poolIds[pid]);
}
}
function onReward(
uint256 _pid,
address _user,
uint256 _amount
) external override onlyDistributorV2 nonReentrant {
PoolInfo memory pool = _updatePool(_pid);
UserInfo storage user = userInfo[_pid][_user];
uint256 pending = 0;
uint256 rewardBalance = 0;
if (isNative) {
rewardBalance = address(this).balance;
} else {
rewardBalance = rewardToken.balanceOf(address(this));
}
if (user.amount > 0) {
pending = (((user.amount * pool.accTokenPerShare) /
ACC_TOKEN_PRECISION) - user.rewardDebt);
if (pending > 0) {
if (isNative) {
if (pending > rewardBalance) {
(bool success, ) = _user.call{value: rewardBalance}("");
require(success, "Transfer failed");
} else {
(bool success, ) = _user.call{value: pending}("");
require(success, "Transfer failed");
}
} else {
if (pending > rewardBalance) {
rewardToken.safeTransfer(_user, rewardBalance);
} else {
rewardToken.safeTransfer(_user, pending);
}
}
}
}
user.amount = _amount;
user.rewardDebt =
(user.amount * pool.accTokenPerShare) /
ACC_TOKEN_PRECISION;
emit OnReward(_user, pending);
}
function pendingTokens(uint256 _pid, address _user)
external
view
override
returns (uint256)
{
return
_pendingTokens(
_pid,
userInfo[_pid][_user].amount,
userInfo[_pid][_user].rewardDebt
);
}
function _pendingTokens(
uint256 _pid,
uint256 _amount,
uint256 _rewardDebt
) internal view returns (uint256 pending) {
PoolInfo memory pool = poolInfo[_pid];
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
uint256 accTokenPerShare = pool.accTokenPerShare;
uint256 lpSupply = distributorV2.poolTotalLp(_pid);
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 cursor = pool.lastRewardTimestamp;
for (uint256 i = 0; i < rewardInfo.length; ++i) {
uint256 timeElapsed = _getTimeElapsed(
cursor,
block.timestamp,
rewardInfo[i].endTimestamp
);
if (timeElapsed == 0) continue;
cursor = rewardInfo[i].endTimestamp;
uint256 tokenReward = (timeElapsed *
rewardInfo[i].rewardPerSec);
accTokenPerShare +=
(tokenReward * ACC_TOKEN_PRECISION) /
lpSupply;
}
}
pending = (((_amount * accTokenPerShare) / ACC_TOKEN_PRECISION) -
_rewardDebt);
}
function _rewardPerSecOf(uint256 _pid, uint256 _blockTimestamp)
internal
view
returns (uint256)
{
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
PoolInfo storage pool = poolInfo[_pid];
uint256 len = rewardInfo.length;
if (len == 0) {
return 0;
}
if (pool.startTimestamp > _blockTimestamp) {
return 0;
}
for (uint256 i = 0; i < len; ++i) {
if (_blockTimestamp <= rewardInfo[i].endTimestamp)
return rewardInfo[i].rewardPerSec;
}
return 0;
}
function poolRewardsPerSec(uint256 _pid)
external
view
override
returns (uint256)
{
return _rewardPerSecOf(_pid, block.timestamp);
}
function emergencyRewardWithdraw(
uint256 _pid,
uint256 _amount,
address _beneficiary
) external onlyOwner nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
uint256 lpSupply = distributorV2.poolTotalLp(_pid);
uint256 currentStakingPendingReward = _pendingTokens(_pid, lpSupply, 0);
require(
currentStakingPendingReward + _amount <= pool.totalRewards,
"emergency reward withdraw: not enough reward token"
);
pool.totalRewards -= _amount;
if (!isNative) {
rewardToken.safeTransfer(_beneficiary, _amount);
} else {
(bool sent, ) = _beneficiary.call{value: _amount}("");
require(sent, "emergency reward withdraw: failed to send");
}
}
function emergencyWithdraw(
uint256 _amount,
address _beneficiary
) external onlyOwner nonReentrant {
if (!isNative) {
rewardToken.safeTransfer(_beneficiary, _amount);
} else {
(bool sent, ) = _beneficiary.call{value: _amount}("");
require(sent, "emergency withdraw: failed to send");
}
}
function _safeTransferFrom(
IBoringERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"BoringERC20: TransferFrom failed"
);
}
}
文件 5 的 9:IBasedDistributorV2.sol
pragma solidity ^0.8.2;
interface IBasedDistributorV2 {
function totalAllocPoint() external view returns (uint256);
function deposit(uint256 _pid, uint256 _amount) external;
function poolLength() external view returns (uint256);
function poolTotalLp(uint256 pid) external view returns (uint256);
}
文件 6 的 9:IBoringERC20.sol
pragma solidity ^0.8.7;
interface IBoringERC20 {
function mint(address to, uint256 amount) external;
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, 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
);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}
文件 7 的 9:IEsRewarder.sol
pragma solidity ^0.8.7;
import "../libraries/IBoringERC20.sol";
interface IEsRewarder {
function onReward(
uint256 pid,
address user,
uint256 newLpAmount
) external;
function pendingTokens(uint256 pid, address user)
external
view
returns (uint256 pending);
function rewardToken() external view returns (IBoringERC20);
function poolRewardsPerSec(uint256 pid) external view returns (uint256);
}
文件 8 的 9: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);
}
}
文件 9 的 9:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
{
"compilationTarget": {
"contracts/farm/v2/rewarders/EsComplexRewarder.sol": "EsComplexRewarder"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 999999
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IBoringERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IBasedDistributorV2","name":"_distributorV2","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"phase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"name":"AddRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnReward","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":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"_getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"_updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct EsComplexRewarder.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardPerSec","type":"uint256"}],"name":"addRewardInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"currentEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorV2","outputs":[{"internalType":"contract IBasedDistributorV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfo","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardInfoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct EsComplexRewarder.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]