More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 271 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy RFRM | 21817521 | 42 hrs ago | IN | 0.00002887 ETH | 0.00052489 | ||||
Buy RFRM | 21795698 | 4 days ago | IN | 0.1 ETH | 0.00112165 | ||||
Buy RFRM | 21672776 | 21 days ago | IN | 0.29 ETH | 0.00079867 | ||||
Buy RFRM | 21538050 | 40 days ago | IN | 0.27115615 ETH | 0.00453821 | ||||
Buy RFRM | 21348252 | 67 days ago | IN | 0.055 ETH | 0.00427415 | ||||
Buy RFRM | 21348227 | 67 days ago | IN | 0.0616633 ETH | 0.00412057 | ||||
Buy RFRM | 21311005 | 72 days ago | IN | 0 ETH | 0.00537321 | ||||
Buy RFRM | 21079065 | 104 days ago | IN | 0.94 ETH | 0.01016457 | ||||
Buy RFRM | 21021888 | 112 days ago | IN | 2 ETH | 0.00518561 | ||||
Buy RFRM | 20960459 | 121 days ago | IN | 0 ETH | 0.00327167 | ||||
Buy RFRM | 20944459 | 123 days ago | IN | 1.6 ETH | 0.00446799 | ||||
Buy RFRM | 20935911 | 124 days ago | IN | 0.00000001 ETH | 0.01083557 | ||||
Buy RFRM | 20930777 | 125 days ago | IN | 0 ETH | 0.00883656 | ||||
Buy RFRM | 20929103 | 125 days ago | IN | 0 ETH | 0.01906246 | ||||
Buy RFRM | 20913426 | 127 days ago | IN | 0 ETH | 0.00574099 | ||||
Buy RFRM | 20908226 | 128 days ago | IN | 0.05 ETH | 0.00263808 | ||||
Buy RFRM | 20901161 | 129 days ago | IN | 0 ETH | 0.00480506 | ||||
Buy RFRM | 20901152 | 129 days ago | IN | 1.3 ETH | 0.00419304 | ||||
Buy RFRM | 20763475 | 148 days ago | IN | 0.04 ETH | 0.00752284 | ||||
Buy RFRM | 20754055 | 150 days ago | IN | 0 ETH | 0.00047241 | ||||
Buy RFRM | 20743371 | 151 days ago | IN | 0 ETH | 0.00180844 | ||||
Buy RFRM | 20728157 | 153 days ago | IN | 0.00000001 ETH | 0.00354292 | ||||
Buy RFRM | 20722463 | 154 days ago | IN | 0 ETH | 0.00221172 | ||||
Buy RFRM | 20716200 | 155 days ago | IN | 0.00000001 ETH | 0.00086604 | ||||
Buy RFRM | 20707689 | 156 days ago | IN | 0.00000001 ETH | 0.00069789 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21817521 | 42 hrs ago | 0 ETH | ||||
21817521 | 42 hrs ago | 0.00002887 ETH | ||||
21795698 | 4 days ago | 0.00000044 ETH | ||||
21795698 | 4 days ago | 0.09999955 ETH | ||||
21538050 | 40 days ago | 0.00000018 ETH | ||||
21538050 | 40 days ago | 0.27115597 ETH | ||||
21348252 | 67 days ago | 0.00000018 ETH | ||||
21348252 | 67 days ago | 0.05499981 ETH | ||||
21348227 | 67 days ago | 0.00000041 ETH | ||||
21348227 | 67 days ago | 0.06166288 ETH | ||||
21079065 | 104 days ago | 0.00000954 ETH | ||||
21079065 | 104 days ago | 0.93999045 ETH | ||||
21021888 | 112 days ago | 0.00009778 ETH | ||||
21021888 | 112 days ago | 1.99990221 ETH | ||||
20944459 | 123 days ago | 0.00001083 ETH | ||||
20944459 | 123 days ago | 1.59998916 ETH | ||||
20908226 | 128 days ago | 0.00000022 ETH | ||||
20908226 | 128 days ago | 0.04999977 ETH | ||||
20901152 | 129 days ago | 0.00001903 ETH | ||||
20901152 | 129 days ago | 1.29998096 ETH | ||||
20763475 | 148 days ago | 0.00000016 ETH | ||||
20763475 | 148 days ago | 0.03999983 ETH | ||||
20692020 | 158 days ago | 0.00000001 ETH | ||||
20692020 | 158 days ago | 0.00620875 ETH | ||||
20690721 | 159 days ago | 0.00000002 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
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
[{"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
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.