Latest 25 from a total of 273 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Buy RFRM | 21894775 | 342 days ago | IN | 0.04427331 ETH | 0.00065254 | ||||
| Buy RFRM | 21837938 | 350 days ago | IN | 0.00000002 ETH | 0.00069921 | ||||
| Buy RFRM | 21817521 | 353 days ago | IN | 0.00002887 ETH | 0.00052489 | ||||
| Buy RFRM | 21795698 | 356 days ago | IN | 0.1 ETH | 0.00112165 | ||||
| Buy RFRM | 21672776 | 373 days ago | IN | 0.29 ETH | 0.00079867 | ||||
| Buy RFRM | 21538050 | 392 days ago | IN | 0.27115615 ETH | 0.00453821 | ||||
| Buy RFRM | 21348252 | 418 days ago | IN | 0.055 ETH | 0.00427415 | ||||
| Buy RFRM | 21348227 | 418 days ago | IN | 0.0616633 ETH | 0.00412057 | ||||
| Buy RFRM | 21311005 | 424 days ago | IN | 0 ETH | 0.00537321 | ||||
| Buy RFRM | 21079065 | 456 days ago | IN | 0.94 ETH | 0.01016457 | ||||
| Buy RFRM | 21021888 | 464 days ago | IN | 2 ETH | 0.00518561 | ||||
| Buy RFRM | 20960459 | 472 days ago | IN | 0 ETH | 0.00327167 | ||||
| Buy RFRM | 20944459 | 475 days ago | IN | 1.6 ETH | 0.00446799 | ||||
| Buy RFRM | 20935911 | 476 days ago | IN | 0.00000001 ETH | 0.01083557 | ||||
| Buy RFRM | 20930777 | 477 days ago | IN | 0 ETH | 0.00883656 | ||||
| Buy RFRM | 20929103 | 477 days ago | IN | 0 ETH | 0.01906246 | ||||
| Buy RFRM | 20913426 | 479 days ago | IN | 0 ETH | 0.00574099 | ||||
| Buy RFRM | 20908226 | 480 days ago | IN | 0.05 ETH | 0.00263808 | ||||
| Buy RFRM | 20901161 | 481 days ago | IN | 0 ETH | 0.00480506 | ||||
| Buy RFRM | 20901152 | 481 days ago | IN | 1.3 ETH | 0.00419304 | ||||
| Buy RFRM | 20763475 | 500 days ago | IN | 0.04 ETH | 0.00752284 | ||||
| Buy RFRM | 20754055 | 501 days ago | IN | 0 ETH | 0.00047241 | ||||
| Buy RFRM | 20743371 | 503 days ago | IN | 0 ETH | 0.00180844 | ||||
| Buy RFRM | 20728157 | 505 days ago | IN | 0.00000001 ETH | 0.00354292 | ||||
| Buy RFRM | 20722463 | 506 days ago | IN | 0 ETH | 0.00221172 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 21894775 | 342 days ago | 0.00000018 ETH | ||||
| Transfer | 21894775 | 342 days ago | 0.04427312 ETH | ||||
| Transfer | 21837938 | 350 days ago | 0 ETH | ||||
| Transfer | 21837938 | 350 days ago | 0.00000002 ETH | ||||
| Transfer | 21817521 | 353 days ago | 0 ETH | ||||
| Transfer | 21817521 | 353 days ago | 0.00002887 ETH | ||||
| Transfer | 21795698 | 356 days ago | 0.00000044 ETH | ||||
| Transfer | 21795698 | 356 days ago | 0.09999955 ETH | ||||
| Transfer | 21538050 | 392 days ago | 0.00000018 ETH | ||||
| Transfer | 21538050 | 392 days ago | 0.27115597 ETH | ||||
| Transfer | 21348252 | 418 days ago | 0.00000018 ETH | ||||
| Transfer | 21348252 | 418 days ago | 0.05499981 ETH | ||||
| Transfer | 21348227 | 418 days ago | 0.00000041 ETH | ||||
| Transfer | 21348227 | 418 days ago | 0.06166288 ETH | ||||
| Transfer | 21079065 | 456 days ago | 0.00000954 ETH | ||||
| Transfer | 21079065 | 456 days ago | 0.93999045 ETH | ||||
| Transfer | 21021888 | 464 days ago | 0.00009778 ETH | ||||
| Transfer | 21021888 | 464 days ago | 1.99990221 ETH | ||||
| Transfer | 20944459 | 475 days ago | 0.00001083 ETH | ||||
| Transfer | 20944459 | 475 days ago | 1.59998916 ETH | ||||
| Transfer | 20908226 | 480 days ago | 0.00000022 ETH | ||||
| Transfer | 20908226 | 480 days ago | 0.04999977 ETH | ||||
| Transfer | 20901152 | 481 days ago | 0.00001903 ETH | ||||
| Transfer | 20901152 | 481 days ago | 1.29998096 ETH | ||||
| Transfer | 20763475 | 500 days ago | 0.00000016 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RFRMBonding
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
/**
* @title RFRM Bonding
* @notice A contract for purchasing RFRM tokens with various locking mechanisms.
* @dev This contract allows users to buy RFRM tokens, with options for different locking periods and discounts.
* @author Reform DAO
*/
pragma solidity 0.8.23;
// Import necessary OpenZeppelin contracts
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 external interfaces
import { IStaking } from "./interface/IStaking.sol";
import { IOracle } from "./interface/IOracle.sol";
// Define the ERC20 interface for use in the contract
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;
}
// The main RFRM Bonding contract
contract RFRMBonding is Ownable, ReentrancyGuard, Pausable {
using Address for address;
// RFRM Token
IERC20 public immutable rfrm;
// Initial price of RFRM token in cents (0.03$)
uint256 public initialPrice = 0.03 * 10 ** 6;
// Flag indicating whether dynamic pricing is used
bool public isDynamicPriceUsed;
// Start time for the sale
uint32 public startTime;
// Time until which the maximum cap is active
uint32 public limitActiveTill;
// Maximum amount that can be bought at initial stages
uint256 public earlyBuyLimit;
// Actual bought tokens from the bonding contract
uint256 public totalActualBought;
// Staking contract interface
IStaking public immutable staking;
// Oracle contract interface
IOracle public immutable oracle;
// USDC token contract interface
IERC20 internal immutable usdc;
// USDT token contract interface
USDTIERC20 internal immutable usdt;
// Address where payments are received
address public paymentReceiver;
// Mapping of discounts per lock period (in percentage, 2 decimals)
mapping(uint8 => uint256) public discountPerLock;
// Mapping of whether a lock period is disabled or not
mapping(uint8 => bool) public isNotDisabled;
// Mapping of total bought tokens by a user
mapping(address => uint256) public totalBought;
// Mapping of whether a contract is whitelisted or not
mapping(address => bool) public isWhitelisted;
// Custom error messages
error ContractNotAllowed();
error ZeroAddress();
error InvalidLimit();
error InvalidInput();
error BondNotActive();
error BondDisabled();
error MaxLimitExceeded();
error InsufficientFunds();
error InvalidPaymentToken();
error InvalidBuyAmount();
// Modifier to ensure transactions are not initiated by other contracts
modifier notContract() {
// solhint-disable-next-line avoid-tx-origin
if ((msg.sender.isContract() || msg.sender != tx.origin) && !isWhitelisted[msg.sender]) {
revert ContractNotAllowed();
}
_;
}
// Event emitted when tokens are purchased
event TokensPurchased(
address indexed user,
uint256 indexed amount,
uint256 indexed price,
address purchaseToken,
uint8 lockId
);
// Event emitted when sale limits are changed
event LimitsChanged(uint32 startTime, uint32 limitActive, uint256 earlyLimit);
// Event emitted when discounts are changed
event DiscountsChanged(uint8[] lockIds, uint256[] discounts);
// Event emitted when price information is changed
event PriceInfoChanged(uint256 newPrice, bool isDynamicUsed);
// Event emitted when contract state is changed (paused/unpaused)
event ContractStateChanged(bool isPaused);
// Event emitted when payment receiver address is changed
event PaymentReceiverChanged(address newReceiver);
/**
* @dev Constructor to initialize the RFRM Bonding contract.
* @param _rfrm Address of the RFRM token.
* @param _staking Address of the staking contract.
* @param _oracle Address of the oracle contract.
* @param _usdc Address of the USDC token contract.
* @param _usdt Address of the USDT token contract.
* @param _receiver Address to receive payments.
* @param _startTime Start time of the sale.
* @param _limitActive Time until which the maximum cap is active.
* @param _earlyLimit Maximum amount that can be bought at initial stages.
*/
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);
}
/**
* @dev Set new sale limits.
* @param _startTime New start time for the sale.
* @param _limitActive New time until which the maximum cap is active.
* @param _earlyLimit New maximum amount that can be bought at initial stages.
*/
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);
}
/**
* @dev Set discounts for specific lock periods.
* @param _lockIds Array of lock period IDs.
* @param _discounts Array of corresponding discounts (in percentage, 2 decimals).
*/
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);
}
/**
* @dev Set whitelisting status for contracts.
* @param _contracts Array of contract addresses.
* @param _isWhitelisted Boolean indicating whether contracts should be whitelisted.
*/
function setWhitelist(address[] calldata _contracts, bool _isWhitelisted) external onlyOwner {
for (uint256 i = 0; i < _contracts.length; i++) {
isWhitelisted[_contracts[i]] = _isWhitelisted;
}
}
/**
* @dev Set the status of lock periods.
* @param _lockIds Array of lock period IDs.
* @param _isNotDisabled Array of corresponding statuses (whether lock periods are disabled).
*/
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];
}
}
/**
* @dev Set new price information for token purchases.
* @param _newPrice New initial price of the RFRM token in cents (0.03$).
* @param _isDynamicUsed Boolean indicating whether dynamic pricing is used.
*/
function setPriceInfo(uint256 _newPrice, bool _isDynamicUsed) external onlyOwner {
initialPrice = _newPrice;
isDynamicPriceUsed = _isDynamicUsed;
emit PriceInfoChanged(_newPrice, _isDynamicUsed);
}
/**
* @dev Set the contract state (paused or unpaused).
* @param _isPaused Boolean indicating whether the contract should be paused.
*/
function setContractState(bool _isPaused) external onlyOwner {
if (_isPaused) {
_pause();
} else {
_unpause();
}
emit ContractStateChanged(_isPaused);
}
/**
* @dev Set a new payment receiver address.
* @param _newReceiver Address where payments should be received.
*/
function setReceiver(address _newReceiver) external onlyOwner {
if (_newReceiver == address(0)) {
revert ZeroAddress();
}
paymentReceiver = _newReceiver;
emit PaymentReceiverChanged(_newReceiver);
}
/**
* @dev Transfer tokens from the contract to an address.
* @param _token Address of the token to be transferred.
* @param _to Address to which tokens should be transferred.
* @param _amount Amount of tokens to transfer.
*/
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);
}
}
/**
* @dev Buy RFRM tokens with specified parameters.
* @param _amount Amount of tokens to buy.
* @param _token Payment token (address(0) for ETH, or USDC/USDT token addresses).
* @param _lockId Lock period ID.
*/
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);
// Refund if necessary
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);
}
/**
* @dev Get the discounted price for a purchase in ETH.
* @param _lockId Lock period ID.
* @param _amount Amount of tokens to buy.
* @return discountedPrice Discounted price in ETH.
*/
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);
}
/**
* @dev Get the discounted price for a purchase in USDT.
* @param _lockId Lock period ID.
* @param _amount Amount of tokens to buy.
* @return discountedPrice Discounted price in USDT.
*/
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);
}
/**
* @dev Get the discounted price for a purchase in USDC.
* @param _lockId Lock period ID.
* @param _amount Amount of tokens to buy.
* @return discountedPrice Discounted price in USDC.
*/
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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
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");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
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");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
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);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
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);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
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);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
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 {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
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;
}// SPDX-License-Identifier: MIT
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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"remappings": [
"@prb/test/=lib/prb-test/src/",
"forge-std/=lib/forge-std/src/",
"@openzeppelin/=lib/openzeppelin-contracts/",
"@uniswap/=node_modules/@uniswap/",
"@chainlink/=lib/chainlink/",
"chainlink/=lib/chainlink/integration-tests/contracts/ethereum/src/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"prb-test/=lib/prb-test/src/"
],
"optimizer": {
"enabled": true,
"runs": 10000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"}]Contract Creation Code
6101206040526175306003553480156200001857600080fd5b5060405162002638380380620026388339810160408190526200003b9162000222565b6200004633620001a0565b600180556002805460ff191690556001600160a01b03891615806200007257506001600160a01b038816155b806200008557506001600160a01b038716155b15620000a45760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03898116608081905289821660a081905289831660c05288831660e052878316610100908152600780546001600160a01b0319169489169490941790935560048054610100600160481b03191663ffffffff88811690950263ffffffff60281b1916176501000000000094871694909402939093178355600584905560405163095ea7b360e01b81529283015260001960248301529063095ea7b3906044016020604051808303816000875af11580156200016a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001909190620002d4565b50505050505050505050620002ff565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200020857600080fd5b919050565b805163ffffffff811681146200020857600080fd5b60008060008060008060008060006101208a8c0312156200024257600080fd5b6200024d8a620001f0565b98506200025d60208b01620001f0565b97506200026d60408b01620001f0565b96506200027d60608b01620001f0565b95506200028d60808b01620001f0565b94506200029d60a08b01620001f0565b9350620002ad60c08b016200020d565b9250620002bd60e08b016200020d565b91506101008a015190509295985092959850929598565b600060208284031215620002e757600080fd5b81518015158114620002f857600080fd5b9392505050565b60805160a05160c05160e051610100516122ae6200038a6000396000818161132b01526113de01526000818161120301526112b60152600081816104710152818161095601528181610b0b01528181610c850152610dc70152600081816102fb015261154d0152600081816105200152818161087201528181610b470152610d2f01526122ae6000f3fe6080604052600436106101cc5760003560e01c806378e97925116100f7578063aefd8dc711610095578063cb37f3b211610064578063cb37f3b2146105c2578063cc1e806f146105ef578063f2fde38b14610602578063f5537ede1461062257600080fd5b8063aefd8dc714610542578063b0fb857614610562578063b568c90614610582578063c836e278146105a257600080fd5b80638da5cb5b116100d15780638da5cb5b146104ad57806393fe5144146104d8578063a44cd344146104ee578063a89c4eb61461050e57600080fd5b806378e979251461043d5780637dc0d1d01461045f5780637ed271251461049357600080fd5b80634cf088d91161016f578063715018a61161013e578063715018a6146103c5578063718da7ee146103da5780637340413a146103fa57806378a637f01461041057600080fd5b80634cf088d9146102e95780635c975abb1461034257806360207cb01461035a578063653990511461038a57600080fd5b80633c271a05116101ab5780633c271a051461025c5780633f01b8591461027c5780634546199a1461029c5780634663b1b2146102bc57600080fd5b8062cef1ba146101d15780631d0806ae146101f35780633af32abf1461021c575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004611c9a565b610642565b005b3480156101ff57600080fd5b5061020960035481565b6040519081526020015b60405180910390f35b34801561022857600080fd5b5061024c610237366004611cfa565b600b6020526000908152604090205460ff1681565b6040519015158152602001610213565b34801561026857600080fd5b506101f1610277366004611d76565b610747565b34801561028857600080fd5b506101f1610297366004611dcd565b6107e7565b3480156102a857600080fd5b506102096102b7366004611e0c565b610861565b3480156102c857600080fd5b506102096102d7366004611cfa565b600a6020526000908152604090205481565b3480156102f557600080fd5b5061031d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610213565b34801561034e57600080fd5b5060025460ff1661024c565b34801561036657600080fd5b5061024c610375366004611e38565b60096020526000908152604090205460ff1681565b34801561039657600080fd5b506004546103b09065010000000000900463ffffffff1681565b60405163ffffffff9091168152602001610213565b3480156103d157600080fd5b506101f1610a17565b3480156103e657600080fd5b506101f16103f5366004611cfa565b610a2b565b34801561040657600080fd5b5061020960065481565b34801561041c57600080fd5b5061020961042b366004611e38565b60086020526000908152604090205481565b34801561044957600080fd5b506004546103b090610100900463ffffffff1681565b34801561046b57600080fd5b5061031d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049f57600080fd5b5060045461024c9060ff1681565b3480156104b957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661031d565b3480156104e457600080fd5b5061020960055481565b3480156104fa57600080fd5b50610209610509366004611e0c565b610afa565b34801561051a57600080fd5b5061031d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561054e57600080fd5b506101f161055d366004611e55565b610cc9565b34801561056e57600080fd5b5061020961057d366004611e0c565b610d1e565b34801561058e57600080fd5b506101f161059d366004611e72565b610e0b565b3480156105ae57600080fd5b506101f16105bd366004611e72565b610efb565b3480156105ce57600080fd5b5060075461031d9073ffffffffffffffffffffffffffffffffffffffff1681565b6101f16105fd366004611ede565b610fe8565b34801561060e57600080fd5b506101f161061d366004611cfa565b61163a565b34801561062e57600080fd5b506101f161063d366004611f13565b6116f6565b61064a611809565b8263ffffffff168263ffffffff161015610690576040517fe55fb50900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805460058390557fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff166501000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1692909217610100928716928302179092556040805191825260208201929092529081018290527f553e396b4aa997be4cef4a081df22dbf6c3da495d3dc55b9de361d3950bd5e349060600160405180910390a1505050565b61074f611809565b60005b828110156107e15781600b600086868581811061077157610771611f3f565b90506020020160208101906107869190611cfa565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610752565b50505050565b6107ef611809565b6003829055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040805184815260208101929092527f2b324bad76b56b0b0d7609a661f30428b20e5d8bd2be471ea496c3119533fa94910160405180910390a15050565b600454600090819060ff16610927577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190611f6e565b61090a90600a6120dc565b8360035461091891906120eb565b6109229190612102565b6109d7565b6040517f907f2383000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063907f2383906024015b602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d7919061213d565b60ff8516600090815260086020526040902054909150612710906109fb90836120eb565b610a059190612102565b610a0f9082612156565b949350505050565b610a1f611809565b610a29600061188a565b565b610a33611809565b73ffffffffffffffffffffffffffffffffffffffff8116610a80576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd74dcada17f127805d024ccd9a15a9e7ad64d6ca82f3a0d03a3e1ac0f322c337906020015b60405180910390a150565b600454600090819060ff16610c56577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633be0dcb87f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd49190611f6e565b610bdf90600a6120dc565b85600354610bed91906120eb565b610bf79190612102565b6040518263ffffffff1660e01b8152600401610c1591815260200190565b602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610922919061213d565b6040517f0441b220000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630441b22090602401610996565b610cd1611809565b8015610ce457610cdf6118ff565b610cec565b610cec611984565b60405181151581527f2cde22acc8fd53a00979e46849e256a19250dc0d6626358410d5a4ee27ad6c7990602001610aef565b600454600090819060ff16610d98577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108db573d6000803e3d6000fd5b6040517f88882205000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690638888220590602401610996565b610e13611809565b828114610e4c576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610eb757828282818110610e6957610e69611f3f565b9050602002013560086000878785818110610e8657610e86611f3f565b9050602002016020810190610e9b9190611e38565b60ff168152602081019190915260400160002055600101610e4f565b507f13ac4df5887f2578c347466765bbc30616ec847e8d277e0f00a16efa89bc210b84848484604051610eed9493929190612169565b60405180910390a150505050565b610f03611809565b828114610f3c576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610fe157828282818110610f5957610f59611f3f565b9050602002016020810190610f6e9190611e55565b60096000878785818110610f8457610f84611f3f565b9050602002016020810190610f999190611e38565b60ff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610f3f565b5050505050565b333b151580610ff75750333214155b80156110135750336000908152600b602052604090205460ff16155b1561104a576040517f8cb8716800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110526119db565b61105a611a4e565b600454610100900463ffffffff164210156110a1576040517fc8631cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff808216600090815260096020526040902054166110ec576040517fa3bc75c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045465010000000000900463ffffffff16421161115a57600554336000908152600a60205260409020546111229085906121fa565b111561115a576040517f40ec7a6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff8416611201576111828386610afa565b9050803410156111be576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546111e19073ffffffffffffffffffffffffffffffffffffffff1682611abb565b803411156111fc576111fc336111f78334612156565b611abb565b611471565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113295761125e8386610d1e565b6007546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018390529192507f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af11580156112ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611323919061220d565b50611471565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361143f576113868386610861565b6007546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018390529192507f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b15801561142257600080fd5b505af1158015611436573d6000803e3d6000fd5b50505050611471565b6040517f56e7ec5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081116114ab576040517f384dbe5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020526040812080548792906114ca9084906121fa565b909155505060408051600180825281830190925260009160208083019080368337019050509050858160008151811061150557611505611f3f565b60209081029190910101526040517f0825034000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906308250340906115899060009088903390879060040161222a565b600060405180830381600087803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b5050505085600660008282546115cd91906121fa565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff8716815260ff861660208201528491889133917f0fbac4c1b53065ad309ad65b76cdd3048113d7def353fb1d2ab5d25928cef3fa910160405180910390a450505061163560018055565b505050565b611642611809565b73ffffffffffffffffffffffffffffffffffffffff81166116ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6116f38161188a565b50565b6116fe611809565b73ffffffffffffffffffffffffffffffffffffffff821661174b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611770576116358282611abb565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e1919061220d565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116e1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611907611a4e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861195a3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b61198c611c15565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361195a565b600260015403611a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016116e1565b6002600155565b60025460ff1615610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016116e1565b80471015611b25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016116e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b7f576040519150601f19603f3d011682016040523d82523d6000602084013e611b84565b606091505b5050905080611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016116e1565b60025460ff16610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016116e1565b803563ffffffff81168114611c9557600080fd5b919050565b600080600060608486031215611caf57600080fd5b611cb884611c81565b9250611cc660208501611c81565b9150604084013590509250925092565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c9557600080fd5b600060208284031215611d0c57600080fd5b611d1582611cd6565b9392505050565b60008083601f840112611d2e57600080fd5b50813567ffffffffffffffff811115611d4657600080fd5b6020830191508360208260051b8501011115611d6157600080fd5b9250929050565b80151581146116f357600080fd5b600080600060408486031215611d8b57600080fd5b833567ffffffffffffffff811115611da257600080fd5b611dae86828701611d1c565b9094509250506020840135611dc281611d68565b809150509250925092565b60008060408385031215611de057600080fd5b823591506020830135611df281611d68565b809150509250929050565b60ff811681146116f357600080fd5b60008060408385031215611e1f57600080fd5b8235611e2a81611dfd565b946020939093013593505050565b600060208284031215611e4a57600080fd5b8135611d1581611dfd565b600060208284031215611e6757600080fd5b8135611d1581611d68565b60008060008060408587031215611e8857600080fd5b843567ffffffffffffffff80821115611ea057600080fd5b611eac88838901611d1c565b90965094506020870135915080821115611ec557600080fd5b50611ed287828801611d1c565b95989497509550505050565b600080600060608486031215611ef357600080fd5b83359250611f0360208501611cd6565b91506040840135611dc281611dfd565b600080600060608486031215611f2857600080fd5b611f3184611cd6565b9250611cc660208501611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f8057600080fd5b8151611d1581611dfd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561201357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ff957611ff9611f8b565b8085161561200657918102915b93841c9390800290611fbf565b509250929050565b60008261202a575060016120d6565b81612037575060006120d6565b816001811461204d576002811461205757612073565b60019150506120d6565b60ff84111561206857612068611f8b565b50506001821b6120d6565b5060208310610133831016604e8410600b8410161715612096575081810a6120d6565b6120a08383611fba565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156120d2576120d2611f8b565b0290505b92915050565b6000611d1560ff84168361201b565b80820281158282048414176120d6576120d6611f8b565b600082612138577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561214f57600080fd5b5051919050565b818103818111156120d6576120d6611f8b565b6040808252810184905260008560608301825b878110156121a657823561218f81611dfd565b60ff1682526020928301929091019060010161217c565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8511156121df57600080fd5b8460051b915081866020830137016020019695505050505050565b808201808211156120d6576120d6611f8b565b60006020828403121561221f57600080fd5b8151611d1581611d68565b600060808201868352602060ff8716602085015273ffffffffffffffffffffffffffffffffffffffff861660408501526080606085015281855180845260a08601915060208701935060005b8181101561229257845183529383019391830191600101612276565b5090999850505050505050505056fea164736f6c6343000817000a000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e00000000000000000000000074ef3b69e8c475df8450eddda5dabd9b6dd179720000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000006af5f211d388ae13f55ef5780c4176ba17f99cd80000000000000000000000000000000000000000000000000000000065aa5c0b0000000000000000000000000000000000000000000000000000000065e45e0b000000000000000000000000000000000000000000027b46536c66c8e3000000
Deployed Bytecode
0x6080604052600436106101cc5760003560e01c806378e97925116100f7578063aefd8dc711610095578063cb37f3b211610064578063cb37f3b2146105c2578063cc1e806f146105ef578063f2fde38b14610602578063f5537ede1461062257600080fd5b8063aefd8dc714610542578063b0fb857614610562578063b568c90614610582578063c836e278146105a257600080fd5b80638da5cb5b116100d15780638da5cb5b146104ad57806393fe5144146104d8578063a44cd344146104ee578063a89c4eb61461050e57600080fd5b806378e979251461043d5780637dc0d1d01461045f5780637ed271251461049357600080fd5b80634cf088d91161016f578063715018a61161013e578063715018a6146103c5578063718da7ee146103da5780637340413a146103fa57806378a637f01461041057600080fd5b80634cf088d9146102e95780635c975abb1461034257806360207cb01461035a578063653990511461038a57600080fd5b80633c271a05116101ab5780633c271a051461025c5780633f01b8591461027c5780634546199a1461029c5780634663b1b2146102bc57600080fd5b8062cef1ba146101d15780631d0806ae146101f35780633af32abf1461021c575b600080fd5b3480156101dd57600080fd5b506101f16101ec366004611c9a565b610642565b005b3480156101ff57600080fd5b5061020960035481565b6040519081526020015b60405180910390f35b34801561022857600080fd5b5061024c610237366004611cfa565b600b6020526000908152604090205460ff1681565b6040519015158152602001610213565b34801561026857600080fd5b506101f1610277366004611d76565b610747565b34801561028857600080fd5b506101f1610297366004611dcd565b6107e7565b3480156102a857600080fd5b506102096102b7366004611e0c565b610861565b3480156102c857600080fd5b506102096102d7366004611cfa565b600a6020526000908152604090205481565b3480156102f557600080fd5b5061031d7f00000000000000000000000074ef3b69e8c475df8450eddda5dabd9b6dd1797281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610213565b34801561034e57600080fd5b5060025460ff1661024c565b34801561036657600080fd5b5061024c610375366004611e38565b60096020526000908152604090205460ff1681565b34801561039657600080fd5b506004546103b09065010000000000900463ffffffff1681565b60405163ffffffff9091168152602001610213565b3480156103d157600080fd5b506101f1610a17565b3480156103e657600080fd5b506101f16103f5366004611cfa565b610a2b565b34801561040657600080fd5b5061020960065481565b34801561041c57600080fd5b5061020961042b366004611e38565b60086020526000908152604090205481565b34801561044957600080fd5b506004546103b090610100900463ffffffff1681565b34801561046b57600080fd5b5061031d7f0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f81565b34801561049f57600080fd5b5060045461024c9060ff1681565b3480156104b957600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661031d565b3480156104e457600080fd5b5061020960055481565b3480156104fa57600080fd5b50610209610509366004611e0c565b610afa565b34801561051a57600080fd5b5061031d7f000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e81565b34801561054e57600080fd5b506101f161055d366004611e55565b610cc9565b34801561056e57600080fd5b5061020961057d366004611e0c565b610d1e565b34801561058e57600080fd5b506101f161059d366004611e72565b610e0b565b3480156105ae57600080fd5b506101f16105bd366004611e72565b610efb565b3480156105ce57600080fd5b5060075461031d9073ffffffffffffffffffffffffffffffffffffffff1681565b6101f16105fd366004611ede565b610fe8565b34801561060e57600080fd5b506101f161061d366004611cfa565b61163a565b34801561062e57600080fd5b506101f161063d366004611f13565b6116f6565b61064a611809565b8263ffffffff168263ffffffff161015610690576040517fe55fb50900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805460058390557fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff166501000000000063ffffffff8581169182027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1692909217610100928716928302179092556040805191825260208201929092529081018290527f553e396b4aa997be4cef4a081df22dbf6c3da495d3dc55b9de361d3950bd5e349060600160405180910390a1505050565b61074f611809565b60005b828110156107e15781600b600086868581811061077157610771611f3f565b90506020020160208101906107869190611cfa565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610752565b50505050565b6107ef611809565b6003829055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040805184815260208101929092527f2b324bad76b56b0b0d7609a661f30428b20e5d8bd2be471ea496c3119533fa94910160405180910390a15050565b600454600090819060ff16610927577f000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ff9190611f6e565b61090a90600a6120dc565b8360035461091891906120eb565b6109229190612102565b6109d7565b6040517f907f2383000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f73ffffffffffffffffffffffffffffffffffffffff169063907f2383906024015b602060405180830381865afa1580156109b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d7919061213d565b60ff8516600090815260086020526040902054909150612710906109fb90836120eb565b610a059190612102565b610a0f9082612156565b949350505050565b610a1f611809565b610a29600061188a565b565b610a33611809565b73ffffffffffffffffffffffffffffffffffffffff8116610a80576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd74dcada17f127805d024ccd9a15a9e7ad64d6ca82f3a0d03a3e1ac0f322c337906020015b60405180910390a150565b600454600090819060ff16610c56577f0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f73ffffffffffffffffffffffffffffffffffffffff16633be0dcb87f000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd49190611f6e565b610bdf90600a6120dc565b85600354610bed91906120eb565b610bf79190612102565b6040518263ffffffff1660e01b8152600401610c1591815260200190565b602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610922919061213d565b6040517f0441b220000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f73ffffffffffffffffffffffffffffffffffffffff1690630441b22090602401610996565b610cd1611809565b8015610ce457610cdf6118ff565b610cec565b610cec611984565b60405181151581527f2cde22acc8fd53a00979e46849e256a19250dc0d6626358410d5a4ee27ad6c7990602001610aef565b600454600090819060ff16610d98577f000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108db573d6000803e3d6000fd5b6040517f88882205000000000000000000000000000000000000000000000000000000008152600481018490527f0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f73ffffffffffffffffffffffffffffffffffffffff1690638888220590602401610996565b610e13611809565b828114610e4c576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610eb757828282818110610e6957610e69611f3f565b9050602002013560086000878785818110610e8657610e86611f3f565b9050602002016020810190610e9b9190611e38565b60ff168152602081019190915260400160002055600101610e4f565b507f13ac4df5887f2578c347466765bbc30616ec847e8d277e0f00a16efa89bc210b84848484604051610eed9493929190612169565b60405180910390a150505050565b610f03611809565b828114610f3c576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610fe157828282818110610f5957610f59611f3f565b9050602002016020810190610f6e9190611e55565b60096000878785818110610f8457610f84611f3f565b9050602002016020810190610f999190611e38565b60ff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610f3f565b5050505050565b333b151580610ff75750333214155b80156110135750336000908152600b602052604090205460ff16155b1561104a576040517f8cb8716800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110526119db565b61105a611a4e565b600454610100900463ffffffff164210156110a1576040517fc8631cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60ff808216600090815260096020526040902054166110ec576040517fa3bc75c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045465010000000000900463ffffffff16421161115a57600554336000908152600a60205260409020546111229085906121fa565b111561115a576040517f40ec7a6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff8416611201576111828386610afa565b9050803410156111be576040517f356680b700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546111e19073ffffffffffffffffffffffffffffffffffffffff1682611abb565b803411156111fc576111fc336111f78334612156565b611abb565b611471565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113295761125e8386610d1e565b6007546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018390529192507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906323b872dd906064016020604051808303816000875af11580156112ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611323919061220d565b50611471565b7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361143f576113868386610861565b6007546040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff9182166024820152604481018390529192507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716906323b872dd90606401600060405180830381600087803b15801561142257600080fd5b505af1158015611436573d6000803e3d6000fd5b50505050611471565b6040517f56e7ec5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081116114ab576040517f384dbe5a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020526040812080548792906114ca9084906121fa565b909155505060408051600180825281830190925260009160208083019080368337019050509050858160008151811061150557611505611f3f565b60209081029190910101526040517f0825034000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000074ef3b69e8c475df8450eddda5dabd9b6dd1797216906308250340906115899060009088903390879060040161222a565b600060405180830381600087803b1580156115a357600080fd5b505af11580156115b7573d6000803e3d6000fd5b5050505085600660008282546115cd91906121fa565b90915550506040805173ffffffffffffffffffffffffffffffffffffffff8716815260ff861660208201528491889133917f0fbac4c1b53065ad309ad65b76cdd3048113d7def353fb1d2ab5d25928cef3fa910160405180910390a450505061163560018055565b505050565b611642611809565b73ffffffffffffffffffffffffffffffffffffffff81166116ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6116f38161188a565b50565b6116fe611809565b73ffffffffffffffffffffffffffffffffffffffff821661174b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611770576116358282611abb565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156117e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e1919061220d565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016116e1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611907611a4e565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861195a3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b61198c611c15565b600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361195a565b600260015403611a47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016116e1565b6002600155565b60025460ff1615610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016116e1565b80471015611b25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016116e1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611b7f576040519150601f19603f3d011682016040523d82523d6000602084013e611b84565b606091505b5050905080611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016116e1565b60025460ff16610a29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016116e1565b803563ffffffff81168114611c9557600080fd5b919050565b600080600060608486031215611caf57600080fd5b611cb884611c81565b9250611cc660208501611c81565b9150604084013590509250925092565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c9557600080fd5b600060208284031215611d0c57600080fd5b611d1582611cd6565b9392505050565b60008083601f840112611d2e57600080fd5b50813567ffffffffffffffff811115611d4657600080fd5b6020830191508360208260051b8501011115611d6157600080fd5b9250929050565b80151581146116f357600080fd5b600080600060408486031215611d8b57600080fd5b833567ffffffffffffffff811115611da257600080fd5b611dae86828701611d1c565b9094509250506020840135611dc281611d68565b809150509250925092565b60008060408385031215611de057600080fd5b823591506020830135611df281611d68565b809150509250929050565b60ff811681146116f357600080fd5b60008060408385031215611e1f57600080fd5b8235611e2a81611dfd565b946020939093013593505050565b600060208284031215611e4a57600080fd5b8135611d1581611dfd565b600060208284031215611e6757600080fd5b8135611d1581611d68565b60008060008060408587031215611e8857600080fd5b843567ffffffffffffffff80821115611ea057600080fd5b611eac88838901611d1c565b90965094506020870135915080821115611ec557600080fd5b50611ed287828801611d1c565b95989497509550505050565b600080600060608486031215611ef357600080fd5b83359250611f0360208501611cd6565b91506040840135611dc281611dfd565b600080600060608486031215611f2857600080fd5b611f3184611cd6565b9250611cc660208501611cd6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611f8057600080fd5b8151611d1581611dfd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561201357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ff957611ff9611f8b565b8085161561200657918102915b93841c9390800290611fbf565b509250929050565b60008261202a575060016120d6565b81612037575060006120d6565b816001811461204d576002811461205757612073565b60019150506120d6565b60ff84111561206857612068611f8b565b50506001821b6120d6565b5060208310610133831016604e8410600b8410161715612096575081810a6120d6565b6120a08383611fba565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156120d2576120d2611f8b565b0290505b92915050565b6000611d1560ff84168361201b565b80820281158282048414176120d6576120d6611f8b565b600082612138577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561214f57600080fd5b5051919050565b818103818111156120d6576120d6611f8b565b6040808252810184905260008560608301825b878110156121a657823561218f81611dfd565b60ff1682526020928301929091019060010161217c565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8511156121df57600080fd5b8460051b915081866020830137016020019695505050505050565b808201808211156120d6576120d6611f8b565b60006020828403121561221f57600080fd5b8151611d1581611d68565b600060808201868352602060ff8716602085015273ffffffffffffffffffffffffffffffffffffffff861660408501526080606085015281855180845260a08601915060208701935060005b8181101561229257845183529383019391830191600101612276565b5090999850505050505050505056fea164736f6c6343000817000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e00000000000000000000000074ef3b69e8c475df8450eddda5dabd9b6dd179720000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000006af5f211d388ae13f55ef5780c4176ba17f99cd80000000000000000000000000000000000000000000000000000000065aa5c0b0000000000000000000000000000000000000000000000000000000065e45e0b000000000000000000000000000000000000000000027b46536c66c8e3000000
-----Decoded View---------------
Arg [0] : _rfrm (address): 0xea3eed8616877F5d3c4aEbf5A799F2e8D6DE9A5E
Arg [1] : _staking (address): 0x74Ef3b69E8c475dF8450edDDa5DABd9b6dd17972
Arg [2] : _oracle (address): 0x0c4d7dbD8E316353348a60B36008d4e471F8706F
Arg [3] : _usdc (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : _usdt (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [5] : _receiver (address): 0x6af5F211d388ae13F55Ef5780C4176bA17F99cd8
Arg [6] : _startTime (uint32): 1705663499
Arg [7] : _limitActive (uint32): 1709465099
Arg [8] : _earlyLimit (uint256): 3000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000ea3eed8616877f5d3c4aebf5a799f2e8d6de9a5e
Arg [1] : 00000000000000000000000074ef3b69e8c475df8450eddda5dabd9b6dd17972
Arg [2] : 0000000000000000000000000c4d7dbd8e316353348a60b36008d4e471f8706f
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [5] : 0000000000000000000000006af5f211d388ae13f55ef5780c4176ba17f99cd8
Arg [6] : 0000000000000000000000000000000000000000000000000000000065aa5c0b
Arg [7] : 0000000000000000000000000000000000000000000000000000000065e45e0b
Arg [8] : 000000000000000000000000000000000000000000027b46536c66c8e3000000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$316.73
Net Worth in ETH
0.112944
Token Allocations
$RFRM
78.03%
ETH
21.97%
BNB
0.00%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.