编译器
0.8.23+commit.f704f362
文件 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 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 的 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:IOracle.sol
pragma solidity 0.8.23;
interface IOracle {
function consult(address tokenIn, uint256 amountIn, address tokenOut) external view returns (uint256 amountOut);
function convertETHToUSDC(uint256 ethAmount) external view returns (uint256 usdAmount);
function convertETHToUSDT(uint256 ethAmount) external view returns (uint256 usdAmount);
function convertUSDCToETH(uint256 usdAmount) external view returns (uint256 ethAmount);
function convertUSDTToETH(uint256 usdAmount) external view returns (uint256 ethAmount);
function convertUSDToETH(uint256 usdAmount) external view returns (uint256 ethAmount);
function ethusd() external view returns (address);
function getAllObservations() external view returns (SlidingWindowOracle.Observation[] memory);
function getFirstObservationInWindow()
external
view
returns (SlidingWindowOracle.Observation memory firstObservation);
function getPriceInETH(uint256 tokenAmount) external view returns (uint256 ethAmount);
function getPriceInUSDC(uint256 tokenAmount) external view returns (uint256 usdAmount);
function getPriceInUSDT(uint256 tokenAmount) external view returns (uint256 usdAmount);
function granularity() external view returns (uint8);
function observationIndexOf(uint256 timestamp) external view returns (uint8 index);
function owner() external view returns (address);
function pair() external view returns (address);
function pairObservations(
uint256
) external view returns (uint256 timestamp, uint256 price0Cumulative, uint256 price1Cumulative);
function periodSize() external view returns (uint256);
function priceFeed() external view returns (address);
function renounceOwnership() external;
function setChainlink(address _feed, bool _isUsing) external;
function token() external view returns (address);
function transferOwnership(address newOwner) external;
function update() external;
function usdcusd() external view returns (address);
function usdtusd() external view returns (address);
function weth() external view returns (address);
function windowSize() external view returns (uint256);
}
interface SlidingWindowOracle {
struct Observation {
uint256 timestamp;
uint256 price0Cumulative;
uint256 price1Cumulative;
}
}
文件 4 的 8:IStaking.sol
pragma solidity 0.8.23;
interface IStaking {
function add(
uint8 _isInputNFT,
uint8 _isVested,
uint256 _allocPoint,
address _input,
uint256 _startIdx,
uint256 _endIdx
) external;
function canWithdraw(uint8 _lid, address _user) external view returns (bool);
function claimReward(uint256 _pid) external;
function deposit(uint256 _pid, uint8 _lid, address _benificiary, uint256[] memory _amounts) external;
function feeWallet() external view returns (address);
function getDepositedIdsOfUser(uint256 _pid, address _user) external view returns (uint256[] memory);
function getRewardPerBlock() external view returns (uint256 rpb);
function massUpdatePools() external;
function onERC721Received(address, address, uint256, bytes memory) external returns (bytes4);
function owner() external view returns (address);
function pendingTkn(uint256 _pid, address _user) external view returns (uint256);
function percPerDay() external view returns (uint16);
function poolInfo(
uint256
)
external
view
returns (
uint8 isInputNFT,
uint8 isVested,
uint32 totalInvestors,
address input,
uint256 allocPoint,
uint256 lastRewardBlock,
uint256 accTknPerShare,
uint256 startIdx,
uint256 endIdx,
uint256 totalDeposit
);
function poolLength() external view returns (uint256);
function poolLockInfo(uint256) external view returns (uint32 multi, uint32 claimFee, uint32 lockPeriodInSeconds);
function renounceOwnership() external;
function reward() external view returns (address);
function rewardWallet() external view returns (address);
function set(uint256 _pid, uint256 _allocPoint, uint8 _isVested, uint256 _startIdx, uint256 _endIdx) external;
function setPercentagePerDay(uint16 _perc) external;
function setPoolLock(uint256 _lid, uint32 _multi, uint32 _claimFee, uint32 _lockPeriod) external;
function setVesting(address _vesting) external;
function setWallets(address _reward, address _feeWallet) external;
function startBlock() external view returns (uint256);
function totalActualDeposit() external view returns (uint256);
function totalAllocPoint() external view returns (uint256);
function transferOwnership(address newOwner) external;
function updatePool(uint256 _pid) external;
function userInfo(
uint256,
address
) external view returns (uint256 totalDeposit, uint256 rewardDebt, uint256 totalClaimed, uint256 depositTime);
function userLockInfo(uint8, address) external view returns (uint256 totalActualDeposit, uint256 depositTime);
function vestingCont() external view returns (address);
function withdraw(uint256 _pid, uint8 _lid, uint256[] memory _amounts) external;
}
文件 5 的 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());
}
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);
}
}
文件 6 的 8:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
modifier whenNotPaused() {
_requireNotPaused();
_;
}
modifier whenPaused() {
_requirePaused();
_;
}
function paused() public view virtual returns (bool) {
return _paused;
}
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 7 的 8:RFRMBonding.sol
pragma solidity 0.8.23;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { Pausable } from "@openzeppelin/contracts/security/Pausable.sol";
import { IStaking } from "./interface/IStaking.sol";
import { IOracle } from "./interface/IOracle.sol";
interface IERC20 {
function decimals() external view returns (uint8);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
interface USDTIERC20 {
function decimals() external view returns (uint8);
function transfer(address to, uint value) external;
function transferFrom(address from, address to, uint value) external;
function approve(address spender, uint value) external;
}
contract RFRMBonding is Ownable, ReentrancyGuard, Pausable {
using Address for address;
IERC20 public immutable rfrm;
uint256 public initialPrice = 0.03 * 10 ** 6;
bool public isDynamicPriceUsed;
uint32 public startTime;
uint32 public limitActiveTill;
uint256 public earlyBuyLimit;
uint256 public totalActualBought;
IStaking public immutable staking;
IOracle public immutable oracle;
IERC20 internal immutable usdc;
USDTIERC20 internal immutable usdt;
address public paymentReceiver;
mapping(uint8 => uint256) public discountPerLock;
mapping(uint8 => bool) public isNotDisabled;
mapping(address => uint256) public totalBought;
mapping(address => bool) public isWhitelisted;
error ContractNotAllowed();
error ZeroAddress();
error InvalidLimit();
error InvalidInput();
error BondNotActive();
error BondDisabled();
error MaxLimitExceeded();
error InsufficientFunds();
error InvalidPaymentToken();
error InvalidBuyAmount();
modifier notContract() {
if ((msg.sender.isContract() || msg.sender != tx.origin) && !isWhitelisted[msg.sender]) {
revert ContractNotAllowed();
}
_;
}
event TokensPurchased(
address indexed user,
uint256 indexed amount,
uint256 indexed price,
address purchaseToken,
uint8 lockId
);
event LimitsChanged(uint32 startTime, uint32 limitActive, uint256 earlyLimit);
event DiscountsChanged(uint8[] lockIds, uint256[] discounts);
event PriceInfoChanged(uint256 newPrice, bool isDynamicUsed);
event ContractStateChanged(bool isPaused);
event PaymentReceiverChanged(address newReceiver);
constructor(
address _rfrm,
address _staking,
address _oracle,
address _usdc,
address _usdt,
address _receiver,
uint32 _startTime,
uint32 _limitActive,
uint256 _earlyLimit
) {
if (_rfrm == address(0) || _staking == address(0) || _oracle == address(0)) {
revert ZeroAddress();
}
rfrm = IERC20(_rfrm);
staking = IStaking(_staking);
oracle = IOracle(_oracle);
usdc = IERC20(_usdc);
usdt = USDTIERC20(_usdt);
paymentReceiver = _receiver;
startTime = _startTime;
limitActiveTill = _limitActive;
earlyBuyLimit = _earlyLimit;
rfrm.approve(address(staking), type(uint256).max);
}
function setLimits(uint32 _startTime, uint32 _limitActive, uint256 _earlyLimit) external onlyOwner {
if (_limitActive < _startTime) {
revert InvalidLimit();
}
limitActiveTill = _limitActive;
earlyBuyLimit = _earlyLimit;
startTime = _startTime;
emit LimitsChanged(_startTime, _limitActive, _earlyLimit);
}
function setDiscounts(uint8[] calldata _lockIds, uint256[] calldata _discounts) external onlyOwner {
if (_lockIds.length != _discounts.length) {
revert InvalidInput();
}
for (uint256 i = 0; i < _lockIds.length; i++) {
discountPerLock[_lockIds[i]] = _discounts[i];
}
emit DiscountsChanged(_lockIds, _discounts);
}
function setWhitelist(address[] calldata _contracts, bool _isWhitelisted) external onlyOwner {
for (uint256 i = 0; i < _contracts.length; i++) {
isWhitelisted[_contracts[i]] = _isWhitelisted;
}
}
function setBondStatus(uint8[] calldata _lockIds, bool[] calldata _isNotDisabled) external onlyOwner {
if (_lockIds.length != _isNotDisabled.length) {
revert InvalidInput();
}
for (uint256 i = 0; i < _lockIds.length; i++) {
isNotDisabled[_lockIds[i]] = _isNotDisabled[i];
}
}
function setPriceInfo(uint256 _newPrice, bool _isDynamicUsed) external onlyOwner {
initialPrice = _newPrice;
isDynamicPriceUsed = _isDynamicUsed;
emit PriceInfoChanged(_newPrice, _isDynamicUsed);
}
function setContractState(bool _isPaused) external onlyOwner {
if (_isPaused) {
_pause();
} else {
_unpause();
}
emit ContractStateChanged(_isPaused);
}
function setReceiver(address _newReceiver) external onlyOwner {
if (_newReceiver == address(0)) {
revert ZeroAddress();
}
paymentReceiver = _newReceiver;
emit PaymentReceiverChanged(_newReceiver);
}
function transferToken(address _token, address _to, uint256 _amount) external onlyOwner {
if (_to == address(0)) {
revert ZeroAddress();
}
if (_token == address(0)) {
Address.sendValue(payable(_to), _amount);
} else {
IERC20(_token).transfer(_to, _amount);
}
}
function buyRFRM(
uint256 _amount,
address _token,
uint8 _lockId
) external payable notContract nonReentrant whenNotPaused {
if (block.timestamp < startTime) {
revert BondNotActive();
}
if (!isNotDisabled[_lockId]) {
revert BondDisabled();
}
if (block.timestamp <= limitActiveTill) {
if (totalBought[msg.sender] + _amount > earlyBuyLimit) {
revert MaxLimitExceeded();
}
}
uint256 price;
uint256 discountedPrice;
if (_token == address(0)) {
discountedPrice = getDiscountedPriceInETH(_lockId, _amount);
if (msg.value < discountedPrice) {
revert InsufficientFunds();
}
Address.sendValue(payable(paymentReceiver), discountedPrice);
if (msg.value > discountedPrice) {
Address.sendValue(payable(msg.sender), msg.value - discountedPrice);
}
} else {
if (_token == address(usdc)) {
discountedPrice = getDiscountedPriceInUSDC(_lockId, _amount);
usdc.transferFrom(msg.sender, paymentReceiver, discountedPrice);
} else if (_token == address(usdt)) {
discountedPrice = getDiscountedPriceInUSDT(_lockId, _amount);
usdt.transferFrom(msg.sender, paymentReceiver, discountedPrice);
} else {
revert InvalidPaymentToken();
}
}
if (discountedPrice <= 0) {
revert InvalidBuyAmount();
}
totalBought[msg.sender] += _amount;
uint256[] memory amt = new uint256[](1);
amt[0] = _amount;
staking.deposit(0, _lockId, msg.sender, amt);
totalActualBought += _amount;
emit TokensPurchased(msg.sender, _amount, price, _token, _lockId);
}
function getDiscountedPriceInETH(uint8 _lockId, uint256 _amount) public view returns (uint256 discountedPrice) {
uint256 price = isDynamicPriceUsed
? oracle.getPriceInETH(_amount)
: oracle.convertUSDToETH((initialPrice * _amount) / 10 ** rfrm.decimals());
discountedPrice = price - ((price * discountPerLock[_lockId]) / 10000);
}
function getDiscountedPriceInUSDT(uint8 _lockId, uint256 _amount) public view returns (uint256 discountedPrice) {
uint256 price = isDynamicPriceUsed
? oracle.getPriceInUSDT(_amount)
: (initialPrice * _amount) / 10 ** rfrm.decimals();
discountedPrice = price - ((price * discountPerLock[_lockId]) / 10000);
}
function getDiscountedPriceInUSDC(uint8 _lockId, uint256 _amount) public view returns (uint256 discountedPrice) {
uint256 price = isDynamicPriceUsed
? oracle.getPriceInUSDC(_amount)
: (initialPrice * _amount) / 10 ** rfrm.decimals();
discountedPrice = price - ((price * discountPerLock[_lockId]) / 10000);
}
}
文件 8 的 8: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;
}
}
{
"compilationTarget": {
"src/RFRMBonding.sol": "RFRMBonding"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": [
":@chainlink/=lib/chainlink/",
":@openzeppelin/=lib/openzeppelin-contracts/",
":@prb/test/=lib/prb-test/src/",
":@uniswap/=node_modules/@uniswap/",
":chainlink/=lib/chainlink/integration-tests/contracts/ethereum/src/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":prb-test/=lib/prb-test/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_rfrm","type":"address"},{"internalType":"address","name":"_staking","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint32","name":"_startTime","type":"uint32"},{"internalType":"uint32","name":"_limitActive","type":"uint32"},{"internalType":"uint256","name":"_earlyLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BondDisabled","type":"error"},{"inputs":[],"name":"BondNotActive","type":"error"},{"inputs":[],"name":"ContractNotAllowed","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidBuyAmount","type":"error"},{"inputs":[],"name":"InvalidInput","type":"error"},{"inputs":[],"name":"InvalidLimit","type":"error"},{"inputs":[],"name":"InvalidPaymentToken","type":"error"},{"inputs":[],"name":"MaxLimitExceeded","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isPaused","type":"bool"}],"name":"ContractStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8[]","name":"lockIds","type":"uint8[]"},{"indexed":false,"internalType":"uint256[]","name":"discounts","type":"uint256[]"}],"name":"DiscountsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"startTime","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"limitActive","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"earlyLimit","type":"uint256"}],"name":"LimitsChanged","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newReceiver","type":"address"}],"name":"PaymentReceiverChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isDynamicUsed","type":"bool"}],"name":"PriceInfoChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"purchaseToken","type":"address"},{"indexed":false,"internalType":"uint8","name":"lockId","type":"uint8"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_lockId","type":"uint8"}],"name":"buyRFRM","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"discountPerLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlyBuyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_lockId","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getDiscountedPriceInETH","outputs":[{"internalType":"uint256","name":"discountedPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_lockId","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getDiscountedPriceInUSDC","outputs":[{"internalType":"uint256","name":"discountedPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_lockId","type":"uint8"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getDiscountedPriceInUSDT","outputs":[{"internalType":"uint256","name":"discountedPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDynamicPriceUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"isNotDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitActiveTill","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rfrm","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_lockIds","type":"uint8[]"},{"internalType":"bool[]","name":"_isNotDisabled","type":"bool[]"}],"name":"setBondStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"setContractState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_lockIds","type":"uint8[]"},{"internalType":"uint256[]","name":"_discounts","type":"uint256[]"}],"name":"setDiscounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_startTime","type":"uint32"},{"internalType":"uint32","name":"_limitActive","type":"uint32"},{"internalType":"uint256","name":"_earlyLimit","type":"uint256"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"},{"internalType":"bool","name":"_isDynamicUsed","type":"bool"}],"name":"setPriceInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newReceiver","type":"address"}],"name":"setReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_contracts","type":"address[]"},{"internalType":"bool","name":"_isWhitelisted","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"contract IStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalActualBought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalBought","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":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]