编译器
0.8.10+commit.fc410830
文件 1 的 8: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 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 的 8: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 的 8:IArbswapToken.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IArbswapToken is IERC20 {
function mintByLiquidityMining(address _to, uint256 _amount) external;
function mintByStaking(address _to, uint256 _amount) external;
function mintByMiner(address _to, uint256 _amount) external;
}
文件 4 的 8: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 的 8:IVestingMaster.sol
pragma solidity ^0.8.0;
interface IVestingMaster {
struct LockedReward {
uint256 locked;
uint256 timestamp;
}
event Lock(address indexed user, uint256 amount);
event Claim(address indexed user, uint256 amount);
function lock(address, uint256) external;
function claim() external;
function period() external view returns (uint256);
function lockedPeriodAmount() external view returns (uint256);
function vestingToken() external view returns (address);
function userLockedRewards(address account, uint256 idx) external view returns (uint256, uint256);
function totalLockedRewards() external view returns (uint256);
function getVestingAmount() external view returns (uint256, uint256);
}
文件 6 的 8:MasterChefV3.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./interfaces/IArbswapToken.sol";
import "./interfaces/IVestingMaster.sol";
contract MasterChefV3 is Ownable {
using SafeERC20 for IERC20;
struct UserInfo {
uint256 amount;
uint256 boostAmount;
uint256 rewardDebt;
uint256 lockStartTime;
uint256 lockEndTime;
}
struct PoolInfo {
IERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardTime;
uint256 accArbsPerShare;
bool lock;
uint256 maxLockDuration;
uint256 minLockDuration;
uint256 durationFactor;
uint256 boostWeight;
uint256 boostAmount;
}
IArbswapToken public ARBS;
IVestingMaster public Vesting;
address public devaddr;
uint256 public arbsPerSecond;
uint256 public constant maxArbsPerSecond = 100e18;
uint256 public constant MaxAllocPoint = 40000000000000;
uint256 public constant PRECISION = 1e12;
uint256 public constant MAX_BOOST_WEIGHT = 50e12;
uint256 public constant MIN_BOOST_WEIGHT = 1e12;
PoolInfo[] public poolInfo;
mapping(uint256 => bool) isWhitelistPool;
mapping(address => bool) public LPTokenAdded;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 public totalAllocPoint = 0;
uint256 public immutable startTime;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event DepositLockPool(
address indexed user,
uint256 indexed pid,
uint256 amount,
uint256 boostAmount,
uint256 start,
uint256 end
);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event NewVesting(address indexed vesting);
event Harvest(address indexed user, uint256 pid, uint256 pending);
event NewArbsPerSecond(uint256 arbsPerSecond);
event NewWhitelist(uint256 pid, bool valid);
constructor(
IArbswapToken _arbs,
address _devaddr,
uint256 _arbsPerSecond,
uint256 _startTime
) {
ARBS = _arbs;
devaddr = _devaddr;
arbsPerSecond = _arbsPerSecond;
startTime = _startTime;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function setVesting(address _vesting) external onlyOwner {
Vesting = IVestingMaster(_vesting);
emit NewVesting(_vesting);
}
function setWhitelistPool(uint256 _pid, bool _isValid) external onlyOwner {
isWhitelistPool[_pid] = _isValid;
emit NewWhitelist(_pid, _isValid);
}
function setArbsPerSecond(uint256 _arbsPerSecond, bool _withUpdate) external onlyOwner {
require(_arbsPerSecond <= maxArbsPerSecond, "setArbsPerSecond: too many arbs!");
if (_withUpdate) {
massUpdatePools();
}
arbsPerSecond = _arbsPerSecond;
emit NewArbsPerSecond(_arbsPerSecond);
}
function add(
uint256 _allocPoint,
IERC20 _lpToken,
bool _withUpdate,
bool _lock,
uint256 _maxLockDuration,
uint256 _minLockDuration,
uint256 _durationFactor,
uint256 _boostWeight
) external onlyOwner {
require(_allocPoint <= MaxAllocPoint, "add: too many alloc points!!");
if (_lock) {
require(
_boostWeight >= MIN_BOOST_WEIGHT && _boostWeight <= MAX_BOOST_WEIGHT,
"_boostWeight must be between MIN_BOOST_WEIGHT and MAX_BOOST_WEIGHT"
);
require(_minLockDuration > 0 && _maxLockDuration > _minLockDuration, "Invalid duration");
require(_durationFactor > 0, "_durationFactor can not be zero");
}
require(!LPTokenAdded[address(_lpToken)], "Pool already exists!!!!");
LPTokenAdded[address(_lpToken)] = true;
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardTime = block.timestamp > startTime ? block.timestamp : startTime;
totalAllocPoint += _allocPoint;
poolInfo.push(
PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardTime: lastRewardTime,
accArbsPerShare: 0,
lock: _lock,
maxLockDuration: _maxLockDuration,
minLockDuration: _minLockDuration,
durationFactor: _durationFactor,
boostWeight: _boostWeight,
boostAmount: 0
})
);
}
function set(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external onlyOwner {
require(_allocPoint <= MaxAllocPoint, "add: too many alloc points!!");
if (_withUpdate) {
massUpdatePools();
}
totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint;
poolInfo[_pid].allocPoint = _allocPoint;
}
function set(
uint256 _pid,
bool _withUpdate,
uint256 _maxLockDuration,
uint256 _minLockDuration,
uint256 _durationFactor,
uint256 _boostWeight
) external onlyOwner {
PoolInfo storage pool = poolInfo[_pid];
require(pool.lock, "Not lock pool");
require(
_boostWeight >= MIN_BOOST_WEIGHT && _boostWeight <= MAX_BOOST_WEIGHT,
"_boostWeight must be between MIN_BOOST_WEIGHT and MAX_BOOST_WEIGHT"
);
require(_minLockDuration > 0 && _maxLockDuration > _minLockDuration, "Invalid duration");
require(_durationFactor > 0, "_durationFactor can not be zero");
if (_withUpdate) {
massUpdatePools();
}
pool.maxLockDuration = _maxLockDuration;
pool.minLockDuration = _minLockDuration;
pool.durationFactor = _durationFactor;
pool.boostWeight = _boostWeight;
}
function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) {
_from = _from > startTime ? _from : startTime;
if (_to < startTime) {
return 0;
}
return _to - _from;
}
function pendingARBS(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accArbsPerShare = pool.accArbsPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (pool.lock) {
lpSupply = pool.boostAmount;
}
if (block.timestamp > pool.lastRewardTime && lpSupply != 0) {
uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
uint256 arbsReward = (multiplier * arbsPerSecond * (pool.allocPoint)) / totalAllocPoint;
accArbsPerShare += (arbsReward * PRECISION) / lpSupply;
}
if (pool.lock) {
return (user.boostAmount * accArbsPerShare) / PRECISION - user.rewardDebt;
} else {
return (user.amount * accArbsPerShare) / PRECISION - user.rewardDebt;
}
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTime) {
return;
}
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (lpSupply == 0) {
pool.lastRewardTime = block.timestamp;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardTime, block.timestamp);
uint256 arbsReward = (multiplier * arbsPerSecond * pool.allocPoint) / totalAllocPoint;
ARBS.mintByLiquidityMining(devaddr, arbsReward / 10);
ARBS.mintByLiquidityMining(address(this), arbsReward);
if (pool.lock) {
lpSupply = pool.boostAmount;
}
pool.accArbsPerShare += (arbsReward * PRECISION) / lpSupply;
pool.lastRewardTime = block.timestamp;
}
function depositFlexible(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(!pool.lock, "Lock pool");
updatePool(_pid);
uint256 pending = (user.amount * pool.accArbsPerShare) / PRECISION - user.rewardDebt;
user.amount += _amount;
user.rewardDebt = (user.amount * pool.accArbsPerShare) / PRECISION;
if (pending > 0) {
safeArbsTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
}
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
emit Deposit(msg.sender, _pid, _amount);
}
function depositLocked(
uint256 _pid,
uint256 _amount,
uint256 _duration
) public {
PoolInfo storage pool = poolInfo[_pid];
require(pool.lock, "Not lock pool");
UserInfo storage user = userInfo[_pid][msg.sender];
if (user.amount > 0) {
require(_amount > 0 || _duration > 0, "_amount and _duration can not be zero at the same time");
} else {
require(_amount > 0 && _duration > 0, "_amount and _duration can not be zero");
}
updatePool(_pid);
uint256 totalLockDuration = _duration;
if (user.lockEndTime >= block.timestamp) {
if (_amount > 0) {
user.lockStartTime = block.timestamp;
}
totalLockDuration += user.lockEndTime - user.lockStartTime;
} else {
user.lockStartTime = block.timestamp;
}
if (totalLockDuration < pool.minLockDuration) {
totalLockDuration = pool.minLockDuration;
}
if (totalLockDuration > pool.maxLockDuration) {
totalLockDuration = pool.maxLockDuration;
}
user.lockEndTime = user.lockStartTime + totalLockDuration;
uint256 pending = (user.boostAmount * pool.accArbsPerShare) / PRECISION - user.rewardDebt;
pool.boostAmount -= user.boostAmount;
user.amount += _amount;
user.boostAmount = (user.amount * totalLockDuration * pool.boostWeight) / pool.durationFactor / PRECISION;
user.rewardDebt = (user.boostAmount * pool.accArbsPerShare) / PRECISION;
pool.boostAmount += user.boostAmount;
if (pending > 0) {
safeArbsTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
}
pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
emit DepositLockPool(msg.sender, _pid, _amount, user.boostAmount, user.lockStartTime, user.lockEndTime);
}
function harvest(uint256 _pid) external {
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount > 0, "No LP");
PoolInfo storage pool = poolInfo[_pid];
updatePool(_pid);
uint256 userReward;
if (pool.lock) {
userReward = (user.boostAmount * pool.accArbsPerShare) / PRECISION;
} else {
userReward = (user.amount * pool.accArbsPerShare) / PRECISION;
}
uint256 pending = userReward - user.rewardDebt;
user.rewardDebt = userReward;
if (pending > 0) {
safeArbsTransfer(msg.sender, pending);
}
emit Harvest(msg.sender, _pid, pending);
}
function withdraw(uint256 _pid, uint256 _amount) public {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
if (pool.lock) {
require(user.lockEndTime < block.timestamp, "Still in lock");
}
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending;
if (pool.lock) {
pending = (user.boostAmount * pool.accArbsPerShare) / PRECISION - user.rewardDebt;
pool.boostAmount -= user.boostAmount;
} else {
pending = (user.amount * pool.accArbsPerShare) / PRECISION - user.rewardDebt;
}
user.amount -= _amount;
if (pool.lock) {
user.boostAmount = user.amount;
pool.boostAmount += user.boostAmount;
user.lockStartTime = 0;
user.lockEndTime = 0;
}
user.rewardDebt = (user.amount * pool.accArbsPerShare) / PRECISION;
if (pending > 0) {
safeArbsTransfer(msg.sender, pending);
emit Harvest(msg.sender, _pid, pending);
}
pool.lpToken.safeTransfer(address(msg.sender), _amount);
emit Withdraw(msg.sender, _pid, _amount);
}
function emergencyWithdraw(uint256 _pid) public {
require(isWhitelistPool[_pid], "Not whitelist");
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 withdrawAmount = user.amount;
user.amount = 0;
user.rewardDebt = 0;
pool.lpToken.safeTransfer(address(msg.sender), withdrawAmount);
emit EmergencyWithdraw(msg.sender, _pid, withdrawAmount);
}
function safeArbsTransfer(address _to, uint256 _amount) internal {
uint256 arbsBal = ARBS.balanceOf(address(this));
uint256 amount = _amount;
if (_amount > arbsBal) {
amount = arbsBal;
}
if (address(Vesting) != address(0)) {
IERC20(address(ARBS)).safeTransfer(address(Vesting), amount);
Vesting.lock(msg.sender, amount);
} else {
IERC20(address(ARBS)).safeTransfer(_to, amount);
}
}
function dev(address _devaddr) public {
require(msg.sender == devaddr, "dev: wut?");
devaddr = _devaddr;
}
}
文件 7 的 8: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);
}
}
文件 8 的 8: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");
}
}
}
{
"compilationTarget": {
"contracts/MasterChefV3.sol": "MasterChefV3"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 999999
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IArbswapToken","name":"_arbs","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"uint256","name":"_arbsPerSecond","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boostAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"DepositLockPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pending","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"arbsPerSecond","type":"uint256"}],"name":"NewArbsPerSecond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vesting","type":"address"}],"name":"NewVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"bool","name":"valid","type":"bool"}],"name":"NewWhitelist","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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ARBS","outputs":[{"internalType":"contract IArbswapToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LPTokenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BOOST_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BOOST_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Vesting","outputs":[{"internalType":"contract IVestingMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"bool","name":"_lock","type":"bool"},{"internalType":"uint256","name":"_maxLockDuration","type":"uint256"},{"internalType":"uint256","name":"_minLockDuration","type":"uint256"},{"internalType":"uint256","name":"_durationFactor","type":"uint256"},{"internalType":"uint256","name":"_boostWeight","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"arbsPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositFlexible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"depositLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxArbsPerSecond","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":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingARBS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTime","type":"uint256"},{"internalType":"uint256","name":"accArbsPerShare","type":"uint256"},{"internalType":"bool","name":"lock","type":"bool"},{"internalType":"uint256","name":"maxLockDuration","type":"uint256"},{"internalType":"uint256","name":"minLockDuration","type":"uint256"},{"internalType":"uint256","name":"durationFactor","type":"uint256"},{"internalType":"uint256","name":"boostWeight","type":"uint256"},{"internalType":"uint256","name":"boostAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"},{"internalType":"uint256","name":"_maxLockDuration","type":"uint256"},{"internalType":"uint256","name":"_minLockDuration","type":"uint256"},{"internalType":"uint256","name":"_durationFactor","type":"uint256"},{"internalType":"uint256","name":"_boostWeight","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arbsPerSecond","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setArbsPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vesting","type":"address"}],"name":"setVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_isValid","type":"bool"}],"name":"setWhitelistPool","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":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"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":"boostAmount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"lockStartTime","type":"uint256"},{"internalType":"uint256","name":"lockEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]