Contract Overview
Balance:
0 CRO
CRO Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 3 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x301696e0702ec3e06568b9fb6edbbcd23b06497bd84149d4ba015fd054854d03 | 8547065 | 9 days 1 hr ago | 0x750212f017ce542fc5984486e72618e0987cd37f | 0xe473feadd332c549445af2155d70e4fd35252a8d | 15 CRO | ||
0xb1ec7ebec92ac31a4531e46f130e05d13e702f33b2abd7bc6a0ede3ba3d0cd5f | 8538569 | 9 days 15 hrs ago | 0x750212f017ce542fc5984486e72618e0987cd37f | 0xe473feadd332c549445af2155d70e4fd35252a8d | 9 CRO | ||
0xd530daa8590f62b033553d759e6b63c581902a89fec95f22e0565d08ad9be763 | 8537796 | 9 days 16 hrs ago | 0x750212f017ce542fc5984486e72618e0987cd37f | 0xe473feadd332c549445af2155d70e4fd35252a8d | 7 CRO |
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
StakeV2
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-05-26 */ // 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; } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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`. * * 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 approved 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 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 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 ) external; /** * @dev Transfers `tokenId` token 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; /** * @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; /** * @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); } // File @openzeppelin/contracts/token/ERC721/[email protected] // // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ 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; contract StakeV2 is ReentrancyGuard, Pausable, Ownable, IERC721Receiver { using SafeMath for uint256; using SafeERC20 for IERC20; struct Data { uint[] dataArray; } /* ========== STATE VARIABLES ========== */ IERC20 public rewardsToken; address[] public collectionAddresses; mapping(address => uint256) public collectionRatio; mapping(address => bool) public isAllowedCollection; mapping(address => uint256) public totalStaked; mapping(address => uint256[]) public nftIds; mapping(address => mapping(address => uint256)) public collectionToUserToBalances; mapping(address => uint256) public rewardPerTokenStored; mapping(address => uint256) public lastUpdateTime; uint256 public periodFinish = 0; uint256 public rewardsDuration = 7 days; uint256 public rewardRate = 0; mapping(address => mapping(address => uint256)) public collectionToUserToRewardPerTokenPaid; mapping(address => uint256) public rewards; mapping(address => mapping(address => uint256)) public collectionToUserToRewards; // fee uint256 public chargeStake = 1 ether; uint256 public chargeWithdraw = 1 ether; uint256 public chargeClaim = 2 ether; address public chargePayee; mapping(address => Data) private nftId; function getNFTIDs(address _address) public view returns (uint[] memory) { return nftId[_address].dataArray; } /* ========== CONSTRUCTOR ========== */ constructor( address _rewardsToken, address[] memory _collections, uint256[] memory _ratios ) public 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; } } /* ========== VIEWS ========== */ function balanceOf(address collection, address account) external view returns (uint256) { return collectionToUserToBalances[collection][account]; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp < periodFinish ? block.timestamp : periodFinish; } 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]) ); } 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]); } function getRewardForDuration() external view returns (uint256) { return rewardRate.mul(rewardsDuration); } /* ========== FEE FUNCTIONS ========== */ function setChargeFee(uint256 _stake, uint256 _withdraw, uint256 _claim) onlyOwner() public { chargeStake = _stake; chargeWithdraw = _withdraw; chargeClaim = _claim; } function setChargePayee(address _payee) onlyOwner() public { chargePayee = _payee; } 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); } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(address collection, uint256[] memory ids) external payable nonReentrant whenNotPaused updateReward(collection, msg.sender) { require(msg.value == chargeStake * 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++) { nftIds[msg.sender].push(ids[i]); nftId[msg.sender].dataArray.push(ids[i]); IERC721(collection).safeTransferFrom(msg.sender, address(this), ids[i]); } emit Staked(msg.sender, collection, ids.length); } function totalNftStaked() public view returns(uint256){ return nftIds[msg.sender].length; } function withdraw(address collection, uint256[] memory ids) public payable nonReentrant updateReward(collection, msg.sender) { require(msg.value == chargeWithdraw * 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++) { IERC721(collection).safeTransferFrom(address(this), msg.sender, ids[i]); } emit Withdrawn(msg.sender, collection, ids.length); } function getReward() public payable nonReentrant { require(msg.value == chargeClaim, "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 ========== */ function notifyRewardAmount(uint256 reward) external onlyOwner { for (uint256 i = 0; i < collectionAddresses.length; i++) { _updateReward(collectionAddresses[i], address(0)); } if (block.timestamp >= periodFinish) { rewardRate = reward.div(rewardsDuration); } else { uint256 remaining = periodFinish.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; } periodFinish = block.timestamp.add(rewardsDuration); emit RewardAdded(reward); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { IERC20(tokenAddress).safeTransfer(owner(), tokenAmount); emit Recovered(tokenAddress, tokenAmount); } function setRewardsDuration(uint256 _rewardsDuration) external onlyOwner { require( block.timestamp > periodFinish, "Previous rewards period must be complete before changing the duration for the new period" ); rewardsDuration = _rewardsDuration; emit RewardsDurationUpdated(rewardsDuration); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } /* ========== MODIFIERS ========== */ modifier updateReward(address collection, address account) { _updateReward(collection, account); _; } 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 changeRewardToken(IERC20 newtokenAddress) external onlyOwner { rewardsToken = IERC20(newtokenAddress); } function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) external override pure returns (bytes4) { return 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":[{"internalType":"contract IERC20","name":"newtokenAddress","type":"address"}],"name":"changeRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chargeClaim","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":"chargeStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chargeWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimChargeFee","outputs":[],"stateMutability":"nonpayable","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":[{"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":[{"internalType":"address","name":"_address","type":"address"}],"name":"getNFTIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getRewardForDuration","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":"uint256","name":"","type":"uint256"}],"name":"nftIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"notifyRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","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":[],"name":"periodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"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":"setChargeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payee","type":"address"}],"name":"setChargePayee","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":"totalNftStaked","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"}]
Contract Creation Code
60806040526000600b5562093a80600c556000600d55670de0b6b3a7640000601155670de0b6b3a7640000601255671bc16d674ec800006013553480156200004657600080fd5b50604051620025a2380380620025a283398101604081905262000069916200037b565b60016000819055805460ff191690556200008333620001a1565b600280546001600160a01b0319166001600160a01b0385161790558151620000b3906003906020850190620001fb565b50601480546001600160a01b0319163317905560005b82518110156200019757818181518110620000e857620000e86200045f565b6020026020010151600460008584815181106200010957620001096200045f565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506001600560008584815181106200015057620001506200045f565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806200018e8162000475565b915050620000c9565b505050506200049d565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000253579160200282015b828111156200025357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200021c565b506200026192915062000265565b5090565b5b8082111562000261576000815560010162000266565b80516001600160a01b03811681146200029457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620002da57620002da62000299565b604052919050565b60006001600160401b03821115620002fe57620002fe62000299565b5060051b60200190565b600082601f8301126200031a57600080fd5b81516020620003336200032d83620002e2565b620002af565b82815260059290921b840181019181810190868411156200035357600080fd5b8286015b8481101562000370578051835291830191830162000357565b509695505050505050565b6000806000606084860312156200039157600080fd5b6200039c846200027c565b602085810151919450906001600160401b0380821115620003bc57600080fd5b818701915087601f830112620003d157600080fd5b8151620003e26200032d82620002e2565b81815260059190911b8301840190848101908a8311156200040257600080fd5b938501935b828510156200042b576200041b856200027c565b8252938501939085019062000407565b60408a015190975094505050808311156200044557600080fd5b5050620004558682870162000308565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b6000600182016200049657634e487b7160e01b600052601160045260246000fd5b5060010190565b6120f580620004ad6000396000f3fe60806040526004361061025c5760003560e01c80638da5cb5b11610144578063e7e82b80116100b6578063f60a038d1161007a578063f60a038d14610741578063f7888aec14610761578063f7db8ded146107a7578063faaec849146107df578063fc5ba1a414610801578063fd41710c1461082157600080fd5b8063e7e82b801461069e578063ebe2b12b146106b3578063f055cbf5146106c9578063f122977714610701578063f2fde38b1461072157600080fd5b8063b03d726711610108578063b03d7267146105e8578063c9a3911e14610615578063cc1a378f14610628578063d0e63afb14610648578063d1af0c7d1461065e578063e2c4ea9a1461067e57600080fd5b80638da5cb5b146104ff5780639159b475146105365780639bfd8d611461056e5780639ce43f901461059b578063abae977f146105c857600080fd5b80633c6b16ab116101dd578063715018a6116101a1578063715018a6146104775780637b0a47ee1461048c57806380faa57d146104a25780638293744b146104b75780638456cb59146104ca5780638980f11f146104df57600080fd5b80633c6b16ab1461040c5780633d18b9121461042c5780633f4ba83a146104345780633febeb2c146104495780635c975abb1461045f57600080fd5b80631604b58e116102245780631604b58e146103545780631c1f78eb14610394578063211dc32d146103a95780632ce9aead146103c9578063386a9525146103f657600080fd5b80630700037d14610261578063088ab8ce146102a1578063110427e7146102c3578063134102d6146102e3578063150b7a0214610310575b600080fd5b34801561026d57600080fd5b5061028e61027c366004611c65565b600f6020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004611c65565b610837565b005b3480156102cf57600080fd5b5061028e6102de366004611c82565b610861565b3480156102ef57600080fd5b5061028e6102fe366004611c65565b60046020526000908152604090205481565b34801561031c57600080fd5b5061033b61032b366004611cf5565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610298565b34801561036057600080fd5b5061038461036f366004611c65565b60056020526000908152604090205460ff1681565b6040519015158152602001610298565b3480156103a057600080fd5b5061028e610892565b3480156103b557600080fd5b5061028e6103c4366004611db9565b6108b0565b3480156103d557600080fd5b5061028e6103e4366004611c65565b600a6020526000908152604090205481565b34801561040257600080fd5b5061028e600c5481565b34801561041857600080fd5b506102c1610427366004611df2565b61094f565b6102c1610b89565b34801561044057600080fd5b506102c1610ccf565b34801561045557600080fd5b5061028e60125481565b34801561046b57600080fd5b5060015460ff16610384565b34801561048357600080fd5b506102c1610ce1565b34801561049857600080fd5b5061028e600d5481565b3480156104ae57600080fd5b5061028e610cf3565b6102c16104c5366004611e0b565b610d0a565b3480156104d657600080fd5b506102c1610f75565b3480156104eb57600080fd5b506102c16104fa366004611c82565b610f85565b34801561050b57600080fd5b5060015461010090046001600160a01b03165b6040516001600160a01b039091168152602001610298565b34801561054257600080fd5b5061028e610551366004611db9565b600e60209081526000928352604080842090915290825290205481565b34801561057a57600080fd5b5061028e610589366004611c65565b60066020526000908152604090205481565b3480156105a757600080fd5b5061028e6105b6366004611c65565b60096020526000908152604090205481565b3480156105d457600080fd5b5061051e6105e3366004611df2565b610ff2565b3480156105f457600080fd5b50610608610603366004611c65565b61101c565b6040516102989190611ec6565b6102c1610623366004611e0b565b611088565b34801561063457600080fd5b506102c1610643366004611df2565b6113d2565b34801561065457600080fd5b5061028e60115481565b34801561066a57600080fd5b5060025461051e906001600160a01b031681565b34801561068a57600080fd5b506102c1610699366004611f0a565b6114b2565b3480156106aa57600080fd5b506102c16114c8565b3480156106bf57600080fd5b5061028e600b5481565b3480156106d557600080fd5b5061028e6106e4366004611db9565b600860209081526000928352604080842090915290825290205481565b34801561070d57600080fd5b5061028e61071c366004611c65565b6115a2565b34801561072d57600080fd5b506102c161073c366004611c65565b611662565b34801561074d57600080fd5b506102c161075c366004611c65565b6116d8565b34801561076d57600080fd5b5061028e61077c366004611db9565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b3480156107b357600080fd5b5061028e6107c2366004611db9565b601060209081526000928352604080842090915290825290205481565b3480156107eb57600080fd5b503360009081526007602052604090205461028e565b34801561080d57600080fd5b5060145461051e906001600160a01b031681565b34801561082d57600080fd5b5061028e60135481565b61083f611702565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6007602052816000526040600020818154811061087d57600080fd5b90600052602060002001600091509150505481565b60006108ab600c54600d5461176290919063ffffffff16565b905090565b6001600160a01b038082166000818152600f60209081526040808320549487168352600e82528083209383529290529081205490916109469161094090670de0b6b3a76400009061093a9061090e906109088a6115a2565b9061176e565b6001600160a01b03808a166000908152600860209081526040808320938c168352929052205490611762565b9061177a565b90611786565b90505b92915050565b610957611702565b60005b6003548110156109a6576109946003828154811061097a5761097a611f36565b60009182526020822001546001600160a01b031690611792565b8061099e81611f62565b91505061095a565b50600b5442106109c657600c546109be90829061177a565b600d55610a09565b600b546000906109d6904261176e565b905060006109ef600d548361176290919063ffffffff16565b600c54909150610a039061093a8584611786565b600d5550505b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190611f7b565b9050610a8d600c548261177a90919063ffffffff16565b600d541115610ae35760405162461bcd60e51b815260206004820152601860248201527f50726f76696465642072657761726420746f6f2068696768000000000000000060448201526064015b60405180910390fd5b60005b600354811015610b3f5742600a600060038481548110610b0857610b08611f36565b60009182526020808320909101546001600160a01b0316835282019290925260400190205580610b3781611f62565b915050610ae6565b50600c54610b4e904290611786565b600b556040518281527fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d906020015b60405180910390a15050565b600260005403610bab5760405162461bcd60e51b8152600401610ada90611f94565b60026000556013543414610c015760405162461bcd60e51b815260206004820152601760248201527f636c61696d20666565206973206e6f7420656e6f7567680000000000000000006044820152606401610ada565b60005b600354811015610c5157610c3f60038281548110610c2457610c24611f36565b6000918252602090912001546001600160a01b031633611792565b80610c4981611f62565b915050610c04565b50336000908152600f60205260409020548015610cc757336000818152600f6020526040812055600254610c91916001600160a01b03909116908361182e565b60405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04869060200160405180910390a25b506001600055565b610cd7611702565b610cdf611885565b565b610ce9611702565b610cdf60006118d7565b6000600b544210610d055750600b5490565b504290565b600260005403610d2c5760405162461bcd60e51b8152600401610ada90611f94565b60026000558133610d3d8282611792565b8251601254610d4c9190611fcb565b3414610d9a5760405162461bcd60e51b815260206004820152601a60248201527f776974686472617720666565206973206e6f7420656e6f7567680000000000006044820152606401610ada565b6000835111610de35760405162461bcd60e51b815260206004820152601560248201527410d85b9b9bdd081dda5d1a191c985dc80c081b999d605a1b6044820152606401610ada565b82516001600160a01b038516600090815260066020526040902054610e079161176e565b6001600160a01b03851660009081526006602090815260408083209390935585516008825283832033845290915291902054610e429161176e565b6001600160a01b03851660009081526008602090815260408083203384529091528120919091555b8351811015610f1b57846001600160a01b03166342842e0e3033878581518110610e9657610e96611f36565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505050508080610f1390611f62565b915050610e6a565b50836001600160a01b0316336001600160a01b03167fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb8551604051610f6291815260200190565b60405180910390a3505060016000555050565b610f7d611702565b610cdf611931565b610f8d611702565b600154610fb39061010090046001600160a01b03166001600160a01b038416908361182e565b604080516001600160a01b0384168152602081018390527f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa289101610b7d565b6003818154811061100257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b03811660009081526015602090815260409182902080548351818402810184019094528084526060939283018282801561107c57602002820191906000526020600020905b815481526020019060010190808311611068575b50505050509050919050565b6002600054036110aa5760405162461bcd60e51b8152600401610ada90611f94565b60026000556110b761196c565b81336110c38282611792565b82516011546110d29190611fcb565b34146111205760405162461bcd60e51b815260206004820152601760248201527f7374616b6520666565206973206e6f7420656e6f7567680000000000000000006044820152606401610ada565b60008351116111665760405162461bcd60e51b815260206004820152601260248201527110d85b9b9bdd081cdd185ad9480c081b999d60721b6044820152606401610ada565b6001600160a01b03841660009081526005602052604090205460ff166111ce5760405162461bcd60e51b815260206004820152601960248201527f436f6c6c656374696f6e206973206e6f7420616c6c6f776564000000000000006044820152606401610ada565b82516001600160a01b0385166000908152600660205260409020546111f291611786565b6001600160a01b0385166000908152600660209081526040808320939093558551600882528383203384529091529190205461122d91611786565b6001600160a01b03851660009081526008602090815260408083203384529091528120919091555b835181101561138b57336000908152600760205260409020845185908390811061128157611281611f36565b602090810291909101810151825460018101845560009384528284200155338252601590526040902084518590839081106112be576112be611f36565b6020908102919091018101518254600181018455600093845291909220015583516001600160a01b038616906342842e0e903390309088908690811061130657611306611f36565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561136057600080fd5b505af1158015611374573d6000803e3d6000fd5b50505050808061138390611f62565b915050611255565b50836001600160a01b0316336001600160a01b03167f5dac0c1b1112564a045ba943c9d50270893e8e826c49be8e7073adc713ab7bd78551604051610f6291815260200190565b6113da611702565b600b5442116114775760405162461bcd60e51b815260206004820152605860248201527f50726576696f7573207265776172647320706572696f64206d7573742062652060448201527f636f6d706c657465206265666f7265206368616e67696e67207468652064757260648201527f6174696f6e20666f7220746865206e657720706572696f640000000000000000608482015260a401610ada565b600c8190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d39060200160405180910390a150565b6114ba611702565b601192909255601255601355565b6014546001600160a01b03166115195760405162461bcd60e51b815260206004820152601660248201527518da185c99d954185e5959481a5cc81b9bdd081cd95d60521b6044820152606401610ada565b6014546001600160a01b031633146115735760405162461bcd60e51b815260206004820152601e60248201527f6f6e6c792063686172676550617965652063616e20636c61696d2066656500006044820152606401610ada565b60405133904780156108fc02916000818181858888f1935050505015801561159f573d6000803e3d6000fd5b50565b6001600160a01b03811660009081526006602052604081205481036115dd57506001600160a01b031660009081526009602052604090205490565b6001600160a01b0382166000908152600660209081526040808320546004835281842054600d54600a90945291909320546109499361164393909261093a9260649284929161163d91670de0b6b3a7640000918391908290610908610cf3565b90611762565b6001600160a01b03841660009081526009602052604090205490611786565b61166a611702565b6001600160a01b0381166116cf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ada565b61159f816118d7565b6116e0611702565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03610100909104163314610cdf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ada565b60006109468284611fcb565b60006109468284611fe2565b60006109468284611ff5565b60006109468284612017565b61179b826115a2565b6001600160a01b0383166000908152600960205260409020556117bc610cf3565b6001600160a01b038084166000908152600a602052604090209190915581161561182a576117ea82826108b0565b6001600160a01b038083166000818152600f602090815260408083209590955592861681526009835283812054600e845284822092825291909252919020555b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526118809084906119b2565b505050565b61188d611a84565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600180546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61193961196c565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336118ba565b60015460ff1615610cdf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ada565b6000611a07826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611acd9092919063ffffffff16565b8051909150156118805780806020019051810190611a25919061202a565b6118805760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610ada565b60015460ff16610cdf5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ada565b6060611adc8484600085611ae6565b90505b9392505050565b606082471015611b475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610ada565b6001600160a01b0385163b611b9e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ada565b600080866001600160a01b03168587604051611bba9190612070565b60006040518083038185875af1925050503d8060008114611bf7576040519150601f19603f3d011682016040523d82523d6000602084013e611bfc565b606091505b5091509150611c0c828286611c17565b979650505050505050565b60608315611c26575081611adf565b825115611c365782518084602001fd5b8160405162461bcd60e51b8152600401610ada919061208c565b6001600160a01b038116811461159f57600080fd5b600060208284031215611c7757600080fd5b8135611adf81611c50565b60008060408385031215611c9557600080fd5b8235611ca081611c50565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ced57611ced611cae565b604052919050565b60008060008060808587031215611d0b57600080fd5b8435611d1681611c50565b9350602085810135611d2781611c50565b935060408601359250606086013567ffffffffffffffff80821115611d4b57600080fd5b818801915088601f830112611d5f57600080fd5b813581811115611d7157611d71611cae565b611d83601f8201601f19168501611cc4565b91508082528984828501011115611d9957600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215611dcc57600080fd5b8235611dd781611c50565b91506020830135611de781611c50565b809150509250929050565b600060208284031215611e0457600080fd5b5035919050565b60008060408385031215611e1e57600080fd5b8235611e2981611c50565b915060208381013567ffffffffffffffff80821115611e4757600080fd5b818601915086601f830112611e5b57600080fd5b813581811115611e6d57611e6d611cae565b8060051b9150611e7e848301611cc4565b8181529183018401918481019089841115611e9857600080fd5b938501935b83851015611eb657843582529385019390850190611e9d565b8096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611efe57835183529284019291840191600101611ee2565b50909695505050505050565b600080600060608486031215611f1f57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611f7457611f74611f4c565b5060010190565b600060208284031215611f8d57600080fd5b5051919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b808202811582820484141761094957610949611f4c565b8181038181111561094957610949611f4c565b60008261201257634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561094957610949611f4c565b60006020828403121561203c57600080fd5b81518015158114611adf57600080fd5b60005b8381101561206757818101518382015260200161204f565b50506000910152565b6000825161208281846020870161204c565b9190910192915050565b60208152600082518060208401526120ab81604085016020870161204c565b601f01601f1916919091016040019291505056fea264697066735822122004f017adbf340a52db24540289e1684736e38f2c16145fec8735981eef9f92d164736f6c634300081200330000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000860c2245ea1693f24aed4a0364bba5787355baa000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000860c2245ea1693f24aed4a0364bba5787355baa000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _rewardsToken (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Arg [1] : _collections (address[]): 0x860c2245ea1693f24aed4a0364bba5787355baa0
Arg [2] : _ratios (uint256[]): 100
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 000000000000000000000000860c2245ea1693f24aed4a0364bba5787355baa0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed ByteCode Sourcemap
41362:9563:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42336:42;;;;;;;;;;-1:-1:-1;42336:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;548:25:1;;;536:2;521:18;42336:42:0;;;;;;;;50149:137;;;;;;;;;;-1:-1:-1;50149:137:0;;;;;:::i;:::-;;:::i;:::-;;41856:43;;;;;;;;;;-1:-1:-1;41856:43:0;;;;;:::i;:::-;;:::i;41688:50::-;;;;;;;;;;-1:-1:-1;41688:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;50294:201;;;;;;;;;;-1:-1:-1;50294:201:0;;;;;:::i;:::-;-1:-1:-1;;;50294:201:0;;;;;;;;;;-1:-1:-1;;;;;;2857:33:1;;;2839:52;;2827:2;2812:18;50294:201:0;2695:202:1;41745:51:0;;;;;;;;;;-1:-1:-1;41745:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3067:14:1;;3060:22;3042:41;;3030:2;3015:18;41745:51:0;2902:187:1;44637:121:0;;;;;;;;;;;;;:::i;44316:313::-;;;;;;;;;;-1:-1:-1;44316:313:0;;;;;:::i;:::-;;:::i;42058:49::-;;;;;;;;;;-1:-1:-1;42058:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;42154:39;;;;;;;;;;;;;;;;47740:946;;;;;;;;;;-1:-1:-1;47740:946:0;;;;;:::i;:::-;;:::i;47172:504::-;;;:::i;49458:67::-;;;;;;;;;;;;;:::i;42529:39::-;;;;;;;;;;;;;;;;5262:86;;;;;;;;;;-1:-1:-1;5333:7:0;;;;5262:86;;2763:103;;;;;;;;;;;;;:::i;42200:29::-;;;;;;;;;;;;;;;;43575:155;;;;;;;;;;;;;:::i;46462:702::-;;;;;;:::i;:::-;;:::i;49387:63::-;;;;;;;;;;;;;:::i;48801:210::-;;;;;;;;;;-1:-1:-1;48801:210:0;;;;;:::i;:::-;;:::i;2115:87::-;;;;;;;;;;-1:-1:-1;2188:6:0;;;;;-1:-1:-1;;;;;2188:6:0;2115:87;;;-1:-1:-1;;;;;4922:32:1;;;4904:51;;4892:2;4877:18;2115:87:0;4758:203:1;42238:91:0;;;;;;;;;;-1:-1:-1;42238:91:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;41803:46;;;;;;;;;;-1:-1:-1;41803:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;41996:55;;;;;;;;;;-1:-1:-1;41996:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;41645:36;;;;;;;;;;-1:-1:-1;41645:36:0;;;;;:::i;:::-;;:::i;42710:124::-;;;;;;;;;;-1:-1:-1;42710:124:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45441:889::-;;;;;;:::i;:::-;;:::i;49019:360::-;;;;;;;;;;-1:-1:-1;49019:360:0;;;;;:::i;:::-;;:::i;42486:36::-;;;;;;;;;;;;;;;;41611:27;;;;;;;;;;-1:-1:-1;41611:27:0;;;;-1:-1:-1;;;;;41611:27:0;;;44813:199;;;;;;;;;;-1:-1:-1;44813:199:0;;;;;:::i;:::-;;:::i;45126:253::-;;;;;;;;;;;;;:::i;42116:31::-;;;;;;;;;;;;;;;;41908:81;;;;;;;;;;-1:-1:-1;41908:81:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;43738:570;;;;;;;;;;-1:-1:-1;43738:570:0;;;;;:::i;:::-;;:::i;3021:201::-;;;;;;;;;;-1:-1:-1;3021:201:0;;;;;:::i;:::-;;:::i;45020:98::-;;;;;;;;;;-1:-1:-1;45020:98:0;;;;;:::i;:::-;;:::i;43406:161::-;;;;;;;;;;-1:-1:-1;43406:161:0;;;;;:::i;:::-;-1:-1:-1;;;;;43512:38:0;;;43485:7;43512:38;;;:26;:38;;;;;;;;:47;;;;;;;;;;;;;43406:161;42385:80;;;;;;;;;;-1:-1:-1;42385:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;46336:110;;;;;;;;;;-1:-1:-1;46416:10:0;46382:7;46409:18;;;:6;:18;;;;;:25;46336:110;;42618:26;;;;;;;;;;-1:-1:-1;42618:26:0;;;;-1:-1:-1;;;;;42618:26:0;;;42575:36;;;;;;;;;;;;;;;;50149:137;2001:13;:11;:13::i;:::-;50229:12:::1;:38:::0;;-1:-1:-1;;;;;;50229:38:0::1;-1:-1:-1::0;;;;;50229:38:0;;;::::1;::::0;;;::::1;::::0;;50149:137::o;41856:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44637:121::-;44692:7;44719:31;44734:15;;44719:10;;:14;;:31;;;;:::i;:::-;44712:38;;44637:121;:::o;44316:313::-;-1:-1:-1;;;;;44604:16:0;;;44390:7;44604:16;;;:7;:16;;;;;;;;;44510:48;;;;;:36;:48;;;;;:57;;;;;;;;;;44390:7;;44417:204;;:172;;44584:4;;44417:152;;44479:89;;:26;44547:10;44479:14;:26::i;:::-;:30;;:89::i;:::-;-1:-1:-1;;;;;44417:38:0;;;;;;;:26;:38;;;;;;;;:47;;;;;;;;;;;:61;:152::i;:::-;:166;;:172::i;:::-;:186;;:204::i;:::-;44410:211;;44316:313;;;;;:::o;47740:946::-;2001:13;:11;:13::i;:::-;47819:9:::1;47814:133;47838:19;:26:::0;47834:30;::::1;47814:133;;;47886:49;47900:19;47920:1;47900:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;47900:22:0::1;::::0;47886:13:::1;:49::i;:::-;47866:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47814:133;;;;47980:12;;47961:15;:31;47957:318;;48033:15;::::0;48022:27:::1;::::0;:6;;:10:::1;:27::i;:::-;48009:10;:40:::0;47957:318:::1;;;48102:12;::::0;48082:17:::1;::::0;48102:33:::1;::::0;48119:15:::1;48102:16;:33::i;:::-;48082:53;;48150:16;48169:25;48183:10;;48169:9;:13;;:25;;;;:::i;:::-;48247:15;::::0;48150:44;;-1:-1:-1;48222:41:0::1;::::0;:20:::1;:6:::0;48150:44;48222:10:::1;:20::i;:41::-;48209:10;:54:::0;-1:-1:-1;;47957:318:0::1;48302:12;::::0;:37:::1;::::0;-1:-1:-1;;;48302:37:0;;48333:4:::1;48302:37;::::0;::::1;4904:51:1::0;48287:12:0::1;::::0;-1:-1:-1;;;;;48302:12:0::1;::::0;:22:::1;::::0;4877:18:1;;48302:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48287:52;;48372:28;48384:15;;48372:7;:11;;:28;;;;:::i;:::-;48358:10;;:42;;48350:79;;;::::0;-1:-1:-1;;;48350:79:0;;6941:2:1;48350:79:0::1;::::0;::::1;6923:21:1::0;6980:2;6960:18;;;6953:30;7019:26;6999:18;;;6992:54;7063:18;;48350:79:0::1;;;;;;;;;48447:9;48442:140;48466:19;:26:::0;48462:30;::::1;48442:140;;;48555:15;48514:14;:38;48529:19;48549:1;48529:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;48529:22:0::1;48514:38:::0;;;::::1;::::0;;;;;;;;:56;48494:3;::::1;::::0;::::1;:::i;:::-;;;;48442:140;;;-1:-1:-1::0;48627:15:0::1;::::0;48607:36:::1;::::0;:15:::1;::::0;:19:::1;:36::i;:::-;48592:12;:51:::0;48659:19:::1;::::0;548:25:1;;;48659:19:0::1;::::0;536:2:1;521:18;48659:19:0::1;;;;;;;;47803:883;47740:946:::0;:::o;47172:504::-;8067:1;8665:7;;:19;8657:63;;;;-1:-1:-1;;;8657:63:0;;;;;;;:::i;:::-;8067:1;8798:7;:18;47253:11:::1;::::0;47240:9:::1;:24;47232:60;;;::::0;-1:-1:-1;;;47232:60:0;;7654:2:1;47232:60:0::1;::::0;::::1;7636:21:1::0;7693:2;7673:18;;;7666:30;7732:25;7712:18;;;7705:53;7775:18;;47232:60:0::1;7452:347:1::0;47232:60:0::1;47308:9;47303:133;47327:19;:26:::0;47323:30;::::1;47303:133;;;47375:49;47389:19;47409:1;47389:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;47389:22:0::1;47413:10;47375:13;:49::i;:::-;47355:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47303:133;;;-1:-1:-1::0;47471:10:0::1;47446:14;47463:19:::0;;;:7:::1;:19;::::0;;;;;47497:10;;47493:176:::1;;47532:10;47546:1;47524:19:::0;;;:7:::1;:19;::::0;;;;:23;47562:12:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;47562:12:0;;::::1;::::0;47600:6;47562:25:::1;:45::i;:::-;47627:30;::::0;548:25:1;;;47638:10:0::1;::::0;47627:30:::1;::::0;536:2:1;521:18;47627:30:0::1;;;;;;;47493:176;-1:-1:-1::0;8023:1:0;8977:7;:22;47172:504::o;49458:67::-;2001:13;:11;:13::i;:::-;49507:10:::1;:8;:10::i;:::-;49458:67::o:0;2763:103::-;2001:13;:11;:13::i;:::-;2828:30:::1;2855:1;2828:18;:30::i;43575:155::-:0;43632:7;43677:12;;43659:15;:30;:63;;-1:-1:-1;43710:12:0;;;44637:121::o;43659:63::-;-1:-1:-1;43692:15:0;;43575:155::o;46462:702::-;8067:1;8665:7;;:19;8657:63;;;;-1:-1:-1;;;8657:63:0;;;;;;;:::i;:::-;8067:1;8798:7;:18;46563:10;46575::::1;49648:34;46563:10:::0;46575;49648:13:::1;:34::i;:::-;46636:3:::2;:10;46619:14;;:27;;;;:::i;:::-;46606:9;:40;46598:79;;;::::0;-1:-1:-1;;;46598:79:0;;8179:2:1;46598:79:0::2;::::0;::::2;8161:21:1::0;8218:2;8198:18;;;8191:30;8257:28;8237:18;;;8230:56;8303:18;;46598:79:0::2;7977:350:1::0;46598:79:0::2;46709:1;46696:3;:10;:14;46688:48;;;::::0;-1:-1:-1;;;46688:48:0;;8534:2:1;46688:48:0::2;::::0;::::2;8516:21:1::0;8573:2;8553:18;;;8546:30;-1:-1:-1;;;8592:18:1;;;8585:51;8653:18;;46688:48:0::2;8332:345:1::0;46688:48:0::2;46803:10:::0;;-1:-1:-1;;;;;46775:23:0;::::2;;::::0;;;:11:::2;:23;::::0;;;;;:39:::2;::::0;:27:::2;:39::i;:::-;-1:-1:-1::0;;;;;46749:23:0;::::2;;::::0;;;:11:::2;:23;::::0;;;;;;;:65;;;;46933:10;;46878:26:::2;:38:::0;;;;;46917:10:::2;46878:50:::0;;;;;;;;;:66:::2;::::0;:54:::2;:66::i;:::-;-1:-1:-1::0;;;;;46825:38:0;::::2;;::::0;;;:26:::2;:38;::::0;;;;;;;46864:10:::2;46825:50:::0;;;;;;;:119;;;;46955:141:::2;46979:3;:10;46975:1;:14;46955:141;;;47021:10;-1:-1:-1::0;;;;;47013:36:0::2;;47058:4;47065:10;47077:3;47081:1;47077:6;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;47013:71:::2;::::0;-1:-1:-1;;;;;;47013:71:0::2;::::0;;;;;;-1:-1:-1;;;;;8940:15:1;;;47013:71:0::2;::::0;::::2;8922:34:1::0;8992:15;;;;8972:18;;;8965:43;9024:18;;;9017:34;8857:18;;47013:71:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;46991:3;;;;;:::i;:::-;;;;46955:141;;;;47133:10;-1:-1:-1::0;;;;;47111:45:0::2;47121:10;-1:-1:-1::0;;;;;47111:45:0::2;;47145:3;:10;47111:45;;;;548:25:1::0;;536:2;521:18;;402:177;47111:45:0::2;;;;;;;;-1:-1:-1::0;;8023:1:0;8977:7;:22;-1:-1:-1;;46462:702:0:o;49387:63::-;2001:13;:11;:13::i;:::-;49434:8:::1;:6;:8::i;48801:210::-:0;2001:13;:11;:13::i;:::-;2188:6;;48896:55:::1;::::0;2188:6;;;-1:-1:-1;;;;;2188:6:0;-1:-1:-1;;;;;48896:33:0;::::1;::::0;48939:11;48896:33:::1;:55::i;:::-;48967:36;::::0;;-1:-1:-1;;;;;9254:32:1;;9236:51;;9318:2;9303:18;;9296:34;;;48967:36:0::1;::::0;9209:18:1;48967:36:0::1;9062:274:1::0;41645:36:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41645:36:0;;-1:-1:-1;41645:36:0;:::o;42710:124::-;-1:-1:-1;;;;;42801:15:0;;;;;;:5;:15;;;;;;;;;42794:32;;;;;;;;;;;;;;;;;42768:13;;42794:32;;;42801:15;42794:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42710:124;;;:::o;45441:889::-;8067:1;8665:7;;:19;8657:63;;;;-1:-1:-1;;;8657:63:0;;;;;;;:::i;:::-;8067:1;8798:7;:18;4867:19:::1;:17;:19::i;:::-;45555:10:::2;45567;49648:34;49662:10;49674:7;49648:13;:34::i;:::-;45625:3:::3;:10;45611:11;;:24;;;;:::i;:::-;45598:9;:37;45590:73;;;::::0;-1:-1:-1;;;45590:73:0;;9543:2:1;45590:73:0::3;::::0;::::3;9525:21:1::0;9582:2;9562:18;;;9555:30;9621:25;9601:18;;;9594:53;9664:18;;45590:73:0::3;9341:347:1::0;45590:73:0::3;45695:1;45682:3;:10;:14;45674:45;;;::::0;-1:-1:-1;;;45674:45:0;;9895:2:1;45674:45:0::3;::::0;::::3;9877:21:1::0;9934:2;9914:18;;;9907:30;-1:-1:-1;;;9953:18:1;;;9946:48;10011:18;;45674:45:0::3;9693:342:1::0;45674:45:0::3;-1:-1:-1::0;;;;;45738:31:0;::::3;;::::0;;;:19:::3;:31;::::0;;;;;::::3;;45730:69;;;::::0;-1:-1:-1;;;45730:69:0;;10242:2:1;45730:69:0::3;::::0;::::3;10224:21:1::0;10281:2;10261:18;;;10254:30;10320:27;10300:18;;;10293:55;10365:18;;45730:69:0::3;10040:349:1::0;45730:69:0::3;45866:10:::0;;-1:-1:-1;;;;;45838:23:0;::::3;;::::0;;;:11:::3;:23;::::0;;;;;:39:::3;::::0;:27:::3;:39::i;:::-;-1:-1:-1::0;;;;;45812:23:0;::::3;;::::0;;;:11:::3;:23;::::0;;;;;;;:65;;;;45996:10;;45941:26:::3;:38:::0;;;;;45980:10:::3;45941:50:::0;;;;;;;;;:66:::3;::::0;:54:::3;:66::i;:::-;-1:-1:-1::0;;;;;45888:38:0;::::3;;::::0;;;:26:::3;:38;::::0;;;;;;;45927:10:::3;45888:50:::0;;;;;;;:119;;;;46018:247:::3;46042:3;:10;46038:1;:14;46018:247;;;46084:10;46077:18;::::0;;;:6:::3;:18;::::0;;;;46101:6;;:3;;46105:1;;46101:6;::::3;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;46077:31;;::::3;::::0;::::3;::::0;;-1:-1:-1;46077:31:0;;;;;;::::3;::::0;46133:10:::3;46127:17:::0;;:5:::3;:17:::0;;;;;46160:6;;:3;;46164:1;;46160:6;::::3;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;;46127:40;;::::3;::::0;::::3;::::0;;-1:-1:-1;46127:40:0;;;;;;;::::3;::::0;46246:6;;-1:-1:-1;;;;;46182:36:0;::::3;::::0;::::3;::::0;46219:10:::3;::::0;46239:4:::3;::::0;46246:3;;46250:1;;46246:6;::::3;;;;;:::i;:::-;;::::0;;::::3;::::0;;;;;;46182:71:::3;::::0;-1:-1:-1;;;;;;46182:71:0::3;::::0;;;;;;-1:-1:-1;;;;;8940:15:1;;;46182:71:0::3;::::0;::::3;8922:34:1::0;8992:15;;;;8972:18;;;8965:43;9024:18;;;9017:34;8857:18;;46182:71:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;46054:3;;;;;:::i;:::-;;;;46018:247;;;;46299:10;-1:-1:-1::0;;;;;46280:42:0::3;46287:10;-1:-1:-1::0;;;;;46280:42:0::3;;46311:3;:10;46280:42;;;;548:25:1::0;;536:2;521:18;;402:177;49019:360:0;2001:13;:11;:13::i;:::-;49143:12:::1;;49125:15;:30;49103:168;;;::::0;-1:-1:-1;;;49103:168:0;;10596:2:1;49103:168:0::1;::::0;::::1;10578:21:1::0;10635:2;10615:18;;;10608:30;10674:34;10654:18;;;10647:62;10745:34;10725:18;;;10718:62;10817:26;10796:19;;;10789:55;10861:19;;49103:168:0::1;10394:492:1::0;49103:168:0::1;49282:15;:34:::0;;;49332:39:::1;::::0;548:25:1;;;49332:39:0::1;::::0;536:2:1;521:18;49332:39:0::1;;;;;;;49019:360:::0;:::o;44813:199::-;2001:13;:11;:13::i;:::-;44916:11:::1;:20:::0;;;;44947:14:::1;:26:::0;44984:11:::1;:20:::0;44813:199::o;45126:253::-;45178:11;;-1:-1:-1;;;;;45178:11:0;45170:60;;;;-1:-1:-1;;;45170:60:0;;11093:2:1;45170:60:0;;;11075:21:1;11132:2;11112:18;;;11105:30;-1:-1:-1;;;11151:18:1;;;11144:52;11213:18;;45170:60:0;10891:346:1;45170:60:0;45263:11;;-1:-1:-1;;;;;45263:11:0;45249:10;:25;45241:68;;;;-1:-1:-1;;;45241:68:0;;11444:2:1;45241:68:0;;;11426:21:1;11483:2;11463:18;;;11456:30;11522:32;11502:18;;;11495:60;11572:18;;45241:68:0;11242:354:1;45241:68:0;45320:51;;45328:10;;45349:21;45320:51;;;;;;;;;45349:21;45328:10;45320:51;;;;;;;;;;;;;;;;;;;;;45126:253::o;43738:570::-;-1:-1:-1;;;;;43827:23:0;;43803:7;43827:23;;;:11;:23;;;;;;:28;;43823:100;;-1:-1:-1;;;;;;43879:32:0;;;;;:20;:32;;;;;;;43738:570::o;43823:100::-;-1:-1:-1;;;;;44261:23:0;;;;;;:11;:23;;;;;;;;;44183:15;:27;;;;;;44121:10;;44071:14;:26;;;;;;;;43953:347;;44022:263;;44261:23;;44022:216;;44234:3;;44022:216;;44183:27;44022:138;;44155:4;;44022:138;;44121:10;44022:138;;:26;:24;:26::i;:76::-;:98;;:110::i;:263::-;-1:-1:-1;;;;;43953:32:0;;;;;;:20;:32;;;;;;;:50;:347::i;3021:201::-;2001:13;:11;:13::i;:::-;-1:-1:-1;;;;;3110:22:0;::::1;3102:73;;;::::0;-1:-1:-1;;;3102:73:0;;11803:2:1;3102:73:0::1;::::0;::::1;11785:21:1::0;11842:2;11822:18;;;11815:30;11881:34;11861:18;;;11854:62;-1:-1:-1;;;11932:18:1;;;11925:36;11978:19;;3102:73:0::1;11601:402:1::0;3102:73:0::1;3186:28;3205:8;3186:18;:28::i;45020:98::-:0;2001:13;:11;:13::i;:::-;45090:11:::1;:20:::0;;-1:-1:-1;;;;;;45090:20:0::1;-1:-1:-1::0;;;;;45090:20:0;;;::::1;::::0;;;::::1;::::0;;45020:98::o;2280:132::-;2188:6;;-1:-1:-1;;;;;2188:6:0;;;;;737:10;2344:23;2336:68;;;;-1:-1:-1;;;2336:68:0;;12210:2:1;2336:68:0;;;12192:21:1;;;12229:18;;;12222:30;12288:34;12268:18;;;12261:62;12340:18;;2336:68:0;12008:356:1;12639:98:0;12697:7;12724:5;12728:1;12724;:5;:::i;12282:98::-;12340:7;12367:5;12371:1;12367;:5;:::i;13038:98::-;13096:7;13123:5;13127:1;13123;:5;:::i;11901:98::-;11959:7;11986:5;11990:1;11986;:5;:::i;49710:432::-;49825:26;49840:10;49825:14;:26::i;:::-;-1:-1:-1;;;;;49790:32:0;;;;;;:20;:32;;;;;:61;49891:26;:24;:26::i;:::-;-1:-1:-1;;;;;49862:26:0;;;;;;;:14;:26;;;;;:55;;;;49932:21;;;49928:207;;49989:27;49996:10;50008:7;49989:6;:27::i;:::-;-1:-1:-1;;;;;49970:16:0;;;;;;;:7;:16;;;;;;;;:46;;;;50091:32;;;;;:20;:32;;;;;;50031:36;:48;;;;;:57;;;;;;;;;;:92;49928:207;49710:432;;:::o;37495:211::-;37639:58;;;-1:-1:-1;;;;;9254:32:1;;37639:58:0;;;9236:51:1;9303:18;;;;9296:34;;;37639:58:0;;;;;;;;;;9209:18:1;;;;37639:58:0;;;;;;;;-1:-1:-1;;;;;37639:58:0;-1:-1:-1;;;37639:58:0;;;37612:86;;37632:5;;37612:19;:86::i;:::-;37495:211;;;:::o;6117:120::-;5126:16;:14;:16::i;:::-;6176:7:::1;:15:::0;;-1:-1:-1;;6176:15:0::1;::::0;;6207:22:::1;737:10:::0;6216:12:::1;6207:22;::::0;-1:-1:-1;;;;;4922:32:1;;;4904:51;;4892:2;4877:18;6207:22:0::1;;;;;;;6117:120::o:0;3382:191::-;3475:6;;;-1:-1:-1;;;;;3492:17:0;;;3475:6;3492:17;;;-1:-1:-1;;;;;;3492:17:0;;;;;;3525:40;;3475:6;;;;;;;;3525:40;;3456:16;;3525:40;3445:128;3382:191;:::o;5858:118::-;4867:19;:17;:19::i;:::-;5928:4:::1;5918:14:::0;;-1:-1:-1;;5918:14:0::1;::::0;::::1;::::0;;5948:20:::1;737:10:::0;5955:12:::1;657:98:::0;5421:108;5333:7;;;;5491:9;5483:38;;;;-1:-1:-1;;;5483:38:0;;13056:2:1;5483:38:0;;;13038:21:1;13095:2;13075:18;;;13068:30;-1:-1:-1;;;13114:18:1;;;13107:46;13170:18;;5483:38:0;12854:340:1;40562:716:0;40986:23;41012:69;41040:4;41012:69;;;;;;;;;;;;;;;;;41020:5;-1:-1:-1;;;;;41012:27:0;;;:69;;;;;:::i;:::-;41096:17;;40986:95;;-1:-1:-1;41096:21:0;41092:179;;41193:10;41182:30;;;;;;;;;;;;:::i;:::-;41174:85;;;;-1:-1:-1;;;41174:85:0;;13683:2:1;41174:85:0;;;13665:21:1;13722:2;13702:18;;;13695:30;13761:34;13741:18;;;13734:62;-1:-1:-1;;;13812:18:1;;;13805:40;13862:19;;41174:85:0;13481:406:1;5606:108:0;5333:7;;;;5665:41;;;;-1:-1:-1;;;5665:41:0;;14094:2:1;5665:41:0;;;14076:21:1;14133:2;14113:18;;;14106:30;-1:-1:-1;;;14152:18:1;;;14145:50;14212:18;;5665:41:0;13892:344:1;29821:229:0;29958:12;29990:52;30012:6;30020:4;30026:1;30029:12;29990:21;:52::i;:::-;29983:59;;29821:229;;;;;;:::o;30941:510::-;31111:12;31169:5;31144:21;:30;;31136:81;;;;-1:-1:-1;;;31136:81:0;;14443:2:1;31136:81:0;;;14425:21:1;14482:2;14462:18;;;14455:30;14521:34;14501:18;;;14494:62;-1:-1:-1;;;14572:18:1;;;14565:36;14618:19;;31136:81:0;14241:402:1;31136:81:0;-1:-1:-1;;;;;27371:19:0;;;31228:60;;;;-1:-1:-1;;;31228:60:0;;14850:2:1;31228:60:0;;;14832:21:1;14889:2;14869:18;;;14862:30;14928:31;14908:18;;;14901:59;14977:18;;31228:60:0;14648:353:1;31228:60:0;31302:12;31316:23;31343:6;-1:-1:-1;;;;;31343:11:0;31362:5;31369:4;31343:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31301:73;;;;31392:51;31409:7;31418:10;31430:12;31392:16;:51::i;:::-;31385:58;30941:510;-1:-1:-1;;;;;;;30941:510:0:o;33627:762::-;33777:12;33806:7;33802:580;;;-1:-1:-1;33837:10:0;33830:17;;33802:580;33951:17;;:21;33947:424;;34199:10;34193:17;34260:15;34247:10;34243:2;34239:19;34232:44;33947:424;34342:12;34335:20;;-1:-1:-1;;;34335:20:0;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;850:315::-;918:6;926;979:2;967:9;958:7;954:23;950:32;947:52;;;995:1;992;985:12;947:52;1034:9;1021:23;1053:31;1078:5;1053:31;:::i;:::-;1103:5;1155:2;1140:18;;;;1127:32;;-1:-1:-1;;;850:315:1:o;1170:127::-;1231:10;1226:3;1222:20;1219:1;1212:31;1262:4;1259:1;1252:15;1286:4;1283:1;1276:15;1302:275;1373:2;1367:9;1438:2;1419:13;;-1:-1:-1;;1415:27:1;1403:40;;1473:18;1458:34;;1494:22;;;1455:62;1452:88;;;1520:18;;:::i;:::-;1556:2;1549:22;1302:275;;-1:-1:-1;1302:275:1:o;1582:1108::-;1677:6;1685;1693;1701;1754:3;1742:9;1733:7;1729:23;1725:33;1722:53;;;1771:1;1768;1761:12;1722:53;1810:9;1797:23;1829:31;1854:5;1829:31;:::i;:::-;1879:5;-1:-1:-1;1903:2:1;1942:18;;;1929:32;1970:33;1929:32;1970:33;:::i;:::-;2022:7;-1:-1:-1;2076:2:1;2061:18;;2048:32;;-1:-1:-1;2131:2:1;2116:18;;2103:32;2154:18;2184:14;;;2181:34;;;2211:1;2208;2201:12;2181:34;2249:6;2238:9;2234:22;2224:32;;2294:7;2287:4;2283:2;2279:13;2275:27;2265:55;;2316:1;2313;2306:12;2265:55;2352:2;2339:16;2374:2;2370;2367:10;2364:36;;;2380:18;;:::i;:::-;2422:53;2465:2;2446:13;;-1:-1:-1;;2442:27:1;2438:36;;2422:53;:::i;:::-;2409:66;;2498:2;2491:5;2484:17;2538:7;2533:2;2528;2524;2520:11;2516:20;2513:33;2510:53;;;2559:1;2556;2549:12;2510:53;2614:2;2609;2605;2601:11;2596:2;2589:5;2585:14;2572:45;2658:1;2653:2;2648;2641:5;2637:14;2633:23;2626:34;;2679:5;2669:15;;;;;1582:1108;;;;;;;:::o;3094:388::-;3162:6;3170;3223:2;3211:9;3202:7;3198:23;3194:32;3191:52;;;3239:1;3236;3229:12;3191:52;3278:9;3265:23;3297:31;3322:5;3297:31;:::i;:::-;3347:5;-1:-1:-1;3404:2:1;3389:18;;3376:32;3417:33;3376:32;3417:33;:::i;:::-;3469:7;3459:17;;;3094:388;;;;;:::o;3487:180::-;3546:6;3599:2;3587:9;3578:7;3574:23;3570:32;3567:52;;;3615:1;3612;3605:12;3567:52;-1:-1:-1;3638:23:1;;3487:180;-1:-1:-1;3487:180:1:o;3672:1081::-;3765:6;3773;3826:2;3814:9;3805:7;3801:23;3797:32;3794:52;;;3842:1;3839;3832:12;3794:52;3881:9;3868:23;3900:31;3925:5;3900:31;:::i;:::-;3950:5;-1:-1:-1;3974:2:1;4012:18;;;3999:32;4050:18;4080:14;;;4077:34;;;4107:1;4104;4097:12;4077:34;4145:6;4134:9;4130:22;4120:32;;4190:7;4183:4;4179:2;4175:13;4171:27;4161:55;;4212:1;4209;4202:12;4161:55;4248:2;4235:16;4270:2;4266;4263:10;4260:36;;;4276:18;;:::i;:::-;4322:2;4319:1;4315:10;4305:20;;4345:28;4369:2;4365;4361:11;4345:28;:::i;:::-;4407:15;;;4477:11;;;4473:20;;;4438:12;;;;4505:19;;;4502:39;;;4537:1;4534;4527:12;4502:39;4561:11;;;;4581:142;4597:6;4592:3;4589:15;4581:142;;;4663:17;;4651:30;;4614:12;;;;4701;;;;4581:142;;;4742:5;4732:15;;;;;;;;3672:1081;;;;;:::o;4966:632::-;5137:2;5189:21;;;5259:13;;5162:18;;;5281:22;;;5108:4;;5137:2;5360:15;;;;5334:2;5319:18;;;5108:4;5403:169;5417:6;5414:1;5411:13;5403:169;;;5478:13;;5466:26;;5547:15;;;;5512:12;;;;5439:1;5432:9;5403:169;;;-1:-1:-1;5589:3:1;;4966:632;-1:-1:-1;;;;;;4966:632:1:o;5825:316::-;5902:6;5910;5918;5971:2;5959:9;5950:7;5946:23;5942:32;5939:52;;;5987:1;5984;5977:12;5939:52;-1:-1:-1;;6010:23:1;;;6080:2;6065:18;;6052:32;;-1:-1:-1;6131:2:1;6116:18;;;6103:32;;5825:316;-1:-1:-1;5825:316:1:o;6146:127::-;6207:10;6202:3;6198:20;6195:1;6188:31;6238:4;6235:1;6228:15;6262:4;6259:1;6252:15;6278:127;6339:10;6334:3;6330:20;6327:1;6320:31;6370:4;6367:1;6360:15;6394:4;6391:1;6384:15;6410:135;6449:3;6470:17;;;6467:43;;6490:18;;:::i;:::-;-1:-1:-1;6537:1:1;6526:13;;6410:135::o;6550:184::-;6620:6;6673:2;6661:9;6652:7;6648:23;6644:32;6641:52;;;6689:1;6686;6679:12;6641:52;-1:-1:-1;6712:16:1;;6550:184;-1:-1:-1;6550:184:1:o;7092:355::-;7294:2;7276:21;;;7333:2;7313:18;;;7306:30;7372:33;7367:2;7352:18;;7345:61;7438:2;7423:18;;7092:355::o;7804:168::-;7877:9;;;7908;;7925:15;;;7919:22;;7905:37;7895:71;;7946:18;;:::i;12369:128::-;12436:9;;;12457:11;;;12454:37;;;12471:18;;:::i;12502:217::-;12542:1;12568;12558:132;;12612:10;12607:3;12603:20;12600:1;12593:31;12647:4;12644:1;12637:15;12675:4;12672:1;12665:15;12558:132;-1:-1:-1;12704:9:1;;12502:217::o;12724:125::-;12789:9;;;12810:10;;;12807:36;;;12823:18;;:::i;13199:277::-;13266:6;13319:2;13307:9;13298:7;13294:23;13290:32;13287:52;;;13335:1;13332;13325:12;13287:52;13367:9;13361:16;13420:5;13413:13;13406:21;13399:5;13396:32;13386:60;;13442:1;13439;13432:12;15006:250;15091:1;15101:113;15115:6;15112:1;15109:13;15101:113;;;15191:11;;;15185:18;15172:11;;;15165:39;15137:2;15130:10;15101:113;;;-1:-1:-1;;15248:1:1;15230:16;;15223:27;15006:250::o;15261:287::-;15390:3;15428:6;15422:13;15444:66;15503:6;15498:3;15491:4;15483:6;15479:17;15444:66;:::i;:::-;15526:16;;;;;15261:287;-1:-1:-1;;15261:287:1:o;15553:396::-;15702:2;15691:9;15684:21;15665:4;15734:6;15728:13;15777:6;15772:2;15761:9;15757:18;15750:34;15793:79;15865:6;15860:2;15849:9;15845:18;15840:2;15832:6;15828:15;15793:79;:::i;:::-;15933:2;15912:15;-1:-1:-1;;15908:29:1;15893:45;;;;15940:2;15889:54;;15553:396;-1:-1:-1;;15553:396:1:o
Swarm Source
ipfs://04f017adbf340a52db24540289e1684736e38f2c16145fec8735981eef9f92d1
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.