Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
RooFinanceStake
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-03-16 */ /** *Submitted for verification at cronoscan.com on 2023-03-01 */ /* ______ ______ _ | ___ \ | ___|(_) | |_/ / ___ ___ | |_ _ _ __ __ _ _ __ ___ ___ | / / _ \ / _ \ | _| | || '_ \ / _` || '_ \ / __| / _ \ | |\ \ | (_) || (_) | | | | || | | || (_| || | | || (__ | __/ \_| \_| \___/ \___/ \_| |_||_| |_| \__,_||_| |_| \___| \___| */ /** *Submitted for verification at cronoscan.com on 2022-11-27 */ // Sources flattened with hardhat v2.11.2 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // 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; } } // File @openzeppelin/contracts/access/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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); } } // File @openzeppelin/contracts/security/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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()); } } // File @openzeppelin/contracts/security/[email protected] // // 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() { // 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; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // ERC721A Contracts v4.2.3 pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC20/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // // 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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); } } } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/v2/StakeV2.sol pragma solidity ^0.8.4; /** * @title RooFinanceStake */ contract RooFinanceStake is ReentrancyGuard, Pausable, Ownable, ERC721A__IERC721Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ IERC20 immutable public rewardsToken; address[] public collectionAddresses; mapping(address => uint256) public collectionRatio; mapping(address => bool) public isAllowedCollection; mapping(address => uint256) public rewardPerTokenStored; mapping(address => uint256) public totalStaked; mapping(address => uint256) public lastUpdateTime; mapping(address => uint256) public rewards; uint256 public durationFinish = 0; uint256 public rewardsDuration = 7 days; uint256 public rewardRate = 0; uint256 public rewardAmount; mapping(address => mapping(address => uint256)) public collectionToUserToBalances; mapping(address => mapping(address => uint256)) public collectionToUserToRewardPerTokenPaid; mapping(address => mapping(address => uint256)) public collectionToUserToRewards; mapping(address => mapping(address => uint256[])) private _collectionToUserToIds; //fee uint256 public stakeFee = 1 ether; uint256 public withdrawFee = 1 ether; uint256 public claimFee = 1 ether; address public chargePayee; uint[] index; /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address[] memory _collections, uint256[] memory _ratios ) Ownable() { rewardsToken = IERC20(_rewardsToken); collectionAddresses = _collections; chargePayee = msg.sender; for (uint256 i = 0; i < _collections.length; i++) { collectionRatio[_collections[i]] = _ratios[i]; isAllowedCollection[_collections[i]] = true; } } /* ========== FEE FUNCTIONS ========== */ /** * @notice set fees * @param _stake uint * @param _withdraw uint * @param _claim uint */ function setFees(uint256 _stake, uint256 _withdraw, uint256 _claim) onlyOwner() public { stakeFee = _stake; withdrawFee = _withdraw; claimFee = _claim; } /** * @notice set payee * @param _payee address */ function setPayee(address _payee) onlyOwner() public { chargePayee = _payee; } /** * @notice chargePayee can claim charge fee */ function claimChargeFee() public { require(chargePayee != address(0), "chargePayee is not set"); require(msg.sender == chargePayee, "only chargePayee can claim fee"); payable(msg.sender).transfer(address(this).balance); } /* ========== VIEWS ========== */ /** * @notice check balanceOf user * @param collection address * @param account address * @return uint */ function balanceOf(address collection, address account) external view returns (uint256) { return collectionToUserToBalances[collection][account]; } /** * @notice get user staked ids * @param collection address * @param user address * @return uint */ function getUserStakedIds(address collection, address user) public view returns(uint[] memory) { return _collectionToUserToIds[collection][user]; } /** * @notice get last time reward applicable time * @return uint */ function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < durationFinish ? block.timestamp : durationFinish; } /** * @notice get per token reward * @param collection address * @return uint */ function rewardPerToken(address collection) public view returns (uint256) { if (totalStaked[collection] == 0) { return rewardPerTokenStored[collection]; } return rewardPerTokenStored[collection] .add( lastTimeRewardApplicable() .sub(lastUpdateTime[collection]) .mul(rewardRate) .mul(1e18) .mul(collectionRatio[collection]) .div(100) .div(totalStaked[collection]) ); } /** * @notice get reward earned by user * @param collection address * @param account address * @return uint */ function earned(address collection, address account) public view returns (uint256) { return collectionToUserToBalances[collection][account] .mul(rewardPerToken(collection).sub(collectionToUserToRewardPerTokenPaid[collection][account])) .div(1e18) .add(rewards[account]); } /** * @notice get rewards for the duration will be paid * @return uint */ function getRewardForDuration() external view returns (uint256) { return rewardRate.mul(rewardsDuration); } /* ========== MUTATIVE FUNCTIONS ========== */ /** * @notice stake ids * @param collection address * @param ids uint[] */ function stake(address collection, uint256[] memory ids) external payable nonReentrant whenNotPaused updateReward(collection, msg.sender) { require(msg.value == stakeFee * ids.length, "stake fee is not enough"); require(ids.length > 0, "Cannot stake 0 nft"); require(isAllowedCollection[collection], "Collection is not allowed"); totalStaked[collection] = totalStaked[collection].add(ids.length); collectionToUserToBalances[collection][msg.sender] = collectionToUserToBalances[collection][msg.sender].add(ids.length); for (uint256 i = 0; i < ids.length; i++) { IERC721A(collection).safeTransferFrom(msg.sender, address(this), ids[i]); _collectionToUserToIds[collection][msg.sender].push(ids[i]); } emit Staked(msg.sender, collection, ids.length); } /** * @notice withdraw ids * @param collection address * @param ids uint[] */ function withdraw(address collection, uint256[] memory ids) public payable nonReentrant updateReward(collection, msg.sender) { require(msg.value == withdrawFee * ids.length, "withdraw fee is not enough"); require(ids.length > 0, "Cannot withdraw 0 nft"); totalStaked[collection] = totalStaked[collection].sub(ids.length); collectionToUserToBalances[collection][msg.sender] = collectionToUserToBalances[collection][msg.sender].sub(ids.length); for (uint256 i = 0; i < ids.length; i++) { IERC721A(collection).safeTransferFrom(address(this), msg.sender, ids[i]); } for(uint256 i = 0 ; i < _collectionToUserToIds[collection][msg.sender].length; i++) { for(uint256 j = 0; j < ids.length; j++) { if(_collectionToUserToIds[collection][msg.sender][i] == ids[j]) { index.push(i); } } } uint256 len = index.length; deleteElements(index, collection, msg.sender); for(uint256 i = 0; i < len; i++) { index.pop(); } emit Withdrawn(msg.sender, collection, ids.length); } /** * @notice user can claim unclaimRewards */ function claimReward() public payable nonReentrant { require(msg.value == claimFee, "claim fee is not enough"); for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], msg.sender); } uint256 reward = rewards[msg.sender]; if (reward > 0) { rewards[msg.sender] = 0; rewardsToken.safeTransfer(msg.sender, reward); emit RewardPaid(msg.sender, reward); } } /* ========== RESTRICTED FUNCTIONS ========== */ /** * @notice owner can set reward duration * @param _rewardsDuration uint */ function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > durationFinish, "Previous rewards period must be complete before changing the duration for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } /** * @notice setRewardAmount to set reward rate * @param reward uint */ function setRewardAmount(uint256 reward) external onlyOwner { for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], address(0)); } if (block.timestamp >= durationFinish) { rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = durationFinish.sub(block.timestamp); uint256 leftover = remaining.mul(rewardRate); rewardRate = reward.add(leftover).div(rewardsDuration); } uint balance = rewardsToken.balanceOf(address(this)); require(rewardRate <= balance.div(rewardsDuration), "Provided reward too high"); for (uint256 i = 0; i < collectionAddresses.length; i++) { lastUpdateTime[collectionAddresses[i]] = block.timestamp; } durationFinish = block.timestamp.add(rewardsDuration); rewardAmount = reward; emit RewardAdded(reward); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function pause() external onlyOwner { _pause(); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function unpause() external onlyOwner { _unpause(); } /** * @notice Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders * @param tokenAddress address * @param tokenAmount uint */ function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } /* ========== MODIFIERS ========== */ /** * @dev Modifier to update reward. */ modifier updateReward(address collection, address account) { _updateReward(collection, account); _; } /** * @notice update user reward * @param collection address * @param account address */ function _updateReward(address collection, address account) internal { rewardPerTokenStored[collection] = rewardPerToken(collection); lastUpdateTime[collection] = lastTimeRewardApplicable(); if (account != address(0)) { rewards[account] = earned(collection, account); collectionToUserToRewardPerTokenPaid[collection][account] = rewardPerTokenStored[collection]; } } function deleteElements(uint[] memory indices, address collection, address user) internal { require(indices.length <= _collectionToUserToIds[collection][user].length, "Too many indices"); uint[] memory new_arr = new uint[](_collectionToUserToIds[collection][user].length - indices.length); uint new_index = 0; for (uint i = 0; i < _collectionToUserToIds[collection][user].length; i++) { bool should_delete = false; for (uint j = 0; j < indices.length; j++) { if (i == indices[j]) { should_delete = true; break; } } if (!should_delete) { new_arr[new_index] = _collectionToUserToIds[collection][user][i]; new_index++; } } _collectionToUserToIds[collection][user] = new_arr; } function onERC721Received(address, address, uint256, bytes memory) external pure returns (bytes4) { return ERC721A__IERC721Receiver.onERC721Received.selector; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked(address indexed user, address indexed collection, uint256 amount); event Withdrawn(address indexed user, address indexed collection, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event RewardsDurationUpdated(uint256 newDuration); event Recovered(address token, uint256 amount); }
[{"inputs":[{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address[]","name":"_collections","type":"address[]"},{"internalType":"uint256[]","name":"_ratios","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargePayee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimChargeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collectionAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewardPerTokenPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"collectionToUserToRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"durationFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardForDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"getUserStakedIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedCollection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stake","type":"uint256"},{"internalType":"uint256","name":"_withdraw","type":"uint256"},{"internalType":"uint256","name":"_claim","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payee","type":"address"}],"name":"setPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"setRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardsDuration","type":"uint256"}],"name":"setRewardsDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalStaked","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052600060095562093a80600a556000600b55670de0b6b3a7640000601155670de0b6b3a7640000601255670de0b6b3a76400006013553480156200004657600080fd5b50604051620029933803806200299383398101604081905262000069916200036d565b60016000819055805460ff19169055620000833362000193565b6001600160a01b0383166080528151620000a5906002906020850190620001ed565b50601480546001600160a01b0319163317905560005b82518110156200018957818181518110620000da57620000da62000451565b602002602001015160036000858481518110620000fb57620000fb62000451565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555060016004600085848151811062000142576200014262000451565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580620001808162000467565b915050620000bb565b5050505062000491565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000245579160200282015b828111156200024557825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200020e565b506200025392915062000257565b5090565b5b8082111562000253576000815560010162000258565b80516001600160a01b03811681146200028657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002cc57620002cc6200028b565b604052919050565b60006001600160401b03821115620002f057620002f06200028b565b5060051b60200190565b600082601f8301126200030c57600080fd5b81516020620003256200031f83620002d4565b620002a1565b82815260059290921b840181019181810190868411156200034557600080fd5b8286015b8481101562000362578051835291830191830162000349565b509695505050505050565b6000806000606084860312156200038357600080fd5b6200038e846200026e565b602085810151919450906001600160401b0380821115620003ae57600080fd5b818701915087601f830112620003c357600080fd5b8151620003d46200031f82620002d4565b81815260059190911b8301840190848101908a831115620003f457600080fd5b938501935b828510156200041d576200040d856200026e565b82529385019390850190620003f9565b60408a015190975094505050808311156200043757600080fd5b50506200044786828701620002fa565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200048a57634e487b7160e01b600052601160045260246000fd5b5060010190565b6080516124d8620004bb6000396000818161067001528181610ee9015261119601526124d86000f3fe6080604052600436106102465760003560e01c80638da5cb5b11610139578063cec10c11116100b6578063f12297771161007a578063f1229777146106f5578063f2fde38b14610715578063f7888aec14610735578063f7b2a7be1461077b578063f7db8ded14610791578063fc5ba1a4146107c957600080fd5b8063cec10c111461063e578063d1af0c7d1461065e578063e7e82b8014610692578063e941fa78146106a7578063f055cbf5146106bd57600080fd5b8063a8a65a78116100fd578063a8a65a78146105c3578063abae977f146105e3578063b88a802f14610603578063c9a3911e1461060b578063cc1a378f1461061e57600080fd5b80638da5cb5b146104e45780639159b4751461051b57806399d32fc4146105535780639bfd8d61146105695780639ce43f901461059657600080fd5b80633f4ba83a116101c75780637b0a47ee1161018b5780637b0a47ee1461047157806380faa57d146104875780638293744b1461049c5780638456cb59146104af5780638980f11f146104c457600080fd5b80633f4ba83a146103e0578063410459ad146103f75780635922aaf6146104175780635c975abb14610444578063715018a61461045c57600080fd5b80631c1f78eb1161020e5780631c1f78eb14610352578063211dc32d14610367578063222c9777146103875780632ce9aead1461039d578063386a9525146103ca57600080fd5b80630700037d1461024b5780630de49c161461028b578063134102d6146102a1578063150b7a02146102ce5780631604b58e14610312575b600080fd5b34801561025757600080fd5b50610278610266366004612023565b60086020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561029757600080fd5b5061027860095481565b3480156102ad57600080fd5b506102786102bc366004612023565b60036020526000908152604090205481565b3480156102da57600080fd5b506102f96102e9366004612085565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610282565b34801561031e57600080fd5b5061034261032d366004612023565b60046020526000908152604090205460ff1681565b6040519015158152602001610282565b34801561035e57600080fd5b506102786107e9565b34801561037357600080fd5b50610278610382366004612145565b610807565b34801561039357600080fd5b5061027860115481565b3480156103a957600080fd5b506102786103b8366004612023565b60076020526000908152604090205481565b3480156103d657600080fd5b50610278600a5481565b3480156103ec57600080fd5b506103f56108a4565b005b34801561040357600080fd5b506103f5610412366004612023565b6108b6565b34801561042357600080fd5b50610437610432366004612145565b6108e0565b6040516102829190612178565b34801561045057600080fd5b5060015460ff16610342565b34801561046857600080fd5b506103f5610959565b34801561047d57600080fd5b50610278600b5481565b34801561049357600080fd5b5061027861096b565b6103f56104aa3660046121bc565b610982565b3480156104bb57600080fd5b506103f5610d92565b3480156104d057600080fd5b506103f56104df366004612275565b610da2565b3480156104f057600080fd5b5060015461010090046001600160a01b03165b6040516001600160a01b039091168152602001610282565b34801561052757600080fd5b50610278610536366004612145565b600e60209081526000928352604080842090915290825290205481565b34801561055f57600080fd5b5061027860135481565b34801561057557600080fd5b50610278610584366004612023565b60066020526000908152604090205481565b3480156105a257600080fd5b506102786105b1366004612023565b60056020526000908152604090205481565b3480156105cf57600080fd5b506103f56105de36600461229f565b610e17565b3480156105ef57600080fd5b506105036105fe36600461229f565b611076565b6103f56110a0565b6103f56106193660046121bc565b611203565b34801561062a57600080fd5b506103f561063936600461229f565b611531565b34801561064a57600080fd5b506103f56106593660046122b8565b611611565b34801561066a57600080fd5b506105037f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e57600080fd5b506103f5611627565b3480156106b357600080fd5b5061027860125481565b3480156106c957600080fd5b506102786106d8366004612145565b600d60209081526000928352604080842090915290825290205481565b34801561070157600080fd5b50610278610710366004612023565b611701565b34801561072157600080fd5b506103f5610730366004612023565b6117c5565b34801561074157600080fd5b50610278610750366004612145565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b34801561078757600080fd5b50610278600c5481565b34801561079d57600080fd5b506102786107ac366004612145565b600f60209081526000928352604080842090915290825290205481565b3480156107d557600080fd5b50601454610503906001600160a01b031681565b6000610802600a54600b5461183b90919063ffffffff16565b905090565b6001600160a01b038082166000818152600860209081526040808320549487168352600e825280832093835292905290812054909161089d9161089790670de0b6b3a764000090610891906108659061085f8a611701565b90611847565b6001600160a01b03808a166000908152600d60209081526040808320938c16835292905220549061183b565b90611853565b9061185f565b9392505050565b6108ac61186b565b6108b46118cb565b565b6108be61186b565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808316600090815260106020908152604080832093851683529281529082902080548351818402810184019094528084526060939283018282801561094c57602002820191906000526020600020905b815481526020019060010190808311610938575b5050505050905092915050565b61096161186b565b6108b4600061191d565b6000600954421061097d575060095490565b504290565b600260005414156109ae5760405162461bcd60e51b81526004016109a5906122e4565b60405180910390fd5b600260005581336109bf8282611977565b82516012546109ce9190612331565b3414610a1c5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720666565206973206e6f7420656e6f75676800000000000060448201526064016109a5565b6000835111610a655760405162461bcd60e51b815260206004820152601560248201527410d85b9b9bdd081dda5d1a191c985dc80c081b999d605a1b60448201526064016109a5565b82516001600160a01b038516600090815260066020526040902054610a8991611847565b6001600160a01b0385166000908152600660209081526040808320939093558551600d825283832033845290915291902054610ac491611847565b6001600160a01b0385166000908152600d602090815260408083203384529091528120919091555b8351811015610b9d57846001600160a01b03166342842e0e3033878581518110610b1857610b18612350565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610b7257600080fd5b505af1158015610b86573d6000803e3d6000fd5b505050508080610b9590612366565b915050610aec565b5060005b6001600160a01b0385166000908152601060209081526040808320338452909152902054811015610c965760005b8451811015610c8357848181518110610bea57610bea612350565b6020908102919091018101516001600160a01b038816600090815260108352604080822033835290935291909120805484908110610c2a57610c2a612350565b90600052602060002001541415610c7157601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475018290555b80610c7b81612366565b915050610bcf565b5080610c8e81612366565b915050610ba1565b5060158054604080516020808402820181019092528281529192610cf292918490830182828015610ce657602002820191906000526020600020905b815481526020019060010190808311610cd2575b50505050508633611a13565b60005b81811015610d37576015805480610d0e57610d0e612381565b600190038181906000526020600020016000905590558080610d2f90612366565b915050610cf5565b50846001600160a01b0316336001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb8651604051610d7e91815260200190565b60405180910390a350506001600055505050565b610d9a61186b565b6108b4611c33565b610daa61186b565b600154610dd09061010090046001600160a01b03166001600160a01b0384169083611c6e565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa2891015b60405180910390a15050565b610e1f61186b565b60005b600254811015610e6e57610e5c60028281548110610e4257610e42612350565b60009182526020822001546001600160a01b031690611977565b80610e6681612366565b915050610e22565b506009544210610e8e57600a54610e86908290611853565b600b55610ed1565b600954600090610e9e9042611847565b90506000610eb7600b548361183b90919063ffffffff16565b600a54909150610ecb90610891858461185f565b600b5550505b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610f3357600080fd5b505afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b9190612397565b9050610f82600a548261185390919063ffffffff16565b600b541115610fd35760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f2068696768000000000000000060448201526064016109a5565b60005b60025481101561102f57426007600060028481548110610ff857610ff8612350565b60009182526020808320909101546001600160a01b031683528201929092526040019020558061102781612366565b915050610fd6565b50600a5461103e90429061185f565b600955600c8290556040518281527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d90602001610e0b565b6002818154811061108657600080fd5b6000918252602090912001546001600160a01b0316905081565b600260005414156110c35760405162461bcd60e51b81526004016109a5906122e4565b600260005560135434146111195760405162461bcd60e51b815260206004820152601760248201527f636c61696d20666565206973206e6f7420656e6f75676800000000000000000060448201526064016109a5565b60005b600254811015611169576111576002828154811061113c5761113c612350565b6000918252602090912001546001600160a01b031633611977565b8061116181612366565b91505061111c565b503360009081526008602052604090205480156111fb57336000818152600860205260408120556111c5907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169083611c6e565b60405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b506001600055565b600260005414156112265760405162461bcd60e51b81526004016109a5906122e4565b6002600055611233611cc5565b813361123f8282611977565b825160115461124e9190612331565b341461129c5760405162461bcd60e51b815260206004820152601760248201527f7374616b6520666565206973206e6f7420656e6f75676800000000000000000060448201526064016109a5565b60008351116112e25760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081cdd185ad9480c081b999d60721b60448201526064016109a5565b6001600160a01b03841660009081526004602052604090205460ff1661134a5760405162461bcd60e51b815260206004820152601960248201527f436f6c6c656374696f6e206973206e6f7420616c6c6f7765640000000000000060448201526064016109a5565b82516001600160a01b03851660009081526006602052604090205461136e9161185f565b6001600160a01b0385166000908152600660209081526040808320939093558551600d8252838320338452909152919020546113a99161185f565b6001600160a01b0385166000908152600d602090815260408083203384529091528120919091555b83518110156114d757846001600160a01b03166342842e0e33308785815181106113fd576113fd612350565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561145757600080fd5b505af115801561146b573d6000803e3d6000fd5b505050506001600160a01b0385166000908152601060209081526040808320338452909152902084518590839081106114a6576114a6612350565b60209081029190910181015182546001810184556000938452919092200155806114cf81612366565b9150506113d1565b50836001600160a01b0316336001600160a01b03167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd7855160405161151e91815260200190565b60405180910390a3505060016000555050565b61153961186b565b60095442116115d65760405162461bcd60e51b815260206004820152605860248201527f50726576696f7573207265776172647320706572696f64206d7573742062652060448201527f636f6d706c657465206265666f7265206368616e67696e67207468652064757260648201527f6174696f6e20666f7220746865206e657720706572696f640000000000000000608482015260a4016109a5565b600a8190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39060200160405180910390a150565b61161961186b565b601192909255601255601355565b6014546001600160a01b03166116785760405162461bcd60e51b815260206004820152601660248201527518da185c99d954185e5959481a5cc81b9bdd081cd95d60521b60448201526064016109a5565b6014546001600160a01b031633146116d25760405162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063686172676550617965652063616e20636c61696d20666565000060448201526064016109a5565b60405133904780156108fc02916000818181858888f193505050501580156116fe573d6000803e3d6000fd5b50565b6001600160a01b03811660009081526006602052604081205461173a57506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600660209081526040808320546003835281842054600b54600790945291909320546117bf936117a09390926108919260649284929161179a91670de0b6b3a764000091839190829061085f61096b565b9061183b565b6001600160a01b0384166000908152600560205260409020549061185f565b92915050565b6117cd61186b565b6001600160a01b0381166118325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109a5565b6116fe8161191d565b600061089d8284612331565b600061089d82846123b0565b600061089d82846123c7565b600061089d82846123e9565b6001546001600160a01b036101009091041633146108b45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109a5565b6118d3611d0b565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61198082611701565b6001600160a01b0383166000908152600560205260409020556119a161096b565b6001600160a01b03808416600090815260076020526040902091909155811615611a0f576119cf8282610807565b6001600160a01b0380831660008181526008602090815260408083209590955592861681526005835283812054600e845284822092825291909252919020555b5050565b6001600160a01b0380831660009081526010602090815260408083209385168352929052205483511115611a7c5760405162461bcd60e51b815260206004820152601060248201526f546f6f206d616e7920696e646963657360801b60448201526064016109a5565b82516001600160a01b0380841660009081526010602090815260408083209386168352929052908120549091611ab1916123b0565b67ffffffffffffffff811115611ac957611ac961203e565b604051908082528060200260200182016040528015611af2578160200160208202803683370190505b5090506000805b6001600160a01b03808616600090815260106020908152604080832093881683529290522054811015611bf5576000805b8751811015611b6f57878181518110611b4557611b45612350565b6020026020010151831415611b5d5760019150611b6f565b80611b6781612366565b915050611b2a565b5080611be2576001600160a01b038087166000908152601060209081526040808320938916835292905220805483908110611bac57611bac612350565b9060005260206000200154848481518110611bc957611bc9612350565b602090810291909101015282611bde81612366565b9350505b5080611bed81612366565b915050611af9565b506001600160a01b03808516600090815260106020908152604080832093871683529281529190208351611c2b92850190611fa7565b505050505050565b611c3b611cc5565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833611900565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611cc0908490611d54565b505050565b60015460ff16156108b45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016109a5565b60015460ff166108b45760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016109a5565b6000611da9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e269092919063ffffffff16565b805190915015611cc05780806020019051810190611dc79190612401565b611cc05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109a5565b6060611e358484600085611e3d565b949350505050565b606082471015611e9e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109a5565b6001600160a01b0385163b611ef55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109a5565b600080866001600160a01b03168587604051611f119190612453565b60006040518083038185875af1925050503d8060008114611f4e576040519150601f19603f3d011682016040523d82523d6000602084013e611f53565b606091505b5091509150611f63828286611f6e565b979650505050505050565b60608315611f7d57508161089d565b825115611f8d5782518084602001fd5b8160405162461bcd60e51b81526004016109a5919061246f565b828054828255906000526020600020908101928215611fe2579160200282015b82811115611fe2578251825591602001919060010190611fc7565b50611fee929150611ff2565b5090565b5b80821115611fee5760008155600101611ff3565b80356001600160a01b038116811461201e57600080fd5b919050565b60006020828403121561203557600080fd5b61089d82612007565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561207d5761207d61203e565b604052919050565b6000806000806080858703121561209b57600080fd5b6120a485612007565b935060206120b3818701612007565b935060408601359250606086013567ffffffffffffffff808211156120d757600080fd5b818801915088601f8301126120eb57600080fd5b8135818111156120fd576120fd61203e565b61210f601f8201601f19168501612054565b9150808252898482850101111561212557600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561215857600080fd5b61216183612007565b915061216f60208401612007565b90509250929050565b6020808252825182820181905260009190848201906040850190845b818110156121b057835183529284019291840191600101612194565b50909695505050505050565b600080604083850312156121cf57600080fd5b6121d883612007565b915060208084013567ffffffffffffffff808211156121f657600080fd5b818601915086601f83011261220a57600080fd5b81358181111561221c5761221c61203e565b8060051b915061222d848301612054565b818152918301840191848101908984111561224757600080fd5b938501935b838510156122655784358252938501939085019061224c565b8096505050505050509250929050565b6000806040838503121561228857600080fd5b61229183612007565b946020939093013593505050565b6000602082840312156122b157600080fd5b5035919050565b6000806000606084860312156122cd57600080fd5b505081359360208301359350604090920135919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561234b5761234b61231b565b500290565b634e487b7160e01b600052603260045260246000fd5b600060001982141561237a5761237a61231b565b5060010190565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156123a957600080fd5b5051919050565b6000828210156123c2576123c261231b565b500390565b6000826123e457634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156123fc576123fc61231b565b500190565b60006020828403121561241357600080fd5b8151801515811461089d57600080fd5b60005b8381101561243e578181015183820152602001612426565b8381111561244d576000848401525b50505050565b60008251612465818460208701612423565b9190910192915050565b602081526000825180602084015261248e816040850160208701612423565b601f01601f1916919091016040019291505056fea26469706673582212209dd181fdd84d891af712f05fa6f124964990b740d9c05722f14a82642f117b4064736f6c634300080900330000000000000000000000006bb81ca8ec2f7ccbb08a5b1df8c32781ef3e1c2d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000002315cc59ec1d9875c2339aa868a624d6ff2e09100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006bb81ca8ec2f7ccbb08a5b1df8c32781ef3e1c2d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000002315cc59ec1d9875c2339aa868a624d6ff2e09100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x6bb81ca8ec2f7ccbb08a5b1df8c32781ef3e1c2d
Arg [1] : _collections (address[]): 0x02315cc59ec1d9875c2339aa868a624d6ff2e091
Arg [2] : _ratios (uint256[]): 100
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000006bb81ca8ec2f7ccbb08a5b1df8c32781ef3e1c2d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000002315cc59ec1d9875c2339aa868a624d6ff2e091
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed ByteCode Sourcemap
44594:12742:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45183:42;;;;;;;;;;-1:-1:-1;45183:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;529:25:1;;;517:2;502:18;45183:42:0;;;;;;;;45234:33;;;;;;;;;;;;;;;;44895:50;;;;;;;;;;-1:-1:-1;44895:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;56732:174;;;;;;;;;;-1:-1:-1;56732:174:0;;;;;:::i;:::-;-1:-1:-1;;;56732:174:0;;;;;;;;;;-1:-1:-1;;;;;;2124:33:1;;;2106:52;;2094:2;2079:18;56732:174:0;1962:202:1;44952:51:0;;;;;;;;;;-1:-1:-1;44952:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2334:14:1;;2327:22;2309:41;;2297:2;2282:18;44952:51:0;2169:187:1;49525:121:0;;;;;;;;;;;;;:::i;49104:313::-;;;;;;;;;;-1:-1:-1;49104:313:0;;;;;:::i;:::-;;:::i;45767:33::-;;;;;;;;;;;;;;;;45127:49;;;;;;;;;;-1:-1:-1;45127:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;45274:39;;;;;;;;;;;;;;;;54521:67;;;;;;;;;;;;;:::i;:::-;;46907:92;;;;;;;;;;-1:-1:-1;46907:92:0;;;;;:::i;:::-;;:::i;47832:161::-;;;;;;;;;;-1:-1:-1;47832:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6012:86::-;;;;;;;;;;-1:-1:-1;6083:7:0;;;;6012:86;;3513:103;;;;;;;;;;;;;:::i;45320:29::-;;;;;;;;;;;;;;;;48095:159;;;;;;;;;;;;;:::i;50788:1186::-;;;;;;:::i;:::-;;:::i;54317:63::-;;;;;;;;;;;;;:::i;54801:210::-;;;;;;;;;;-1:-1:-1;54801:210:0;;;;;:::i;:::-;;:::i;2865:87::-;;;;;;;;;;-1:-1:-1;2938:6:0;;;;;-1:-1:-1;;;;;2938:6:0;2865:87;;;-1:-1:-1;;;;;4711:32:1;;;4693:51;;4681:2;4666:18;2865:87:0;4547:203:1;45480:91:0;;;;;;;;;;-1:-1:-1;45480:91:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45850:33;;;;;;;;;;;;;;;;45074:46;;;;;;;;;;-1:-1:-1;45074:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;45012:55;;;;;;;;;;-1:-1:-1;45012:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;53188:981;;;;;;;;;;-1:-1:-1;53188:981:0;;;;;:::i;:::-;;:::i;44852:36::-;;;;;;;;;;-1:-1:-1;44852:36:0;;;;;:::i;:::-;;:::i;52049:503::-;;;:::i;49816:853::-;;;;;;:::i;:::-;;:::i;52720:362::-;;;;;;;;;;-1:-1:-1;52720:362:0;;;;;:::i;:::-;;:::i;46638:185::-;;;;;;;;;;-1:-1:-1;46638:185:0;;;;;:::i;:::-;;:::i;44809:36::-;;;;;;;;;;;;;;;47075:253;;;;;;;;;;;;;:::i;45807:36::-;;;;;;;;;;;;;;;;45392:81;;;;;;;;;;-1:-1:-1;45392:81:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;48375:570;;;;;;;;;;-1:-1:-1;48375:570:0;;;;;:::i;:::-;;:::i;3771:201::-;;;;;;;;;;-1:-1:-1;3771:201:0;;;;;:::i;:::-;;:::i;47522:161::-;;;;;;;;;;-1:-1:-1;47522:161:0;;;;;:::i;:::-;-1:-1:-1;;;;;47628:38:0;;;47601:7;47628:38;;;:26;:38;;;;;;;;:47;;;;;;;;;;;;;47522:161;45356:27;;;;;;;;;;;;;;;;45578:80;;;;;;;;;;-1:-1:-1;45578:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;45890:26;;;;;;;;;;-1:-1:-1;45890:26:0;;;;-1:-1:-1;;;;;45890:26:0;;;49525:121;49580:7;49607:31;49622:15;;49607:10;;:14;;:31;;;;:::i;:::-;49600:38;;49525:121;:::o;49104:313::-;-1:-1:-1;;;;;49392:16:0;;;49178:7;49392:16;;;:7;:16;;;;;;;;;49298:48;;;;;:36;:48;;;;;:57;;;;;;;;;;49178:7;;49205:204;;:172;;49372:4;;49205:152;;49267:89;;:26;49335:10;49267:14;:26::i;:::-;:30;;:89::i;:::-;-1:-1:-1;;;;;49205:38:0;;;;;;;:26;:38;;;;;;;;:47;;;;;;;;;;;:61;:152::i;:::-;:166;;:172::i;:::-;:186;;:204::i;:::-;49198:211;49104:313;-1:-1:-1;;;49104:313:0:o;54521:67::-;2751:13;:11;:13::i;:::-;54570:10:::1;:8;:10::i;:::-;54521:67::o:0;46907:92::-;2751:13;:11;:13::i;:::-;46971:11:::1;:20:::0;;-1:-1:-1;;;;;;46971:20:0::1;-1:-1:-1::0;;;;;46971:20:0;;;::::1;::::0;;;::::1;::::0;;46907:92::o;47832:161::-;-1:-1:-1;;;;;47945:34:0;;;;;;;:22;:34;;;;;;;;:40;;;;;;;;;;;;47938:47;;;;;;;;;;;;;;;;;47912:13;;47938:47;;;47945:40;47938:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47832:161;;;;:::o;3513:103::-;2751:13;:11;:13::i;:::-;3578:30:::1;3605:1;3578:18;:30::i;48095:159::-:0;48152:7;48197:14;;48179:15;:32;:67;;-1:-1:-1;48232:14:0;;;49525:121::o;48179:67::-;-1:-1:-1;48214:15:0;;48095:159::o;50788:1186::-;8817:1;9415:7;;:19;;9407:63;;;;-1:-1:-1;;;9407:63:0;;;;;;;:::i;:::-;;;;;;;;;8817:1;9548:7;:18;50889:10;50901::::1;55193:34;50889:10:::0;50901;55193:13:::1;:34::i;:::-;50959:3:::2;:10;50945:11;;:24;;;;:::i;:::-;50932:9;:37;50924:76;;;::::0;-1:-1:-1;;;50924:76:0;;6350:2:1;50924:76:0::2;::::0;::::2;6332:21:1::0;6389:2;6369:18;;;6362:30;6428:28;6408:18;;;6401:56;6474:18;;50924:76:0::2;6148:350:1::0;50924:76:0::2;51032:1;51019:3;:10;:14;51011:48;;;::::0;-1:-1:-1;;;51011:48:0;;6705:2:1;51011:48:0::2;::::0;::::2;6687:21:1::0;6744:2;6724:18;;;6717:30;-1:-1:-1;;;6763:18:1;;;6756:51;6824:18;;51011:48:0::2;6503:345:1::0;51011:48:0::2;51126:10:::0;;-1:-1:-1;;;;;51098:23:0;::::2;;::::0;;;:11:::2;:23;::::0;;;;;:39:::2;::::0;:27:::2;:39::i;:::-;-1:-1:-1::0;;;;;51072:23:0;::::2;;::::0;;;:11:::2;:23;::::0;;;;;;;:65;;;;51256:10;;51201:26:::2;:38:::0;;;;;51240:10:::2;51201:50:::0;;;;;;;;;:66:::2;::::0;:54:::2;:66::i;:::-;-1:-1:-1::0;;;;;51148:38:0;::::2;;::::0;;;:26:::2;:38;::::0;;;;;;;51187:10:::2;51148:50:::0;;;;;;;:119;;;;51278:140:::2;51302:3;:10;51298:1;:14;51278:140;;;51343:10;-1:-1:-1::0;;;;;51334:37:0::2;;51380:4;51387:10;51399:3;51403:1;51399:6;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;51334:72:::2;::::0;-1:-1:-1;;;;;;51334:72:0::2;::::0;;;;;;-1:-1:-1;;;;;7243:15:1;;;51334:72:0::2;::::0;::::2;7225:34:1::0;7295:15;;;;7275:18;;;7268:43;7327:18;;;7320:34;7160:18;;51334:72:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;51314:3;;;;;:::i;:::-;;;;51278:140;;;;51432:9;51428:304;-1:-1:-1::0;;;;;51452:34:0;::::2;;::::0;;;:22:::2;:34;::::0;;;;;;;51487:10:::2;51452:46:::0;;;;;;;:53;51448:57;::::2;51428:304;;;51531:9;51527:194;51550:3;:10;51546:1;:14;51527:194;;;51642:3;51646:1;51642:6;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;51589:34:0;::::2;;::::0;;;:22:::2;:34:::0;;;;;;51624:10:::2;51589:46:::0;;;;;;;;;:49;;51636:1;;51589:49;::::2;;;;;:::i;:::-;;;;;;;;;:59;51586:120;;;51673:5;:13:::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;51673:13:0;;;;;::::2;::::0;;;51586:120:::2;51562:3:::0;::::2;::::0;::::2;:::i;:::-;;;;51527:194;;;-1:-1:-1::0;51507:3:0;::::2;::::0;::::2;:::i;:::-;;;;51428:304;;;-1:-1:-1::0;51756:5:0::2;:12:::0;;51779:45:::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;51756:12;;51779:45:::2;::::0;;51756:12;;51779:45;::::2;51756:5:::0;:12;51779:45;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51801:10;51813;51779:14;:45::i;:::-;51839:9;51835:71;51858:3;51854:1;:7;51835:71;;;51883:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51863:3;;;;;:::i;:::-;;;;51835:71;;;;51943:10;-1:-1:-1::0;;;;;51921:45:0::2;51931:10;-1:-1:-1::0;;;;;51921:45:0::2;;51955:3;:10;51921:45;;;;529:25:1::0;;517:2;502:18;;383:177;51921:45:0::2;;;;;;;;-1:-1:-1::0;;8773:1:0;9727:7;:22;-1:-1:-1;;;50788:1186:0:o;54317:63::-;2751:13;:11;:13::i;:::-;54364:8:::1;:6;:8::i;54801:210::-:0;2751:13;:11;:13::i;:::-;2938:6;;54896:55:::1;::::0;2938:6;;;-1:-1:-1;;;;;2938:6:0;-1:-1:-1;;;;;54896:33:0;::::1;::::0;54939:11;54896:33:::1;:55::i;:::-;54967:36;::::0;;-1:-1:-1;;;;;7829:32:1;;7811:51;;7893:2;7878:18;;7871:34;;;54967:36:0::1;::::0;7784:18:1;54967:36:0::1;;;;;;;;54801:210:::0;;:::o;53188:981::-;2751:13;:11;:13::i;:::-;53264:9:::1;53259:133;53283:19;:26:::0;53279:30;::::1;53259:133;;;53331:49;53345:19;53365:1;53345:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;53345:22:0::1;::::0;53331:13:::1;:49::i;:::-;53311:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53259:133;;;;53425:14;;53406:15;:33;53402:322;;53480:15;::::0;53469:27:::1;::::0;:6;;:10:::1;:27::i;:::-;53456:10;:40:::0;53402:322:::1;;;53549:14;::::0;53529:17:::1;::::0;53549:35:::1;::::0;53568:15:::1;53549:18;:35::i;:::-;53529:55;;53599:16;53618:25;53632:10;;53618:9;:13;;:25;;;;:::i;:::-;53696:15;::::0;53599:44;;-1:-1:-1;53671:41:0::1;::::0;:20:::1;:6:::0;53599:44;53671:10:::1;:20::i;:41::-;53658:10;:54:::0;-1:-1:-1;;53402:322:0::1;53751:37;::::0;-1:-1:-1;;;53751:37:0;;53782:4:::1;53751:37;::::0;::::1;4693:51:1::0;53736:12:0::1;::::0;53751::::1;-1:-1:-1::0;;;;;53751:22:0::1;::::0;::::1;::::0;4666:18:1;;53751:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53736:52;;53821:28;53833:15;;53821:7;:11;;:28;;;;:::i;:::-;53807:10;;:42;;53799:79;;;::::0;-1:-1:-1;;;53799:79:0;;8307:2:1;53799:79:0::1;::::0;::::1;8289:21:1::0;8346:2;8326:18;;;8319:30;8385:26;8365:18;;;8358:54;8429:18;;53799:79:0::1;8105:348:1::0;53799:79:0::1;53896:9;53891:140;53915:19;:26:::0;53911:30;::::1;53891:140;;;54004:15;53963:14;:38;53978:19;53998:1;53978:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;53978:22:0::1;53963:38:::0;;;::::1;::::0;;;;;;;;:56;53943:3;::::1;::::0;::::1;:::i;:::-;;;;53891:140;;;-1:-1:-1::0;54078:15:0::1;::::0;54058:36:::1;::::0;:15:::1;::::0;:19:::1;:36::i;:::-;54041:14;:53:::0;54105:12:::1;:21:::0;;;54142:19:::1;::::0;529:25:1;;;54142:19:0::1;::::0;517:2:1;502:18;54142:19:0::1;383:177:1::0;44852:36:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44852:36:0;;-1:-1:-1;44852:36:0;:::o;52049:503::-;8817:1;9415:7;;:19;;9407:63;;;;-1:-1:-1;;;9407:63:0;;;;;;;:::i;:::-;8817:1;9548:7;:18;52132:8:::1;::::0;52119:9:::1;:21;52111:57;;;::::0;-1:-1:-1;;;52111:57:0;;8660:2:1;52111:57:0::1;::::0;::::1;8642:21:1::0;8699:2;8679:18;;;8672:30;8738:25;8718:18;;;8711:53;8781:18;;52111:57:0::1;8458:347:1::0;52111:57:0::1;52184:9;52179:133;52203:19;:26:::0;52199:30;::::1;52179:133;;;52251:49;52265:19;52285:1;52265:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;52265:22:0::1;52289:10;52251:13;:49::i;:::-;52231:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52179:133;;;-1:-1:-1::0;52347:10:0::1;52322:14;52339:19:::0;;;:7:::1;:19;::::0;;;;;52373:10;;52369:176:::1;;52408:10;52422:1;52400:19:::0;;;:7:::1;:19;::::0;;;;:23;52438:45:::1;::::0;:12:::1;-1:-1:-1::0;;;;;52438:25:0::1;::::0;52476:6;52438:25:::1;:45::i;:::-;52503:30;::::0;529:25:1;;;52514:10:0::1;::::0;52503:30:::1;::::0;517:2:1;502:18;52503:30:0::1;;;;;;;52369:176;-1:-1:-1::0;8773:1:0;9727:7;:22;52049:503::o;49816:853::-;8817:1;9415:7;;:19;;9407:63;;;;-1:-1:-1;;;9407:63:0;;;;;;;:::i;:::-;8817:1;9548:7;:18;5617:19:::1;:17;:19::i;:::-;49930:10:::2;49942;55193:34;55207:10;55219:7;55193:13;:34::i;:::-;49997:3:::3;:10;49986:8;;:21;;;;:::i;:::-;49973:9;:34;49965:70;;;::::0;-1:-1:-1;;;49965:70:0;;9012:2:1;49965:70:0::3;::::0;::::3;8994:21:1::0;9051:2;9031:18;;;9024:30;9090:25;9070:18;;;9063:53;9133:18;;49965:70:0::3;8810:347:1::0;49965:70:0::3;50067:1;50054:3;:10;:14;50046:45;;;::::0;-1:-1:-1;;;50046:45:0;;9364:2:1;50046:45:0::3;::::0;::::3;9346:21:1::0;9403:2;9383:18;;;9376:30;-1:-1:-1;;;9422:18:1;;;9415:48;9480:18;;50046:45:0::3;9162:342:1::0;50046:45:0::3;-1:-1:-1::0;;;;;50110:31:0;::::3;;::::0;;;:19:::3;:31;::::0;;;;;::::3;;50102:69;;;::::0;-1:-1:-1;;;50102:69:0;;9711:2:1;50102:69:0::3;::::0;::::3;9693:21:1::0;9750:2;9730:18;;;9723:30;9789:27;9769:18;;;9762:55;9834:18;;50102:69:0::3;9509:349:1::0;50102:69:0::3;50238:10:::0;;-1:-1:-1;;;;;50210:23:0;::::3;;::::0;;;:11:::3;:23;::::0;;;;;:39:::3;::::0;:27:::3;:39::i;:::-;-1:-1:-1::0;;;;;50184:23:0;::::3;;::::0;;;:11:::3;:23;::::0;;;;;;;:65;;;;50368:10;;50313:26:::3;:38:::0;;;;;50352:10:::3;50313:50:::0;;;;;;;;;:66:::3;::::0;:54:::3;:66::i;:::-;-1:-1:-1::0;;;;;50260:38:0;::::3;;::::0;;;:26:::3;:38;::::0;;;;;;;50299:10:::3;50260:50:::0;;;;;;;:119;;;;50390:214:::3;50414:3;:10;50410:1;:14;50390:214;;;50455:10;-1:-1:-1::0;;;;;50446:37:0::3;;50484:10;50504:4;50511:3;50515:1;50511:6;;;;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;50446:72:::3;::::0;-1:-1:-1;;;;;;50446:72:0::3;::::0;;;;;;-1:-1:-1;;;;;7243:15:1;;;50446:72:0::3;::::0;::::3;7225:34:1::0;7295:15;;;;7275:18;;;7268:43;7327:18;;;7320:34;7160:18;;50446:72:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;;;;;;;;;50533:34:0;::::3;;::::0;;;:22:::3;:34;::::0;;;;;;;50568:10:::3;50533:46:::0;;;;;;;50585:6;;;;50589:1;;50585:6;::::3;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;50533:59;;::::3;::::0;::::3;::::0;;-1:-1:-1;50533:59:0;;;;;;;::::3;::::0;50426:3;::::3;::::0;::::3;:::i;:::-;;;;50390:214;;;;50638:10;-1:-1:-1::0;;;;;50619:42:0::3;50626:10;-1:-1:-1::0;;;;;50619:42:0::3;;50650:3;:10;50619:42;;;;529:25:1::0;;517:2;502:18;;383:177;50619:42:0::3;;;;;;;;-1:-1:-1::0;;8773:1:0;9727:7;:22;-1:-1:-1;;49816:853:0:o;52720:362::-;2751:13;:11;:13::i;:::-;52844:14:::1;;52826:15;:32;52804:170;;;::::0;-1:-1:-1;;;52804:170:0;;10065:2:1;52804:170:0::1;::::0;::::1;10047:21:1::0;10104:2;10084:18;;;10077:30;10143:34;10123:18;;;10116:62;10214:34;10194:18;;;10187:62;10286:26;10265:19;;;10258:55;10330:19;;52804:170:0::1;9863:492:1::0;52804:170:0::1;52985:15;:34:::0;;;53035:39:::1;::::0;529:25:1;;;53035:39:0::1;::::0;517:2:1;502:18;53035:39:0::1;;;;;;;52720:362:::0;:::o;46638:185::-;2751:13;:11;:13::i;:::-;46736:8:::1;:17:::0;;;;46764:11:::1;:23:::0;46798:8:::1;:17:::0;46638:185::o;47075:253::-;47127:11;;-1:-1:-1;;;;;47127:11:0;47119:60;;;;-1:-1:-1;;;47119:60:0;;10562:2:1;47119:60:0;;;10544:21:1;10601:2;10581:18;;;10574:30;-1:-1:-1;;;10620:18:1;;;10613:52;10682:18;;47119:60:0;10360:346:1;47119:60:0;47212:11;;-1:-1:-1;;;;;47212:11:0;47198:10;:25;47190:68;;;;-1:-1:-1;;;47190:68:0;;10913:2:1;47190:68:0;;;10895:21:1;10952:2;10932:18;;;10925:30;10991:32;10971:18;;;10964:60;11041:18;;47190:68:0;10711:354:1;47190:68:0;47269:51;;47277:10;;47298:21;47269:51;;;;;;;;;47298:21;47277:10;47269:51;;;;;;;;;;;;;;;;;;;;;47075:253::o;48375:570::-;-1:-1:-1;;;;;48464:23:0;;48440:7;48464:23;;;:11;:23;;;;;;48460:100;;-1:-1:-1;;;;;;48516:32:0;;;;;:20;:32;;;;;;;48375:570::o;48460:100::-;-1:-1:-1;;;;;48898:23:0;;;;;;:11;:23;;;;;;;;;48820:15;:27;;;;;;48758:10;;48708:14;:26;;;;;;;;48590:347;;48659:263;;48898:23;;48659:216;;48871:3;;48659:216;;48820:27;48659:138;;48792:4;;48659:138;;48758:10;48659:138;;:26;:24;:26::i;:76::-;:98;;:110::i;:263::-;-1:-1:-1;;;;;48590:32:0;;;;;;:20;:32;;;;;;;:50;:347::i;:::-;48570:367;48375:570;-1:-1:-1;;48375:570:0:o;3771:201::-;2751:13;:11;:13::i;:::-;-1:-1:-1;;;;;3860:22:0;::::1;3852:73;;;::::0;-1:-1:-1;;;3852:73:0;;11272:2:1;3852:73:0::1;::::0;::::1;11254:21:1::0;11311:2;11291:18;;;11284:30;11350:34;11330:18;;;11323:62;-1:-1:-1;;;11401:18:1;;;11394:36;11447:19;;3852:73:0::1;11070:402:1::0;3852:73:0::1;3936:28;3955:8;3936:18;:28::i;13389:98::-:0;13447:7;13474:5;13478:1;13474;:5;:::i;13032:98::-;13090:7;13117:5;13121:1;13117;:5;:::i;13788:98::-;13846:7;13873:5;13877:1;13873;:5;:::i;12651:98::-;12709:7;12736:5;12740:1;12736;:5;:::i;3030:132::-;2938:6;;-1:-1:-1;;;;;2938:6:0;;;;;1487:10;3094:23;3086:68;;;;-1:-1:-1;;;3086:68:0;;12164:2:1;3086:68:0;;;12146:21:1;;;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12294:18;;3086:68:0;11962:356:1;6867:120:0;5876:16;:14;:16::i;:::-;6926:7:::1;:15:::0;;-1:-1:-1;;6926:15:0::1;::::0;;6957:22:::1;1487:10:::0;6966:12:::1;6957:22;::::0;-1:-1:-1;;;;;4711:32:1;;;4693:51;;4681:2;4666:18;6957:22:0::1;;;;;;;6867:120::o:0;4132:191::-;4225:6;;;-1:-1:-1;;;;;4242:17:0;;;4225:6;4242:17;;;-1:-1:-1;;;;;;4242:17:0;;;;;;4275:40;;4225:6;;;;;;;;4275:40;;4206:16;;4275:40;4195:128;4132:191;:::o;55376:432::-;55491:26;55506:10;55491:14;:26::i;:::-;-1:-1:-1;;;;;55456:32:0;;;;;;:20;:32;;;;;:61;55557:26;:24;:26::i;:::-;-1:-1:-1;;;;;55528:26:0;;;;;;;:14;:26;;;;;:55;;;;55598:21;;;55594:207;;55655:27;55662:10;55674:7;55655:6;:27::i;:::-;-1:-1:-1;;;;;55636:16:0;;;;;;;:7;:16;;;;;;;;:46;;;;55757:32;;;;;:20;:32;;;;;;55697:36;:48;;;;;:57;;;;;;;;;;:92;55594:207;55376:432;;:::o;55816:908::-;-1:-1:-1;;;;;55943:34:0;;;;;;;:22;:34;;;;;;;;:40;;;;;;;;;:47;55925:14;;:65;;55917:94;;;;-1:-1:-1;;;55917:94:0;;12525:2:1;55917:94:0;;;12507:21:1;12564:2;12544:18;;;12537:30;-1:-1:-1;;;12583:18:1;;;12576:46;12639:18;;55917:94:0;12323:340:1;55917:94:0;56107:14;;-1:-1:-1;;;;;56057:34:0;;;56022:21;56057:34;;;:22;:34;;;;;;;;:40;;;;;;;;;;;:47;56022:21;;56057:64;;;:::i;:::-;56046:76;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56046:76:0;;56022:100;;56133:14;56167:6;56162:494;-1:-1:-1;;;;;56183:34:0;;;;;;;:22;:34;;;;;;;;:40;;;;;;;;;:47;56179:51;;56162:494;;;56252:18;56298:6;56293:189;56314:7;:14;56310:1;:18;56293:189;;;56364:7;56372:1;56364:10;;;;;;;;:::i;:::-;;;;;;;56359:1;:15;56355:112;;;56415:4;56399:20;;56442:5;;56355:112;56330:3;;;;:::i;:::-;;;;56293:189;;;;56501:13;56496:149;;-1:-1:-1;;;;;56556:34:0;;;;;;;:22;:34;;;;;;;;:40;;;;;;;;;:43;;56597:1;;56556:43;;;;;;:::i;:::-;;;;;;;;;56535:7;56543:9;56535:18;;;;;;;;:::i;:::-;;;;;;;;;;:64;56618:11;;;;:::i;:::-;;;;56496:149;-1:-1:-1;56232:3:0;;;;:::i;:::-;;;;56162:494;;;-1:-1:-1;;;;;;56666:34:0;;;;;;;:22;:34;;;;;;;;:40;;;;;;;;;;;:50;;;;;;;;:::i;:::-;;55906:818;;55816:908;;;:::o;6608:118::-;5617:19;:17;:19::i;:::-;6678:4:::1;6668:14:::0;;-1:-1:-1;;6668:14:0::1;::::0;::::1;::::0;;6698:20:::1;1487:10:::0;6705:12:::1;1407:98:::0;40642:211;40786:58;;;-1:-1:-1;;;;;7829:32:1;;40786:58:0;;;7811:51:1;7878:18;;;;7871:34;;;40786:58:0;;;;;;;;;;7784:18:1;;;;40786:58:0;;;;;;;;-1:-1:-1;;;;;40786:58:0;-1:-1:-1;;;40786:58:0;;;40759:86;;40779:5;;40759:19;:86::i;:::-;40642:211;;;:::o;6171:108::-;6083:7;;;;6241:9;6233:38;;;;-1:-1:-1;;;6233:38:0;;12870:2:1;6233:38:0;;;12852:21:1;12909:2;12889:18;;;12882:30;-1:-1:-1;;;12928:18:1;;;12921:46;12984:18;;6233:38:0;12668:340:1;6356:108:0;6083:7;;;;6415:41;;;;-1:-1:-1;;;6415:41:0;;13215:2:1;6415:41:0;;;13197:21:1;13254:2;13234:18;;;13227:30;-1:-1:-1;;;13273:18:1;;;13266:50;13333:18;;6415:41:0;13013:344:1;43709:716:0;44133:23;44159:69;44187:4;44159:69;;;;;;;;;;;;;;;;;44167:5;-1:-1:-1;;;;;44159:27:0;;;:69;;;;;:::i;:::-;44243:17;;44133:95;;-1:-1:-1;44243:21:0;44239:179;;44340:10;44329:30;;;;;;;;;;;;:::i;:::-;44321:85;;;;-1:-1:-1;;;44321:85:0;;13846:2:1;44321:85:0;;;13828:21:1;13885:2;13865:18;;;13858:30;13924:34;13904:18;;;13897:62;-1:-1:-1;;;13975:18:1;;;13968:40;14025:19;;44321:85:0;13644:406:1;32968:229:0;33105:12;33137:52;33159:6;33167:4;33173:1;33176:12;33137:21;:52::i;:::-;33130:59;32968:229;-1:-1:-1;;;;32968:229:0:o;34088:510::-;34258:12;34316:5;34291:21;:30;;34283:81;;;;-1:-1:-1;;;34283:81:0;;14257:2:1;34283:81:0;;;14239:21:1;14296:2;14276:18;;;14269:30;14335:34;14315:18;;;14308:62;-1:-1:-1;;;14386:18:1;;;14379:36;14432:19;;34283:81:0;14055:402:1;34283:81:0;-1:-1:-1;;;;;30518:19:0;;;34375:60;;;;-1:-1:-1;;;34375:60:0;;14664:2:1;34375:60:0;;;14646:21:1;14703:2;14683:18;;;14676:30;14742:31;14722:18;;;14715:59;14791:18;;34375:60:0;14462:353:1;34375:60:0;34449:12;34463:23;34490:6;-1:-1:-1;;;;;34490:11:0;34509:5;34516:4;34490:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34448:73;;;;34539:51;34556:7;34565:10;34577:12;34539:16;:51::i;:::-;34532:58;34088:510;-1:-1:-1;;;;;;;34088:510:0:o;36774:762::-;36924:12;36953:7;36949:580;;;-1:-1:-1;36984:10:0;36977:17;;36949:580;37098:17;;:21;37094:424;;37346:10;37340:17;37407:15;37394:10;37390:2;37386:19;37379:44;37094:424;37489:12;37482:20;;-1:-1:-1;;;37482:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;565:127::-;626:10;621:3;617:20;614:1;607:31;657:4;654:1;647:15;681:4;678:1;671:15;697:275;768:2;762:9;833:2;814:13;;-1:-1:-1;;810:27:1;798:40;;868:18;853:34;;889:22;;;850:62;847:88;;;915:18;;:::i;:::-;951:2;944:22;697:275;;-1:-1:-1;697:275:1:o;977:980::-;1072:6;1080;1088;1096;1149:3;1137:9;1128:7;1124:23;1120:33;1117:53;;;1166:1;1163;1156:12;1117:53;1189:29;1208:9;1189:29;:::i;:::-;1179:39;;1237:2;1258:38;1292:2;1281:9;1277:18;1258:38;:::i;:::-;1248:48;;1343:2;1332:9;1328:18;1315:32;1305:42;;1398:2;1387:9;1383:18;1370:32;1421:18;1462:2;1454:6;1451:14;1448:34;;;1478:1;1475;1468:12;1448:34;1516:6;1505:9;1501:22;1491:32;;1561:7;1554:4;1550:2;1546:13;1542:27;1532:55;;1583:1;1580;1573:12;1532:55;1619:2;1606:16;1641:2;1637;1634:10;1631:36;;;1647:18;;:::i;:::-;1689:53;1732:2;1713:13;;-1:-1:-1;;1709:27:1;1705:36;;1689:53;:::i;:::-;1676:66;;1765:2;1758:5;1751:17;1805:7;1800:2;1795;1791;1787:11;1783:20;1780:33;1777:53;;;1826:1;1823;1816:12;1777:53;1881:2;1876;1872;1868:11;1863:2;1856:5;1852:14;1839:45;1925:1;1920:2;1915;1908:5;1904:14;1900:23;1893:34;;1946:5;1936:15;;;;;977:980;;;;;;;:::o;2361:260::-;2429:6;2437;2490:2;2478:9;2469:7;2465:23;2461:32;2458:52;;;2506:1;2503;2496:12;2458:52;2529:29;2548:9;2529:29;:::i;:::-;2519:39;;2577:38;2611:2;2600:9;2596:18;2577:38;:::i;:::-;2567:48;;2361:260;;;;;:::o;2626:632::-;2797:2;2849:21;;;2919:13;;2822:18;;;2941:22;;;2768:4;;2797:2;3020:15;;;;2994:2;2979:18;;;2768:4;3063:169;3077:6;3074:1;3071:13;3063:169;;;3138:13;;3126:26;;3207:15;;;;3172:12;;;;3099:1;3092:9;3063:169;;;-1:-1:-1;3249:3:1;;2626:632;-1:-1:-1;;;;;;2626:632:1:o;3263:1020::-;3356:6;3364;3417:2;3405:9;3396:7;3392:23;3388:32;3385:52;;;3433:1;3430;3423:12;3385:52;3456:29;3475:9;3456:29;:::i;:::-;3446:39;;3504:2;3557;3546:9;3542:18;3529:32;3580:18;3621:2;3613:6;3610:14;3607:34;;;3637:1;3634;3627:12;3607:34;3675:6;3664:9;3660:22;3650:32;;3720:7;3713:4;3709:2;3705:13;3701:27;3691:55;;3742:1;3739;3732:12;3691:55;3778:2;3765:16;3800:2;3796;3793:10;3790:36;;;3806:18;;:::i;:::-;3852:2;3849:1;3845:10;3835:20;;3875:28;3899:2;3895;3891:11;3875:28;:::i;:::-;3937:15;;;4007:11;;;4003:20;;;3968:12;;;;4035:19;;;4032:39;;;4067:1;4064;4057:12;4032:39;4091:11;;;;4111:142;4127:6;4122:3;4119:15;4111:142;;;4193:17;;4181:30;;4144:12;;;;4231;;;;4111:142;;;4272:5;4262:15;;;;;;;;3263:1020;;;;;:::o;4288:254::-;4356:6;4364;4417:2;4405:9;4396:7;4392:23;4388:32;4385:52;;;4433:1;4430;4423:12;4385:52;4456:29;4475:9;4456:29;:::i;:::-;4446:39;4532:2;4517:18;;;;4504:32;;-1:-1:-1;;;4288:254:1:o;4755:180::-;4814:6;4867:2;4855:9;4846:7;4842:23;4838:32;4835:52;;;4883:1;4880;4873:12;4835:52;-1:-1:-1;4906:23:1;;4755:180;-1:-1:-1;4755:180:1:o;4940:316::-;5017:6;5025;5033;5086:2;5074:9;5065:7;5061:23;5057:32;5054:52;;;5102:1;5099;5092:12;5054:52;-1:-1:-1;;5125:23:1;;;5195:2;5180:18;;5167:32;;-1:-1:-1;5246:2:1;5231:18;;;5218:32;;4940:316;-1:-1:-1;4940:316:1:o;5483:355::-;5685:2;5667:21;;;5724:2;5704:18;;;5697:30;5763:33;5758:2;5743:18;;5736:61;5829:2;5814:18;;5483:355::o;5843:127::-;5904:10;5899:3;5895:20;5892:1;5885:31;5935:4;5932:1;5925:15;5959:4;5956:1;5949:15;5975:168;6015:7;6081:1;6077;6073:6;6069:14;6066:1;6063:21;6058:1;6051:9;6044:17;6040:45;6037:71;;;6088:18;;:::i;:::-;-1:-1:-1;6128:9:1;;5975:168::o;6853:127::-;6914:10;6909:3;6905:20;6902:1;6895:31;6945:4;6942:1;6935:15;6969:4;6966:1;6959:15;7365:135;7404:3;-1:-1:-1;;7425:17:1;;7422:43;;;7445:18;;:::i;:::-;-1:-1:-1;7492:1:1;7481:13;;7365:135::o;7505:127::-;7566:10;7561:3;7557:20;7554:1;7547:31;7597:4;7594:1;7587:15;7621:4;7618:1;7611:15;7916:184;7986:6;8039:2;8027:9;8018:7;8014:23;8010:32;8007:52;;;8055:1;8052;8045:12;8007:52;-1:-1:-1;8078:16:1;;7916:184;-1:-1:-1;7916:184:1:o;11477:125::-;11517:4;11545:1;11542;11539:8;11536:34;;;11550:18;;:::i;:::-;-1:-1:-1;11587:9:1;;11477:125::o;11607:217::-;11647:1;11673;11663:132;;11717:10;11712:3;11708:20;11705:1;11698:31;11752:4;11749:1;11742:15;11780:4;11777:1;11770:15;11663:132;-1:-1:-1;11809:9:1;;11607:217::o;11829:128::-;11869:3;11900:1;11896:6;11893:1;11890:13;11887:39;;;11906:18;;:::i;:::-;-1:-1:-1;11942:9:1;;11829:128::o;13362:277::-;13429:6;13482:2;13470:9;13461:7;13457:23;13453:32;13450:52;;;13498:1;13495;13488:12;13450:52;13530:9;13524:16;13583:5;13576:13;13569:21;13562:5;13559:32;13549:60;;13605:1;13602;13595:12;14820:258;14892:1;14902:113;14916:6;14913:1;14910:13;14902:113;;;14992:11;;;14986:18;14973:11;;;14966:39;14938:2;14931:10;14902:113;;;15033:6;15030:1;15027:13;15024:48;;;15068:1;15059:6;15054:3;15050:16;15043:27;15024:48;;14820:258;;;:::o;15083:274::-;15212:3;15250:6;15244:13;15266:53;15312:6;15307:3;15300:4;15292:6;15288:17;15266:53;:::i;:::-;15335:16;;;;;15083:274;-1:-1:-1;;15083:274:1:o;15362:383::-;15511:2;15500:9;15493:21;15474:4;15543:6;15537:13;15586:6;15581:2;15570:9;15566:18;15559:34;15602:66;15661:6;15656:2;15645:9;15641:18;15636:2;15628:6;15624:15;15602:66;:::i;:::-;15729:2;15708:15;-1:-1:-1;;15704:29:1;15689:45;;;;15736:2;15685:54;;15362:383;-1:-1:-1;;15362:383:1:o
Swarm Source
ipfs://9dd181fdd84d891af712f05fa6f124964990b740d9c05722f14a82642f117b40
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.