Contract
0x5543c2c9ada332213762d6ac9520fd3b74f07345
1
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
XZeus
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-06-22 */ // 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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 ); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (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 ) ); } } /** * @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 @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (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 substraction 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 @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface VRFCoordinatorV2Interface { /** * @notice Get configuration relevant for making requests * @return minimumRequestConfirmations global min for request confirmations * @return maxGasLimit global max for request gas limit * @return s_provingKeyHashes list of registered key hashes */ function getRequestConfig() external view returns ( uint16, uint32, bytes32[] memory ); /** * @notice Request a set of random words. * @param keyHash - Corresponds to a particular oracle job which uses * that key for generating the VRF proof. Different keyHash's have different gas price * ceilings, so you can select a specific one to bound your maximum per request cost. * @param subId - The ID of the VRF subscription. Must be funded * with the minimum subscription balance required for the selected keyHash. * @param minimumRequestConfirmations - How many blocks you'd like the * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS * for why you may want to request more. The acceptable range is * [minimumRequestBlockConfirmations, 200]. * @param callbackGasLimit - How much gas you'd like to receive in your * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords * may be slightly less than this amount because of gas used calling the function * (argument decoding etc.), so you may need to request slightly more than you expect * to have inside fulfillRandomWords. The acceptable range is * [0, maxGasLimit] * @param numWords - The number of uint256 random values you'd like to receive * in your fulfillRandomWords callback. Note these numbers are expanded in a * secure way by the VRFCoordinator from a single random value supplied by the oracle. * @return requestId - A unique identifier of the request. Can be used to match * a request to a response in fulfillRandomWords. */ function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external returns (uint256 requestId); /** * @notice Create a VRF subscription. * @return subId - A unique subscription id. * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer. * @dev Note to fund the subscription, use transferAndCall. For example * @dev LINKTOKEN.transferAndCall( * @dev address(COORDINATOR), * @dev amount, * @dev abi.encode(subId)); */ function createSubscription() external returns (uint64 subId); /** * @notice Get a VRF subscription. * @param subId - ID of the subscription * @return balance - LINK balance of the subscription in juels. * @return reqCount - number of requests for this subscription, determines fee tier. * @return owner - owner of the subscription. * @return consumers - list of consumer address which are able to use this subscription. */ function getSubscription(uint64 subId) external view returns ( uint96 balance, uint64 reqCount, address owner, address[] memory consumers ); /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @param newOwner - proposed new owner of the subscription */ function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external; /** * @notice Request subscription owner transfer. * @param subId - ID of the subscription * @dev will revert if original owner of subId has * not requested that msg.sender become the new owner. */ function acceptSubscriptionOwnerTransfer(uint64 subId) external; /** * @notice Add a consumer to a VRF subscription. * @param subId - ID of the subscription * @param consumer - New consumer which can use the subscription */ function addConsumer(uint64 subId, address consumer) external; /** * @notice Remove a consumer from a VRF subscription. * @param subId - ID of the subscription * @param consumer - Consumer to remove from the subscription */ function removeConsumer(uint64 subId, address consumer) external; /** * @notice Cancel a subscription * @param subId - ID of the subscription * @param to - Where to send the remaining LINK to */ function cancelSubscription(uint64 subId, address to) external; } // File @chainlink/contracts/src/v0.8/[email protected] pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the VRFCoordinator * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (VRFCoordinatorInterface for a description of the arguments). * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyCoordinatorCanFulfill(address have, address want); address private immutable vrfCoordinator; /** * @param _vrfCoordinator address of VRFCoordinator contract */ constructor(address _vrfCoordinator) { vrfCoordinator = _vrfCoordinator; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) external { if (msg.sender != vrfCoordinator) { revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator); } fulfillRandomWords(requestId, randomWords); } } // File @chainlink/contracts/src/v0.8/[email protected] pragma solidity ^0.8.0; contract KeeperBase { error OnlySimulatedBackend(); /** * @notice method that allows it to be simulated via eth_call by checking that * the sender is the zero address. */ function preventExecution() internal view { if (tx.origin != address(0)) { revert OnlySimulatedBackend(); } } /** * @notice modifier that allows it to be simulated via eth_call by checking * that the sender is the zero address. */ modifier cannotExecute() { preventExecution(); _; } } // File @chainlink/contracts/src/v0.8/interfaces/[email protected] pragma solidity ^0.8.0; interface KeeperCompatibleInterface { /** * @notice method that is simulated by the keepers to see if any work actually * needs to be performed. This method does does not actually need to be * executable, and since it is only ever simulated it can consume lots of gas. * @dev To ensure that it is never called, you may want to add the * cannotExecute modifier from KeeperBase to your implementation of this * method. * @param checkData specified in the upkeep registration so it is always the * same for a registered upkeep. This can easily be broken down into specific * arguments using `abi.decode`, so multiple upkeeps can be registered on the * same contract and easily differentiated by the contract. * @return upkeepNeeded boolean to indicate whether the keeper should call * performUpkeep or not. * @return performData bytes that the keeper should call performUpkeep with, if * upkeep is needed. If you would like to encode data to decode later, try * `abi.encode`. */ function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); /** * @notice method that is actually executed by the keepers, via the registry. * The data returned by the checkUpkeep simulation will be passed into * this method to actually be executed. * @dev The input to this method should not be trusted, and the caller of the * method should not even be restricted to any single registry. Anyone should * be able call it, and the input should be validated, there is no guarantee * that the data passed in is the performData returned from checkUpkeep. This * could happen due to malicious keepers, racing keepers, or simply a state * change while the performUpkeep transaction is waiting for confirmation. * Always validate the data passed in. * @param performData is the data which was passed back from the checkData * simulation. If it is encoded, it can easily be decoded into other types by * calling `abi.decode`. This data should not be trusted, and should be * validated against the contract's current state. */ function performUpkeep(bytes calldata performData) external; } // File @chainlink/contracts/src/v0.8/[email protected] pragma solidity ^0.8.0; abstract contract KeeperCompatible is KeeperBase, KeeperCompatibleInterface {} // File contracts/XZeus.sol pragma solidity ^0.8.4; pragma abicoder v2; contract XZeus is Ownable, VRFConsumerBaseV2, KeeperCompatibleInterface { using SafeERC20 for IERC20; using SafeMath for uint256; // Info of each user. struct UserInfo { uint256 amount; // How many staking tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 stakingToken; // Address of staking token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ZEUSs to distribute per block. uint256 lastRewardBlock; // Last block number that ZEUSs distribution occurs. uint256 accZeusPerShare; // Accumulated ZEUSs per share, times PRECISION_FACTOR. See below. uint256 totalShares; // Balance of total staked amount in the pool } // Info of penalty. struct PenaltyInfo { uint256 criteria; // Criteria minimum uint256 penalty; // Fee in usd } // Info of random number request struct RandomRequestInfo { address requester; uint256 poolId; uint256 withdrawalAmount; } // The REWARD TOKEN IERC20 public rewardToken; uint256 public rewardDecimal; // The REWARD HOLDER address public rewardHolder; // ZEUS token fee recipient address public feeRecipient; // ZEUS tokens created per block. uint256 public rewardPerBlock; // Bonus muliplier for early zeus makers. uint256 public BONUS_MULTIPLIER = 100; // precision factor uint256 public PRECISION_FACTOR = 1e12; // Info of each pool. PoolInfo[] public poolInfo; // Info of each pool. PenaltyInfo[] public penaltyInfo; // Info of each user that stakes staking tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; VRFCoordinatorV2Interface COORDINATOR; // Your subscription ID. uint64 s_subscriptionId; address vrfCoordinator = 0xd5D517aBE5cF79B7e95eC98dB0f0277788aFF634; bytes32 keyHash = 0x89630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46; uint32 callbackGasLimit = 250000; uint16 requestConfirmations = 3; uint32 numWords = 1; mapping(uint256 => RandomRequestInfo) randomRequestInfo; // => requestId => requester Info uint256 bonusAmount; AggregatorV3Interface internal avaxPriceFeed; // emission rate uint256 rewardPerBlockNew; uint256 rewardActiveTimestamp; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); /** * @notice Constructor. Set reward token, reward emission rate and create a new pool with the params * @param _stakingToken address of token of first pool * @param _rewardToken address of reward token * @param _rewardPerBlock reward emission rate * @param _rewardHolder address of reward holder who has enough reward tokens * @param _feeRecipient address of fee recipient * @param _bonusAmount amoount of random bonus * @param _subscriptionId subscript id */ constructor( // xStake constructor params IERC20 _stakingToken, IERC20 _rewardToken, uint256 _rewardDecimal, uint256 _rewardPerBlock, uint256 _rewardPerBlockNew, address _rewardHolder, address _feeRecipient, uint256 _bonusAmount, // chainlink constructor params uint64 _subscriptionId ) VRFConsumerBaseV2(vrfCoordinator) { require( address(_stakingToken) != address(0), "Zero address: stakingToken" ); require( address(_rewardToken) != address(0), "Zero address: rewardToken" ); require(_rewardHolder != address(0), "Zero address: rewardHolder"); require(_feeRecipient != address(0), "Zero address: feeRecipient"); rewardToken = _rewardToken; rewardPerBlock = _rewardPerBlock; rewardPerBlockNew = _rewardPerBlockNew; rewardDecimal = _rewardDecimal; // staking pool poolInfo.push( PoolInfo({ stakingToken: _stakingToken, allocPoint: 1000, lastRewardBlock: block.number, accZeusPerShare: 0, totalShares: 0 }) ); totalAllocPoint = 1000; rewardHolder = _rewardHolder; feeRecipient = _feeRecipient; bonusAmount = _bonusAmount; // set chainlink params COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator); s_subscriptionId = _subscriptionId; /** * Network: Avalanche Mainnet * Aggregator: AVAX/USD * Address: 0x0A77230d17318075983913bC2145DB16C7366156 */ avaxPriceFeed = AggregatorV3Interface( 0x0A77230d17318075983913bC2145DB16C7366156 ); rewardActiveTimestamp = block.timestamp; } /** * @notice Return a length of pools */ function poolLength() external view returns (uint256) { return poolInfo.length; } /** * @notice Return reward multiplier over the given _from to _to block. * @param _from from block number * @param _to to block number */ function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { return _to.sub(_from).mul(BONUS_MULTIPLIER).div(100); } /** * @notice Get penalty from deposit amount * @param _amount amount */ function getPenalty(uint256 _amount) public view returns (uint256) { uint256 penalty; if (penaltyInfo.length == 0) return 0; for (uint256 i = 0; i < penaltyInfo.length; i++) { if (_amount > penaltyInfo[i].criteria) { penalty = penaltyInfo[i].penalty; } else { break; } } return penalty / (getLatestAvaxPrice() / 1e8); } /** * @notice View function to see pending Reward on frontend. * @param _pid pool id * @param _user user address */ function pendingReward(uint256 _pid, address _user) external view returns (uint256) { PoolInfo memory pool = poolInfo[_pid]; UserInfo memory user = userInfo[_pid][_user]; uint256 accZeusPerShare = pool.accZeusPerShare; uint256 stakingTokenSupply = pool.totalShares; if (block.number > pool.lastRewardBlock && stakingTokenSupply != 0) { uint256 multiplier = getMultiplier( pool.lastRewardBlock, block.number ); uint256 usdcReward = multiplier .mul(rewardPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); accZeusPerShare = accZeusPerShare.add( (usdcReward.mul(PRECISION_FACTOR).div(stakingTokenSupply)) ); } return user .amount .mul(accZeusPerShare) .div(PRECISION_FACTOR) .mul(10**rewardDecimal) .div(1e18) .sub(user.rewardDebt); } /** * @notice Add a new stakingToken to the pool. Can only be called by the owner. * XXX DO NOT add the same staking token more than once. Rewards will be messed up if you do. * @param _allocPoint reward allocation point * @param _stakingToken token address */ function add(uint256 _allocPoint, IERC20 _stakingToken) public onlyOwner { require( address(_stakingToken) != address(0), "Staking token: Zero address" ); for (uint256 i = 0; i < poolInfo.length; i++) { if (address(poolInfo[i].stakingToken) == address(_stakingToken)) revert("Pool duplicated"); } massUpdatePools(); totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ stakingToken: _stakingToken, allocPoint: _allocPoint, lastRewardBlock: block.number, accZeusPerShare: 0, totalShares: 0 }) ); } /** * @notice Update the given pool's ZEUS allocation point. Can only be called by the owner. * @param _pid pool id * @param _allocPoint reward allocation point */ function set(uint256 _pid, uint256 _allocPoint) public onlyOwner { massUpdatePools(); uint256 prevAllocPoint = poolInfo[_pid].allocPoint; poolInfo[_pid].allocPoint = _allocPoint; if (prevAllocPoint != _allocPoint) { totalAllocPoint = totalAllocPoint.sub(prevAllocPoint).add( _allocPoint ); } } /** * @notice Update multiplier. Can only be called by the owner. * @param _multiplierNumber _multiplier value */ function updateMultiplier(uint256 _multiplierNumber) public onlyOwner { require(_multiplierNumber >= 100, "Invalid multipler number"); BONUS_MULTIPLIER = _multiplierNumber; } /** * @notice Add penalty info * @param _criteria penalty criteria amount * @param _penalty penalty point */ function setPenaltyInfo(uint256 _criteria, uint256 _penalty) public onlyOwner { uint256 penaltyLength = penaltyInfo.length; if (penaltyLength == 0) { penaltyInfo.push( PenaltyInfo({criteria: _criteria, penalty: _penalty}) ); } else { require( _criteria > penaltyInfo[penaltyLength - 1].criteria, "Criteria error: < last criteria" ); penaltyInfo.push( PenaltyInfo({criteria: _criteria, penalty: _penalty}) ); } } /** * @notice Update reward holder * @param _rewardHolder address of reward holder who has enough reward tokens */ function setRewardHolder(address _rewardHolder) public onlyOwner { require(_rewardHolder != address(0), "Zero address: rewardHolder"); rewardHolder = _rewardHolder; } /** * @notice Update fee recipient * @param _feeRecipient address of fee recipient */ function setFeeRecipient(address _feeRecipient) public onlyOwner { require(_feeRecipient != address(0), "Zero address: feeRecipient"); feeRecipient = _feeRecipient; } /** * @notice Update reward emission rate * @param _rewardPerBlock reward emission rate */ function setRewardPerBlock(uint256 _rewardPerBlock) public onlyOwner { rewardPerBlock = _rewardPerBlock; } /** * @notice Update bonus amount * @param _bonusAmount bonus amount */ function setBonusAmount(uint256 _bonusAmount) public onlyOwner { bonusAmount = _bonusAmount; } /** * @notice Update reward variables of the given pool to be up-to-date. * @param _pid pool id */ function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 stakingTokenSupply = pool.totalShares; if (stakingTokenSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 usdcReward = multiplier .mul(rewardPerBlock) .mul(pool.allocPoint) .div(totalAllocPoint); pool.accZeusPerShare = pool.accZeusPerShare.add( usdcReward.mul(PRECISION_FACTOR).div(stakingTokenSupply) ); pool.lastRewardBlock = block.number; } /** * @notice Update reward variables for all pools */ function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } /** * @notice Deposit tokens * @param _pid pool id * @param _amount token amount */ function deposit(uint256 _pid, uint256 _amount) public payable { require(_amount != 0, "Amount should be greater than 0"); uint256 feeAmount = getPenalty(_amount); require(msg.value >= feeAmount, "Insufficient AVAX balance"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accZeusPerShare) .div(PRECISION_FACTOR) .mul(10**rewardDecimal) .div(1e18) .sub(user.rewardDebt); if (pending > 0) { rewardToken.safeTransferFrom( rewardHolder, address(msg.sender), pending ); } } // get penalty in avax pool.stakingToken.safeTransferFrom( address(msg.sender), address(this), _amount ); pool.totalShares += _amount; user.amount = user.amount.add(_amount); user.rewardDebt = user .amount .mul(pool.accZeusPerShare) .div(PRECISION_FACTOR) .mul(10**rewardDecimal) .div(1e18); // transfer avax fee to feeRecipient payable(feeRecipient).transfer(feeAmount); emit Deposit(msg.sender, _pid, _amount); } /** * @notice Withdraw tokens * @param _pid pool id * @param _amount token amount */ function withdraw(uint256 _pid, uint256 _amount) public { uint256 requestId = requestRandomNumbers(); randomRequestInfo[requestId] = RandomRequestInfo({ requester: msg.sender, poolId: _pid, withdrawalAmount: _amount }); } /** * @notice Withdraw without caring about rewards. EMERGENCY ONLY. * @param _pid pool id */ function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.stakingToken.safeTransfer(address(msg.sender), user.amount); pool.totalShares -= user.amount; emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } /** * @notice Request random numbers */ function requestRandomNumbers() public returns (uint256) { // Will revert if subscription is not set and funded. uint256 s_requestId = COORDINATOR.requestRandomWords( keyHash, s_subscriptionId, requestConfirmations, callbackGasLimit, numWords ); return s_requestId; } /** * @notice Callback function used by VRF Coordinator * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override { RandomRequestInfo memory randomRequestUserInfo = randomRequestInfo[ requestId ]; uint256 randomNumber = randomWords[0]; address requester = randomRequestUserInfo.requester; uint256 poolId = randomRequestUserInfo.poolId; uint256 withdrawalAmount = randomRequestUserInfo.withdrawalAmount; PoolInfo storage pool = poolInfo[poolId]; UserInfo storage user = userInfo[poolId][requester]; require(user.amount >= withdrawalAmount, "withdraw: not good"); updatePool(poolId); uint256 pending = user .amount .mul(pool.accZeusPerShare) .div(PRECISION_FACTOR) .mul(10**rewardDecimal) .div(1e18) .sub(user.rewardDebt); if (pending > 0) { rewardToken.safeTransferFrom(rewardHolder, requester, pending); } if (randomNumber % 2 == 0) { pool.stakingToken.safeTransferFrom( rewardHolder, requester, bonusAmount ); } if (withdrawalAmount > 0) { user.amount = user.amount.sub(withdrawalAmount); pool.stakingToken.safeTransfer(requester, withdrawalAmount); pool.totalShares -= withdrawalAmount; } user.rewardDebt = user .amount .mul(pool.accZeusPerShare) .div(PRECISION_FACTOR) .mul(10**rewardDecimal) .div(1e18); emit Withdraw(msg.sender, poolId, withdrawalAmount); } /** * @notice Check Upkeep condition * @return upkeepNeeded true if upkeep is needed * @return performData perform data */ function checkUpkeep( bytes calldata /* checkData */ ) external view override returns ( bool upkeepNeeded, bytes memory /* performData */ ) { upkeepNeeded = block.timestamp > rewardActiveTimestamp + 604800; } /** * @notice Perform Upkeep action */ function performUpkeep( bytes calldata /* performData */ ) external override { require( block.timestamp > rewardActiveTimestamp + 604800, "Not eligible for update" ); if (rewardPerBlock != rewardPerBlockNew) { rewardPerBlock = rewardPerBlockNew; } } /** * @notice Get latest AVAX price */ function getLatestAvaxPrice() public view returns (uint256) { (, int256 price, , , ) = avaxPriceFeed.latestRoundData(); return uint256(price); } }
[{"inputs":[{"internalType":"contract IERC20","name":"_stakingToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardDecimal","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlockNew","type":"uint256"},{"internalType":"address","name":"_rewardHolder","type":"address"},{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"uint256","name":"_bonusAmount","type":"uint256"},{"internalType":"uint64","name":"_subscriptionId","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_stakingToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestAvaxPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"penaltyInfo","outputs":[{"internalType":"uint256","name":"criteria","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"performUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accZeusPerShare","type":"uint256"},{"internalType":"uint256","name":"totalShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardHolder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusAmount","type":"uint256"}],"name":"setBonusAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeRecipient","type":"address"}],"name":"setFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_criteria","type":"uint256"},{"internalType":"uint256","name":"_penalty","type":"uint256"}],"name":"setPenaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardHolder","type":"address"}],"name":"setRewardHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"setRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_multiplierNumber","type":"uint256"}],"name":"updateMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052606460065564e8d4a510006007556000600b55600d80546001600160a01b03191673d5d517abe5cf79b7e95ec98db0f0277788aff6341790557f89630569c9567e43c4fe7b1633258df9f2531b62f2352fa721cf3162ee4ecb46600e55600f8054660100030003d0906001600160501b03199091161790553480156200008957600080fd5b50604051620028bf380380620028bf833981016040819052620000ac9162000447565b600d546001600160a01b0316620000c333620003f7565b60601b6001600160601b0319166080526001600160a01b0389166200012f5760405162461bcd60e51b815260206004820152601a60248201527f5a65726f20616464726573733a207374616b696e67546f6b656e00000000000060448201526064015b60405180910390fd5b6001600160a01b038816620001875760405162461bcd60e51b815260206004820152601960248201527f5a65726f20616464726573733a20726577617264546f6b656e00000000000000604482015260640162000126565b6001600160a01b038416620001df5760405162461bcd60e51b815260206004820152601a60248201527f5a65726f20616464726573733a20726577617264486f6c646572000000000000604482015260640162000126565b6001600160a01b038316620002375760405162461bcd60e51b815260206004820152601a60248201527f5a65726f20616464726573733a20666565526563697069656e74000000000000604482015260640162000126565b600180546001600160a01b03998a166001600160a01b031991821617825560059788556013969096556002979097556040805160a0810182529989168a526103e860208b0181815243928c01928352600060608d0181815260808e01828152600880549d8e0181559092529c519a9099027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3810180549b8d169b8a169b909b17909a55517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48a015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee589015598517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee688015594517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee790960195909555600b96909655600380549186169183169190911790556004805495851695821695909517909455601191909155600d54600c80546001600160401b03909316600160a01b026001600160e01b0319909316919093161717905560128054909116730a77230d17318075983913bc2145db16c73661561790554260145562000511565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060008060008060006101208a8c03121562000466578485fd5b89516200047381620004f8565b60208b01519099506200048681620004f8565b8098505060408a0151965060608a0151955060808a0151945060a08a0151620004af81620004f8565b60c08b0151909450620004c281620004f8565b60e08b01516101008c015191945092506001600160401b0381168114620004e7578182fd5b809150509295985092959850929598565b6001600160a01b03811681146200050e57600080fd5b50565b60805160601c61238862000537600039600081816109c60152610a0801526123886000f3fe60806040526004361061020f5760003560e01c8063630b5ba11161011857806396e59682116100a0578063d1c6b0ca1161006f578063d1c6b0ca14610626578063e2bbb15814610646578063e74b981b14610659578063f2fde38b14610679578063f7c618c11461069957600080fd5b806396e59682146105b057806398969e82146105d0578063bb872b4a146105f0578063ccd34cd51461061057600080fd5b80638aa28550116100e75780638aa28550146105075780638ae39cac1461051d5780638da5cb5b146105335780638dbb1e3a1461055157806393f1a40b1461057157600080fd5b8063630b5ba11461048f5780636806cc93146104a45780636e04ff0d146104c4578063715018a6146104f257600080fd5b8063441a3e701161019b578063478f0ee01161016a578063478f0ee0146103f957806351eb05a61461040f5780635312ea8e1461042f578063569c93d21461044f5780635ffe61461461046f57600080fd5b8063441a3e701461036c5780634585e33b1461038c57806346416f08146103ac57806346904840146103c157600080fd5b806317caf6f1116101e257806317caf6f1146102e15780631ab06ee5146102f75780631fe543e3146103175780632b8bbbe81461033757806343419ea31461035757600080fd5b806307434bd114610214578063081e3eda1461024e5780631526fe271461026d578063161eae4b146102bf575b600080fd5b34801561022057600080fd5b5061023461022f366004611f0d565b6106b9565b604080519283526020830191909152015b60405180910390f35b34801561025a57600080fd5b506008545b604051908152602001610245565b34801561027957600080fd5b5061028d610288366004611f0d565b6106e7565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610245565b3480156102cb57600080fd5b506102df6102da366004612038565b610732565b005b3480156102ed57600080fd5b5061025f600b5481565b34801561030357600080fd5b506102df610312366004612038565b6108ed565b34801561032357600080fd5b506102df610332366004611f6c565b6109bb565b34801561034357600080fd5b506102df610352366004611f3d565b610a43565b34801561036357600080fd5b5061025f610c9a565b34801561037857600080fd5b506102df610387366004612038565b610d2e565b34801561039857600080fd5b506102df6103a7366004611ea0565b610d8b565b3480156103b857600080fd5b5061025f610dfe565b3480156103cd57600080fd5b506004546103e1906001600160a01b031681565b6040516001600160a01b039091168152602001610245565b34801561040557600080fd5b5061025f60025481565b34801561041b57600080fd5b506102df61042a366004611f0d565b610ed3565b34801561043b57600080fd5b506102df61044a366004611f0d565b610fab565b34801561045b57600080fd5b506003546103e1906001600160a01b031681565b34801561047b57600080fd5b506102df61048a366004611f0d565b611076565b34801561049b57600080fd5b506102df6110f6565b3480156104b057600080fd5b506102df6104bf366004611e64565b61111d565b3480156104d057600080fd5b506104e46104df366004611ea0565b6111bf565b6040516102459291906120f0565b3480156104fe57600080fd5b506102df6111df565b34801561051357600080fd5b5061025f60065481565b34801561052957600080fd5b5061025f60055481565b34801561053f57600080fd5b506000546001600160a01b03166103e1565b34801561055d57600080fd5b5061025f61056c366004612038565b611215565b34801561057d57600080fd5b5061023461058c366004611f3d565b600a6020908152600092835260408084209091529082529020805460019091015482565b3480156105bc57600080fd5b5061025f6105cb366004611f0d565b61123c565b3480156105dc57600080fd5b5061025f6105eb366004611f3d565b61130b565b3480156105fc57600080fd5b506102df61060b366004611f0d565b61147c565b34801561061c57600080fd5b5061025f60075481565b34801561063257600080fd5b506102df610641366004611f0d565b6114ab565b6102df610654366004612038565b6114da565b34801561066557600080fd5b506102df610674366004611e64565b61173d565b34801561068557600080fd5b506102df610694366004611e64565b6117df565b3480156106a557600080fd5b506001546103e1906001600160a01b031681565b600981815481106106c957600080fd5b60009182526020909120600290910201805460019091015490915082565b600881815481106106f757600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b6000546001600160a01b031633146107655760405162461bcd60e51b815260040161075c9061211e565b60405180910390fd5b600954806107e6575060408051808201909152918252602082019081526009805460018101825560009190915291517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600290930292830155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b60096107f3600183612289565b8154811061081157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015483116108715760405162461bcd60e51b815260206004820152601f60248201527f4372697465726961206572726f723a203c206c61737420637269746572696100604482015260640161075c565b60408051808201909152838152602081018381526009805460018101825560009190915291517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600290930292830155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0909101555b505050565b6000546001600160a01b031633146109175760405162461bcd60e51b815260040161075c9061211e565b61091f6110f6565b60006008838154811061094257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101549050816008848154811061097857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101819055508181146108e8576109b3826109ad83600b5461187a90919063ffffffff16565b90611886565b600b55505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a355760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016602482015260440161075c565b610a3f8282611892565b5050565b6000546001600160a01b03163314610a6d5760405162461bcd60e51b815260040161075c9061211e565b6001600160a01b038116610ac35760405162461bcd60e51b815260206004820152601b60248201527f5374616b696e6720746f6b656e3a205a65726f20616464726573730000000000604482015260640161075c565b60005b600854811015610b6757816001600160a01b031660088281548110610afb57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600590910201546001600160a01b03161415610b555760405162461bcd60e51b815260206004820152600f60248201526e141bdbdb08191d5c1b1a58d85d1959608a1b604482015260640161075c565b80610b5f816122cc565b915050610ac6565b50610b706110f6565b600b54610b7d9083611886565b600b556040805160a0810182526001600160a01b03928316815260208101938452439181019182526000606082018181526080830182815260088054600181018255935292517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600590930292830180546001600160a01b031916919096161790945593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee485015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee584015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee6830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee790910155565b600080601260009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610ceb57600080fd5b505afa158015610cff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d239190612059565b509195945050505050565b6000610d38610dfe565b6040805160608101825233815260208082019687528183019586526000938452601090529120905181546001600160a01b0319166001600160a01b03909116178155925160018401555051600290910155565b601454610d9b9062093a80612153565b4211610de95760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656c696769626c6520666f7220757064617465000000000000000000604482015260640161075c565b60135460055414610a3f576013546005555050565b600c54600e54600f546040516305d3b1d360e41b81526004810192909252600160a01b830467ffffffffffffffff166024830152640100000000810461ffff16604483015263ffffffff8082166064840152660100000000000090910416608482015260009182916001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015610e9557600080fd5b505af1158015610ea9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecd9190611f25565b92915050565b600060088281548110610ef657634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905080600201544311610f15575050565b600481015480610f2a57504360029091015550565b6000610f3a836002015443611215565b90506000610f6d600b54610f678660010154610f6160055487611af990919063ffffffff16565b90611af9565b90611b05565b9050610f96610f8b84610f6760075485611af990919063ffffffff16565b600386015490611886565b60038501555050436002909201919091555050565b600060088281548110610fce57634e487b7160e01b600052603260045260246000fd5b60009182526020808320858452600a82526040808520338087529352909320805460059093029093018054909450611013926001600160a01b03919091169190611b11565b8054600483018054600090611029908490612289565b90915550508054604051908152839033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a360008082556001909101555050565b6000546001600160a01b031633146110a05760405162461bcd60e51b815260040161075c9061211e565b60648110156110f15760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206d756c7469706c6572206e756d6265720000000000000000604482015260640161075c565b600655565b60085460005b81811015610a3f5761110d81610ed3565b611116816122cc565b90506110fc565b6000546001600160a01b031633146111475760405162461bcd60e51b815260040161075c9061211e565b6001600160a01b03811661119d5760405162461bcd60e51b815260206004820152601a60248201527f5a65726f20616464726573733a20726577617264486f6c646572000000000000604482015260640161075c565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000606060145462093a806111d49190612153565b421191509250929050565b6000546001600160a01b031633146112095760405162461bcd60e51b815260040161075c9061211e565b6112136000611b74565b565b60006112356064610f67600654610f61878761187a90919063ffffffff16565b9392505050565b60095460009081906112515750600092915050565b60005b6009548110156112e9576009818154811061127f57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001548411156112d257600981815481106112b957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015491506112d7565b6112e9565b806112e1816122cc565b915050611254565b506305f5e1006112f7610c9a565b611301919061216b565b611235908261216b565b6000806008848154811061132f57634e487b7160e01b600052603260045260246000fd5b600091825260208083206040805160a081018252600590940290910180546001600160a01b039081168552600180830154868601526002830154868501908152600384015460608801908152600490940154608088019081528c8952600a8752858920938c168952928652968490208451808601909552805485520154938301939093525191519351929450929091431180156113cb57508015155b156114315760006113e0856040015143611215565b90506000611407600b54610f678860200151610f6160055487611af990919063ffffffff16565b905061142c61142584610f6760075485611af990919063ffffffff16565b8590611886565b935050505b611471836020015161146b670de0b6b3a7640000610f67600254600a61145791906121c2565b6007548951610f619190610f67908b611af9565b9061187a565b979650505050505050565b6000546001600160a01b031633146114a65760405162461bcd60e51b815260040161075c9061211e565b600555565b6000546001600160a01b031633146114d55760405162461bcd60e51b815260040161075c9061211e565b601155565b806115275760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e203000604482015260640161075c565b60006115328261123c565b9050803410156115845760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420415641582062616c616e636500000000000000604482015260640161075c565b6000600884815481106115a757634e487b7160e01b600052603260045260246000fd5b60009182526020808320878452600a825260408085203386529092529220600590910290910191506115d885610ed3565b805415611648576000611620826001015461146b670de0b6b3a7640000610f67600254600a61160791906121c2565b60075460038a01548954610f619291610f679190611af9565b9050801561164657600354600154611646916001600160a01b0391821691163384611bc4565b505b815461165f906001600160a01b0316333087611bc4565b838260040160008282546116739190612153565b909155505080546116849085611886565b81556002546116bf90670de0b6b3a764000090610f67906116a690600a6121c2565b60075460038701548654610f619291610f679190611af9565b60018201556004546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156116fe573d6000803e3d6000fd5b50604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b6000546001600160a01b031633146117675760405162461bcd60e51b815260040161075c9061211e565b6001600160a01b0381166117bd5760405162461bcd60e51b815260206004820152601a60248201527f5a65726f20616464726573733a20666565526563697069656e74000000000000604482015260640161075c565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118095760405162461bcd60e51b815260040161075c9061211e565b6001600160a01b03811661186e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161075c565b61187781611b74565b50565b60006112358284612289565b60006112358284612153565b6000828152601060209081526040808320815160608101835281546001600160a01b0316815260018201549381019390935260020154908201528251909190839082906118ef57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008260000151905060008360200151905060008460400151905060006008838154811061193757634e487b7160e01b600052603260045260246000fd5b60009182526020808320868452600a825260408085206001600160a01b038a16865290925292208054600590920290920192508311156119ae5760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015260640161075c565b6119b784610ed3565b60006119df826001015461146b670de0b6b3a7640000610f67600254600a61160791906121c2565b90508015611a0557600354600154611a05916001600160a01b0391821691168884611bc4565b611a106002886122e7565b611a36576003546011548454611a36926001600160a01b03918216929116908990611bc4565b8315611a7a578154611a48908561187a565b82558254611a60906001600160a01b03168786611b11565b83836004016000828254611a749190612289565b90915550505b611ab1670de0b6b3a7640000610f67600254600a611a9891906121c2565b60075460038801548754610f619291610f679190611af9565b6001830155604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a350505050505050505050565b6000611235828461226a565b6000611235828461216b565b6040516001600160a01b0383166024820152604481018290526108e890849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611c02565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052611bfc9085906323b872dd60e01b90608401611b3d565b50505050565b6000611c57826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611cd49092919063ffffffff16565b8051909150156108e85780806020019051810190611c759190611e80565b6108e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161075c565b6060611ce38484600085611ceb565b949350505050565b606082471015611d4c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161075c565b6001600160a01b0385163b611da35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161075c565b600080866001600160a01b03168587604051611dbf91906120d4565b60006040518083038185875af1925050503d8060008114611dfc576040519150601f19603f3d011682016040523d82523d6000602084013e611e01565b606091505b509150915061147182828660608315611e1b575081611235565b825115611e2b5782518084602001fd5b8160405162461bcd60e51b815260040161075c919061210b565b805169ffffffffffffffffffff81168114611e5f57600080fd5b919050565b600060208284031215611e75578081fd5b81356112358161233d565b600060208284031215611e91578081fd5b81518015158114611235578182fd5b60008060208385031215611eb2578081fd5b823567ffffffffffffffff80821115611ec9578283fd5b818501915085601f830112611edc578283fd5b813581811115611eea578384fd5b866020828501011115611efb578384fd5b60209290920196919550909350505050565b600060208284031215611f1e578081fd5b5035919050565b600060208284031215611f36578081fd5b5051919050565b60008060408385031215611f4f578182fd5b823591506020830135611f618161233d565b809150509250929050565b60008060408385031215611f7e578182fd5b8235915060208084013567ffffffffffffffff80821115611f9d578384fd5b818601915086601f830112611fb0578384fd5b813581811115611fc257611fc2612327565b8060051b604051601f19603f83011681018181108582111715611fe757611fe7612327565b604052828152858101935084860182860187018b1015612005578788fd5b8795505b83861015612027578035855260019590950194938601938601612009565b508096505050505050509250929050565b6000806040838503121561204a578182fd5b50508035926020909101359150565b600080600080600060a08688031215612070578081fd5b61207986611e45565b945060208601519350604086015192506060860151915061209c60808701611e45565b90509295509295909350565b600081518084526120c08160208601602086016122a0565b601f01601f19169290920160200192915050565b600082516120e68184602087016122a0565b9190910192915050565b8215158152604060208201526000611ce360408301846120a8565b60208152600061123560208301846120a8565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612166576121666122fb565b500190565b60008261217a5761217a612311565b500490565b600181815b808511156121ba5781600019048211156121a0576121a06122fb565b808516156121ad57918102915b93841c9390800290612184565b509250929050565b600061123583836000826121d857506001610ecd565b816121e557506000610ecd565b81600181146121fb576002811461220557612221565b6001915050610ecd565b60ff841115612216576122166122fb565b50506001821b610ecd565b5060208310610133831016604e8410600b8410161715612244575081810a610ecd565b61224e838361217f565b8060001904821115612262576122626122fb565b029392505050565b6000816000190483118215151615612284576122846122fb565b500290565b60008282101561229b5761229b6122fb565b500390565b60005b838110156122bb5781810151838201526020016122a3565b83811115611bfc5750506000910152565b60006000198214156122e0576122e06122fb565b5060010190565b6000826122f6576122f6612311565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461187757600080fdfea2646970667358221220afe790808b00e3a6fae2a1c34006d34edc459da61c36fdc8d49d96d40bde491264736f6c634300080400330000000000000000000000004156f18bf7c1ef04248632c66aa119de152d8f2e000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000a36cc19bab00000000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b0000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000017
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004156f18bf7c1ef04248632c66aa119de152d8f2e000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000f8b0a10e47000000000000000000000000000000000000000000000000000000a36cc19bab00000000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b0000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000017
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x4156f18bf7c1ef04248632c66aa119de152d8f2e
Arg [1] : _rewardToken (address): 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [2] : _rewardDecimal (uint256): 6
Arg [3] : _rewardPerBlock (uint256): 70000000000000000
Arg [4] : _rewardPerBlockNew (uint256): 46000000000000000
Arg [5] : _rewardHolder (address): 0x0a4172f0dc120bf4a0f0750e52a9a5652fd6de4b
Arg [6] : _feeRecipient (address): 0x0a4172f0dc120bf4a0f0750e52a9a5652fd6de4b
Arg [7] : _bonusAmount (uint256): 1000000000000000000
Arg [8] : _subscriptionId (uint64): 23
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000004156f18bf7c1ef04248632c66aa119de152d8f2e
Arg [1] : 000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 00000000000000000000000000000000000000000000000000f8b0a10e470000
Arg [4] : 00000000000000000000000000000000000000000000000000a36cc19bab0000
Arg [5] : 0000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b
Arg [6] : 0000000000000000000000000a4172f0dc120bf4a0f0750e52a9a5652fd6de4b
Arg [7] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000017
Deployed ByteCode Sourcemap
43575:18933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45298:32;;;;;;;;;;-1:-1:-1;45298:32:0;;;;;:::i;:::-;;:::i;:::-;;;;13826:25:1;;;13882:2;13867:18;;13860:34;;;;13799:18;45298:32:0;;;;;;;;49060:95;;;;;;;;;;-1:-1:-1;49132:8:0;:15;49060:95;;;13616:25:1;;;13604:2;13589:18;49060:95:0;13571:76:1;45238:26:0;;;;;;;;;;-1:-1:-1;45238:26:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7549:32:1;;;7531:51;;7613:2;7598:18;;7591:34;;;;7641:18;;;7634:34;;;;7699:2;7684:18;;7677:34;7742:3;7727:19;;7720:35;7518:3;7503:19;45238:26:0;7485:276:1;53493:623:0;;;;;;;;;;-1:-1:-1;53493:623:0;;;;;:::i;:::-;;:::i;:::-;;45552:34;;;;;;;;;;;;;;;;52616:386;;;;;;;;;;-1:-1:-1;52616:386:0;;;;;:::i;:::-;;:::i;39878:306::-;;;;;;;;;;-1:-1:-1;39878:306:0;;;;;:::i;:::-;;:::i;51646:767::-;;;;;;;;;;-1:-1:-1;51646:767:0;;;;;:::i;:::-;;:::i;62338:167::-;;;;;;;;;;;;;:::i;58147:292::-;;;;;;;;;;-1:-1:-1;58147:292:0;;;;;:::i;:::-;;:::i;61931:343::-;;;;;;;;;;-1:-1:-1;61931:343:0;;;;;:::i;:::-;;:::i;59037:373::-;;;;;;;;;;;;;:::i;44933:27::-;;;;;;;;;;-1:-1:-1;44933:27:0;;;;-1:-1:-1;;;;;44933:27:0;;;;;;-1:-1:-1;;;;;5176:32:1;;;5158:51;;5146:2;5131:18;44933:27:0;5113:102:1;44801:28:0;;;;;;;;;;;;;;;;55345:774;;;;;;;;;;-1:-1:-1;55345:774:0;;;;;:::i;:::-;;:::i;58565:407::-;;;;;;;;;;-1:-1:-1;58565:407:0;;;;;:::i;:::-;;:::i;44864:27::-;;;;;;;;;;-1:-1:-1;44864:27:0;;;;-1:-1:-1;;;;;44864:27:0;;;53148:197;;;;;;;;;;-1:-1:-1;53148:197:0;;;;;:::i;:::-;;:::i;56199:180::-;;;;;;;;;;;;;:::i;54263:189::-;;;;;;;;;;-1:-1:-1;54263:189:0;;;;;:::i;:::-;;:::i;61555:312::-;;;;;;;;;;-1:-1:-1;61555:312:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2610:103::-;;;;;;;;;;;;;:::i;45093:37::-;;;;;;;;;;;;;;;;45008:29;;;;;;;;;;;;;;;;1959:87;;;;;;;;;;-1:-1:-1;2005:7:0;2032:6;-1:-1:-1;;;;;2032:6:0;1959:87;;49333:184;;;;;;;;;;-1:-1:-1;49333:184:0;;;;;:::i;:::-;;:::i;45393:64::-;;;;;;;;;;-1:-1:-1;45393:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49622:446;;;;;;;;;;-1:-1:-1;49622:446:0;;;;;:::i;:::-;;:::i;50223:1117::-;;;;;;;;;;-1:-1:-1;50223:1117:0;;;;;:::i;:::-;;:::i;54882:120::-;;;;;;;;;;-1:-1:-1;54882:120:0;;;;;:::i;:::-;;:::i;45164:38::-;;;;;;;;;;;;;;;;55106:108;;;;;;;;;;-1:-1:-1;55106:108:0;;;;;:::i;:::-;;:::i;56502:1521::-;;;;;;:::i;:::-;;:::i;54570:189::-;;;;;;;;;;-1:-1:-1;54570:189:0;;;;;:::i;:::-;;:::i;2868:238::-;;;;;;;;;;-1:-1:-1;2868:238:0;;;;;:::i;:::-;;:::i;44767:25::-;;;;;;;;;;-1:-1:-1;44767:25:0;;;;-1:-1:-1;;;;;44767:25:0;;;45298:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45298:32:0;:::o;45238:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45238:26:0;;;;-1:-1:-1;45238:26:0;;;;;:::o;53493:623::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;;;;;;;;;53629:11:::1;:18:::0;53662;53658:451:::1;;-1:-1:-1::0;53732:53:0::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;53697:11:::1;:103:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;53697:103:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;53493:623::o;53658:451::-:1;53871:11;53883:17;53899:1;53883:13:::0;:17:::1;:::i;:::-;53871:30;;;;;;-1:-1:-1::0;;;53871:30:0::1;;;;;;;;;;;;;;;;;;;:39;;;53859:9;:51;53833:144;;;::::0;-1:-1:-1;;;53833:144:0;;11852:2:1;53833:144:0::1;::::0;::::1;11834:21:1::0;11891:2;11871:18;;;11864:30;11930:33;11910:18;;;11903:61;11981:18;;53833:144:0::1;11824:181:1::0;53833:144:0::1;54029:53;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;53994:11:::1;:103:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;53994:103:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;53658:451:::1;2250:1;53493:623:::0;;:::o;52616:386::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;52692:17:::1;:15;:17::i;:::-;52720:22;52745:8;52754:4;52745:14;;;;;;-1:-1:-1::0;;;52745:14:0::1;;;;;;;;;;;;;;;;;;;:25;;;52720:50;;52809:11;52781:8;52790:4;52781:14;;;;;;-1:-1:-1::0;;;52781:14:0::1;;;;;;;;;;;;;;;;;;;:25;;:39;;;;52853:11;52835:14;:29;52831:164;;52899:84;52957:11;52899:35;52919:14;52899:15;;:19;;:35;;;;:::i;:::-;:39:::0;::::1;:84::i;:::-;52881:15;:102:::0;2250:1:::1;52616:386:::0;;:::o;39878:306::-;40007:10;-1:-1:-1;;;;;40021:14:0;40007:28;;40003:121;;40059:53;;-1:-1:-1;;;40059:53:0;;40085:10;40059:53;;;5432:34:1;-1:-1:-1;;;;;40097:14:0;5502:15:1;5482:18;;;5475:43;5367:18;;40059:53:0;5349:175:1;40003:121:0;40134:42;40153:9;40164:11;40134:18;:42::i;:::-;39878:306;;:::o;51646:767::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51752:36:0;::::1;51730:113;;;::::0;-1:-1:-1;;;51730:113:0;;10426:2:1;51730:113:0::1;::::0;::::1;10408:21:1::0;10465:2;10445:18;;;10438:30;10504:29;10484:18;;;10477:57;10551:18;;51730:113:0::1;10398:177:1::0;51730:113:0::1;51859:9;51854:180;51878:8;:15:::0;51874:19;::::1;51854:180;;;51964:13;-1:-1:-1::0;;;;;51919:59:0::1;51927:8;51936:1;51927:11;;;;;;-1:-1:-1::0;;;51927:11:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:24:::0;-1:-1:-1;;;;;51927:24:0::1;51919:59;51915:107;;;51997:25;::::0;-1:-1:-1;;;51997:25:0;;13328:2:1;51997:25:0::1;::::0;::::1;13310:21:1::0;13367:2;13347:18;;;13340:30;-1:-1:-1;;;13386:18:1;;;13379:45;13441:18;;51997:25:0::1;13300:165:1::0;51915:107:0::1;51895:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51854:180;;;;52046:17;:15;:17::i;:::-;52092:15;::::0;:32:::1;::::0;52112:11;52092:19:::1;:32::i;:::-;52074:15;:50:::0;52163:231:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;52163:231:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;52296:12:::1;52163:231:::0;;;;;;-1:-1:-1;52163:231:0;;;;;;;;;;;;52135:8:::1;:270:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;52135:270:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;51646:767::o;62338:167::-;62389:7;62412:12;62434:13;;;;;;;;;-1:-1:-1;;;;;62434:13:0;-1:-1:-1;;;;;62434:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;62409:56:0;;62338:167;-1:-1:-1;;;;;62338:167:0:o;58147:292::-;58214:17;58234:22;:20;:22::i;:::-;58298:133;;;;;;;;58342:10;58298:133;;;;;;;;;;;;;;;-1:-1:-1;58267:28:0;;;:17;:28;;;;:164;;;;-1:-1:-1;;;;;;58267:164:0;-1:-1:-1;;;;;58267:164:0;;;;;;;;-1:-1:-1;58267:164:0;;;-1:-1:-1;58267:164:0;;;;;;58147:292::o;61931:343::-;62073:21;;:30;;62097:6;62073:30;:::i;:::-;62055:15;:48;62033:121;;;;-1:-1:-1;;;62033:121:0;;8952:2:1;62033:121:0;;;8934:21:1;8991:2;8971:18;;;8964:30;9030:25;9010:18;;;9003:53;9073:18;;62033:121:0;8924:173:1;62033:121:0;62187:17;;62169:14;;:35;62165:102;;62238:17;;62221:14;:34;61931:343;;:::o;59037:373::-;59190:11;;59235:7;;59288:20;;59190:183;;-1:-1:-1;;;59190:183:0;;59288:20;59190:183;;6742:25:1;;;;-1:-1:-1;;;59257:16:0;;;;6783:18:1;;;6776:59;59288:20:0;;;;;6851:18:1;;;6844:47;59323:16:0;;;;6936:18:1;;;6929:43;59354:8:0;;;;;6988:19:1;;;6981:44;59085:7:0;;;;-1:-1:-1;;;;;59190:11:0;;;;:30;;6714:19:1;;59190:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59168:205;59037:373;-1:-1:-1;;59037:373:0:o;55345:774::-;55397:21;55421:8;55430:4;55421:14;;;;;;-1:-1:-1;;;55421:14:0;;;;;;;;;;;;;;;;;;;55397:38;;55466:4;:20;;;55450:12;:36;55446:75;;55503:7;55345:774;:::o;55446:75::-;55560:16;;;;55591:23;55587:112;;-1:-1:-1;55654:12:0;55631:20;;;;:35;-1:-1:-1;55345:774:0:o;55587:112::-;55709:18;55730:49;55744:4;:20;;;55766:12;55730:13;:49::i;:::-;55709:70;;55790:18;55811:114;55909:15;;55811:79;55874:4;:15;;;55811:44;55840:14;;55811:10;:28;;:44;;;;:::i;:::-;:62;;:79::i;:::-;:97;;:114::i;:::-;55790:135;;55959:106;55998:56;56035:18;55998:32;56013:16;;55998:10;:14;;:32;;;;:::i;:56::-;55959:20;;;;;:24;:106::i;:::-;55936:20;;;:129;-1:-1:-1;;56099:12:0;56076:20;;;;:35;;;;-1:-1:-1;;55345:774:0:o;58565:407::-;58624:21;58648:8;58657:4;58648:14;;;;;;-1:-1:-1;;;58648:14:0;;;;;;;;;;;;;;;;;58697;;;:8;:14;;;;;;58712:10;58697:26;;;;;;;;58788:11;;58648:14;;;;;;;58736:17;;58648:14;;-1:-1:-1;58736:64:0;;-1:-1:-1;;;;;58736:17:0;;;;;58712:10;58736:30;:64::i;:::-;58831:11;;58811:16;;;:31;;58831:11;;58811:31;;58831:11;;58811:31;:::i;:::-;;;;-1:-1:-1;;58894:11:0;;58858:48;;13616:25:1;;;58888:4:0;;58876:10;;58858:48;;13604:2:1;13589:18;58858:48:0;;;;;;;58933:1;58919:15;;;58945;;;;:19;-1:-1:-1;;58565:407:0:o;53148:197::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;53258:3:::1;53237:17;:24;;53229:61;;;::::0;-1:-1:-1;;;53229:61:0;;8192:2:1;53229:61:0::1;::::0;::::1;8174:21:1::0;8231:2;8211:18;;;8204:30;8270:26;8250:18;;;8243:54;8314:18;;53229:61:0::1;8164:174:1::0;53229:61:0::1;53301:16;:36:::0;53148:197::o;56199:180::-;56261:8;:15;56244:14;56287:85;56315:6;56309:3;:12;56287:85;;;56345:15;56356:3;56345:10;:15::i;:::-;56323:5;;;:::i;:::-;;;56287:85;;54263:189;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54347:27:0;::::1;54339:66;;;::::0;-1:-1:-1;;;54339:66:0;;9711:2:1;54339:66:0::1;::::0;::::1;9693:21:1::0;9750:2;9730:18;;;9723:30;9789:28;9769:18;;;9762:56;9835:18;;54339:66:0::1;9683:176:1::0;54339:66:0::1;54416:12;:28:::0;;-1:-1:-1;;;;;;54416:28:0::1;-1:-1:-1::0;;;;;54416:28:0;;;::::1;::::0;;;::::1;::::0;;54263:189::o;61555:312::-;61706:17;61738:12;61829:21;;61853:6;61829:30;;;;:::i;:::-;61811:15;:48;61796:63;;61555:312;;;;;:::o;2610:103::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;2675:30:::1;2702:1;2675:18;:30::i;:::-;2610:103::o:0;49333:184::-;49432:7;49464:45;49505:3;49464:36;49483:16;;49464:14;49472:5;49464:3;:7;;:14;;;;:::i;:45::-;49457:52;49333:184;-1:-1:-1;;;49333:184:0:o;49622:446::-;49730:11;:18;49680:7;;;;49726:37;;-1:-1:-1;49762:1:0;;49622:446;-1:-1:-1;;49622:446:0:o;49726:37::-;49781:9;49776:227;49800:11;:18;49796:22;;49776:227;;;49854:11;49866:1;49854:14;;;;;;-1:-1:-1;;;49854:14:0;;;;;;;;;;;;;;;;;;;:23;;;49844:7;:33;49840:152;;;49908:11;49920:1;49908:14;;;;;;-1:-1:-1;;;49908:14:0;;;;;;;;;;;;;;;;;;;:22;;;49898:32;;49840:152;;;49971:5;;49840:152;49820:3;;;;:::i;:::-;;;;49776:227;;;;50056:3;50033:20;:18;:20::i;:::-;:26;;;;:::i;:::-;50022:38;;:7;:38;:::i;50223:1117::-;50325:7;50350:20;50373:8;50382:4;50373:14;;;;;;-1:-1:-1;;;50373:14:0;;;;;;;;;;;;;;;;;50350:37;;;;;;;;50373:14;;;;;;;50350:37;;-1:-1:-1;;;;;50350:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50421:14;;;:8;:14;;;;;:21;;;;;;;;;;;;50398:44;;;;;;;;;;;;;;;;;;;;;50479:20;50539:16;;50585:20;;50350:37;;-1:-1:-1;50398:44:0;50479:20;;50570:12;:35;:62;;;;-1:-1:-1;50609:23:0;;;50570:62;50566:520;;;50649:18;50670:98;50702:4;:20;;;50741:12;50670:13;:98::i;:::-;50649:119;;50783:18;50804:126;50914:15;;50804:87;50875:4;:15;;;50804:48;50837:14;;50804:10;:32;;:48;;;;:::i;:126::-;50783:147;;50963:111;51002:56;51039:18;51002:32;51017:16;;51002:10;:14;;:32;;;;:::i;:56::-;50963:15;;:19;:111::i;:::-;50945:129;;50566:520;;;51116:216;51316:4;:15;;;51116:177;51288:4;51116:149;51251:13;;51247:2;:17;;;;:::i;:::-;51207:16;;51116:29;;:108;;51207:16;51116:68;;51168:15;51116:51;:68::i;:177::-;:199;;:216::i;:::-;51096:236;50223:1117;-1:-1:-1;;;;;;;50223:1117:0:o;54882:120::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;54962:14:::1;:32:::0;54882:120::o;55106:108::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;55180:11:::1;:26:::0;55106:108::o;56502:1521::-;56584:12;56576:56;;;;-1:-1:-1;;;56576:56:0;;10066:2:1;56576:56:0;;;10048:21:1;10105:2;10085:18;;;10078:30;10144:33;10124:18;;;10117:61;10195:18;;56576:56:0;10038:181:1;56576:56:0;56643:17;56663:19;56674:7;56663:10;:19::i;:::-;56643:39;;56714:9;56701;:22;;56693:60;;;;-1:-1:-1;;;56693:60:0;;10782:2:1;56693:60:0;;;10764:21:1;10821:2;10801:18;;;10794:30;10860:27;10840:18;;;10833:55;10905:18;;56693:60:0;10754:175:1;56693:60:0;56766:21;56790:8;56799:4;56790:14;;;;;;-1:-1:-1;;;56790:14:0;;;;;;;;;;;;;;;;;56839;;;:8;:14;;;;;;56854:10;56839:26;;;;;;;56790:14;;;;;;;;-1:-1:-1;56878:16:0;56848:4;56878:10;:16::i;:::-;56909:11;;:15;56905:507;;56941:15;56959:221;57164:4;:15;;;56959:182;57136:4;56959:154;57099:13;;57095:2;:17;;;;:::i;:::-;57055:16;;57011:20;;;;56959:29;;:113;;57055:16;56959:73;;:29;:51;:73::i;:221::-;56941:239;-1:-1:-1;57199:11:0;;57195:206;;57282:12;;;57231:11;:154;;-1:-1:-1;;;;;57231:11:0;;;;57282:12;57325:10;57359:7;57231:28;:154::i;:::-;56905:507;;57456:17;;:129;;-1:-1:-1;;;;;57456:17:0;57513:10;57547:4;57567:7;57456:34;:129::i;:::-;57616:7;57596:4;:16;;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;57648:11:0;;:24;;57664:7;57648:15;:24::i;:::-;57634:38;;57825:13;;57701:162;;57858:4;;57701:138;;57821:17;;:2;:17;:::i;:::-;57785:16;;57745:20;;;;57701:25;;:101;;57785:16;57701:65;;:25;:43;:65::i;:162::-;57683:15;;;:180;57930:12;;57922:41;;-1:-1:-1;;;;;57930:12:0;;;;57922:41;;;;;57953:9;;57930:12;57922:41;57930:12;57922:41;57953:9;57930:12;57922:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57981:34:0;;13616:25:1;;;58001:4:0;;57989:10;;57981:34;;13604:2:1;13589:18;57981:34:0;;;;;;;56502:1521;;;;;:::o;54570:189::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54654:27:0;::::1;54646:66;;;::::0;-1:-1:-1;;;54646:66:0;;11136:2:1;54646:66:0::1;::::0;::::1;11118:21:1::0;11175:2;11155:18;;;11148:30;11214:28;11194:18;;;11187:56;11260:18;;54646:66:0::1;11108:176:1::0;54646:66:0::1;54723:12;:28:::0;;-1:-1:-1;;;;;;54723:28:0::1;-1:-1:-1::0;;;;;54723:28:0;;;::::1;::::0;;;::::1;::::0;;54570:189::o;2868:238::-;2005:7;2032:6;-1:-1:-1;;;;;2032:6:0;736:10;2179:23;2171:68;;;;-1:-1:-1;;;2171:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2971:22:0;::::1;2949:110;;;::::0;-1:-1:-1;;;2949:110:0;;8545:2:1;2949:110:0::1;::::0;::::1;8527:21:1::0;8584:2;8564:18;;;8557:30;8623:34;8603:18;;;8596:62;-1:-1:-1;;;8674:18:1;;;8667:36;8720:19;;2949:110:0::1;8517:228:1::0;2949:110:0::1;3070:28;3089:8;3070:18;:28::i;:::-;2868:238:::0;:::o;23262:98::-;23320:7;23347:5;23351:1;23347;:5;:::i;22881:98::-;22939:7;22966:5;22970:1;22966;:5;:::i;59650:1745::-;59779:46;59828:52;;;:17;:52;;;;;;;;59779:101;;;;;;;;;-1:-1:-1;;;;;59779:101:0;;;;;;;;;;;;;;;;;;;;;59914:14;;59779:101;;:46;59914:11;;59779:46;;59914:14;;-1:-1:-1;;;59914:14:0;;;;;;;;;;;;;;;59891:37;;59939:17;59959:21;:31;;;59939:51;;60001:14;60018:21;:28;;;60001:45;;60057:24;60084:21;:38;;;60057:65;;60135:21;60159:8;60168:6;60159:16;;;;;;-1:-1:-1;;;60159:16:0;;;;;;;;;;;;;;;;;60210;;;:8;:16;;;;;;-1:-1:-1;;;;;60210:27:0;;;;;;;;;60258:11;;60159:16;;;;;;;;-1:-1:-1;60258:31:0;-1:-1:-1;60258:31:0;60250:62;;;;-1:-1:-1;;;60250:62:0;;12570:2:1;60250:62:0;;;12552:21:1;12609:2;12589:18;;;12582:30;-1:-1:-1;;;12628:18:1;;;12621:48;12686:18;;60250:62:0;12542:168:1;60250:62:0;60325:18;60336:6;60325:10;:18::i;:::-;60356:15;60374:197;60555:4;:15;;;60374:162;60531:4;60374:138;60498:13;;60494:2;:17;;;;:::i;60374:197::-;60356:215;-1:-1:-1;60588:11:0;;60584:106;;60645:12;;;60616:11;:62;;-1:-1:-1;;;;;60616:11:0;;;;60645:12;60659:9;60670:7;60616:28;:62::i;:::-;60706:16;60721:1;60706:12;:16;:::i;:::-;60702:192;;60797:12;;60856:11;;60744:17;;:138;;-1:-1:-1;;;;;60744:17:0;;;;60797:12;;;60828:9;;60744:34;:138::i;:::-;60910:20;;60906:225;;60961:11;;:33;;60977:16;60961:15;:33::i;:::-;60947:47;;61009:17;;:59;;-1:-1:-1;;;;;61009:17:0;61040:9;61051:16;61009:30;:59::i;:::-;61103:16;61083:4;:16;;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;60906:225:0;61161:162;61318:4;61161:138;61285:13;;61281:2;:17;;;;:::i;:::-;61245:16;;61205:20;;;;61161:25;;:101;;61245:16;61161:65;;:25;:43;:65::i;:162::-;61143:15;;;:180;61341:46;;13616:25:1;;;61362:6:0;;61350:10;;61341:46;;13604:2:1;13589:18;61341:46:0;;;;;;;59650:1745;;;;;;;;;;:::o;23619:98::-;23677:7;23704:5;23708:1;23704;:5;:::i;24018:98::-;24076:7;24103:5;24107:1;24103;:5;:::i;16079:248::-;16250:58;;-1:-1:-1;;;;;6101:32:1;;16250:58:0;;;6083:51:1;6150:18;;;6143:34;;;16196:123:0;;16230:5;;-1:-1:-1;;;16273:23:0;6056:18:1;;16250:58:0;;;;-1:-1:-1;;16250:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;16250:58:0;-1:-1:-1;;;;;;16250:58:0;;;;;;;;;;16196:19;:123::i;3266:191::-;3340:16;3359:6;;-1:-1:-1;;;;;3376:17:0;;;-1:-1:-1;;;;;;3376:17:0;;;;;;3409:40;;3359:6;;;;;;;3409:40;;3340:16;3409:40;3266:191;;:::o;16335:285::-;16533:68;;-1:-1:-1;;;;;5787:15:1;;;16533:68:0;;;5769:34:1;5839:15;;5819:18;;;5812:43;5871:18;;;5864:34;;;16479:133:0;;16513:5;;-1:-1:-1;;;16556:27:0;5704:18:1;;16533:68:0;5686:218:1;16479:133:0;16335:285;;;;:::o;19046:802::-;19470:23;19496:106;19538:4;19496:106;;;;;;;;;;;;;;;;;19504:5;-1:-1:-1;;;;;19496:27:0;;;:106;;;;;:::i;:::-;19617:17;;19470:132;;-1:-1:-1;19617:21:0;19613:228;;19732:10;19721:30;;;;;;;;;;;;:::i;:::-;19695:134;;;;-1:-1:-1;;;19695:134:0;;12917:2:1;19695:134:0;;;12899:21:1;12956:2;12936:18;;;12929:30;12995:34;12975:18;;;12968:62;-1:-1:-1;;;13046:18:1;;;13039:40;13096:19;;19695:134:0;12889:232:1;10487:229:0;10624:12;10656:52;10678:6;10686:4;10692:1;10695:12;10656:21;:52::i;:::-;10649:59;10487:229;-1:-1:-1;;;;10487:229:0:o;11703:571::-;11873:12;11945:5;11920:21;:30;;11898:118;;;;-1:-1:-1;;;11898:118:0;;9304:2:1;11898:118:0;;;9286:21:1;9343:2;9323:18;;;9316:30;9382:34;9362:18;;;9355:62;-1:-1:-1;;;9433:18:1;;;9426:36;9479:19;;11898:118:0;9276:228:1;11898:118:0;-1:-1:-1;;;;;7940:19:0;;;12027:60;;;;-1:-1:-1;;;12027:60:0;;12212:2:1;12027:60:0;;;12194:21:1;12251:2;12231:18;;;12224:30;12290:31;12270:18;;;12263:59;12339:18;;12027:60:0;12184:179:1;12027:60:0;12101:12;12115:23;12142:6;-1:-1:-1;;;;;12142:11:0;12161:5;12182:4;12142:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12100:97;;;;12215:51;12232:7;12241:10;12253:12;14813;14842:7;14838:530;;;-1:-1:-1;14873:10:0;14866:17;;14838:530;14987:17;;:21;14983:374;;15185:10;15179:17;15246:15;15233:10;15229:2;15225:19;15218:44;15133:148;15328:12;15321:20;;-1:-1:-1;;;15321:20:0;;;;;;;;:::i;14:179:1:-;92:13;;145:22;134:34;;124:45;;114:2;;183:1;180;173:12;114:2;73:120;;;:::o;198:257::-;257:6;310:2;298:9;289:7;285:23;281:32;278:2;;;331:6;323;316:22;278:2;375:9;362:23;394:31;419:5;394:31;:::i;460:297::-;527:6;580:2;568:9;559:7;555:23;551:32;548:2;;;601:6;593;586:22;548:2;638:9;632:16;691:5;684:13;677:21;670:5;667:32;657:2;;718:6;710;703:22;762:641;832:6;840;893:2;881:9;872:7;868:23;864:32;861:2;;;914:6;906;899:22;861:2;959:9;946:23;988:18;1029:2;1021:6;1018:14;1015:2;;;1050:6;1042;1035:22;1015:2;1093:6;1082:9;1078:22;1068:32;;1138:7;1131:4;1127:2;1123:13;1119:27;1109:2;;1165:6;1157;1150:22;1109:2;1210;1197:16;1236:2;1228:6;1225:14;1222:2;;;1257:6;1249;1242:22;1222:2;1307:7;1302:2;1293:6;1289:2;1285:15;1281:24;1278:37;1275:2;;;1333:6;1325;1318:22;1275:2;1369;1361:11;;;;;1391:6;;-1:-1:-1;851:552:1;;-1:-1:-1;;;;851:552:1:o;1408:190::-;1467:6;1520:2;1508:9;1499:7;1495:23;1491:32;1488:2;;;1541:6;1533;1526:22;1488:2;-1:-1:-1;1569:23:1;;1478:120;-1:-1:-1;1478:120:1:o;1603:194::-;1673:6;1726:2;1714:9;1705:7;1701:23;1697:32;1694:2;;;1747:6;1739;1732:22;1694:2;-1:-1:-1;1775:16:1;;1684:113;-1:-1:-1;1684:113:1:o;1802:325::-;1870:6;1878;1931:2;1919:9;1910:7;1906:23;1902:32;1899:2;;;1952:6;1944;1937:22;1899:2;1993:9;1980:23;1970:33;;2053:2;2042:9;2038:18;2025:32;2066:31;2091:5;2066:31;:::i;:::-;2116:5;2106:15;;;1889:238;;;;;:::o;2132:1239::-;2225:6;2233;2286:2;2274:9;2265:7;2261:23;2257:32;2254:2;;;2307:6;2299;2292:22;2254:2;2348:9;2335:23;2325:33;;2377:2;2430;2419:9;2415:18;2402:32;2453:18;2494:2;2486:6;2483:14;2480:2;;;2515:6;2507;2500:22;2480:2;2558:6;2547:9;2543:22;2533:32;;2603:7;2596:4;2592:2;2588:13;2584:27;2574:2;;2630:6;2622;2615:22;2574:2;2671;2658:16;2693:2;2689;2686:10;2683:2;;;2699:18;;:::i;:::-;2745:2;2742:1;2738:10;2777:2;2771:9;2840:2;2836:7;2831:2;2827;2823:11;2819:25;2811:6;2807:38;2895:6;2883:10;2880:22;2875:2;2863:10;2860:18;2857:46;2854:2;;;2906:18;;:::i;:::-;2942:2;2935:22;2992:18;;;3026:15;;;;-1:-1:-1;3061:11:1;;;3091;;;3087:20;;3084:33;-1:-1:-1;3081:2:1;;;3135:6;3127;3120:22;3081:2;3162:6;3153:15;;3177:163;3191:2;3188:1;3185:9;3177:163;;;3248:17;;3236:30;;3209:1;3202:9;;;;;3286:12;;;;3318;;3177:163;;;3181:3;3359:6;3349:16;;;;;;;;2244:1127;;;;;:::o;3720:258::-;3788:6;3796;3849:2;3837:9;3828:7;3824:23;3820:32;3817:2;;;3870:6;3862;3855:22;3817:2;-1:-1:-1;;3898:23:1;;;3968:2;3953:18;;;3940:32;;-1:-1:-1;3807:171:1:o;3983:483::-;4086:6;4094;4102;4110;4118;4171:3;4159:9;4150:7;4146:23;4142:33;4139:2;;;4193:6;4185;4178:22;4139:2;4221:39;4250:9;4221:39;:::i;:::-;4211:49;;4300:2;4289:9;4285:18;4279:25;4269:35;;4344:2;4333:9;4329:18;4323:25;4313:35;;4388:2;4377:9;4373:18;4367:25;4357:35;;4411:49;4455:3;4444:9;4440:19;4411:49;:::i;:::-;4401:59;;4129:337;;;;;;;;:::o;4471:257::-;4512:3;4550:5;4544:12;4577:6;4572:3;4565:19;4593:63;4649:6;4642:4;4637:3;4633:14;4626:4;4619:5;4615:16;4593:63;:::i;:::-;4710:2;4689:15;-1:-1:-1;;4685:29:1;4676:39;;;;4717:4;4672:50;;4520:208;-1:-1:-1;;4520:208:1:o;4733:274::-;4862:3;4900:6;4894:13;4916:53;4962:6;4957:3;4950:4;4942:6;4938:17;4916:53;:::i;:::-;4985:16;;;;;4870:137;-1:-1:-1;;4870:137:1:o;6188:298::-;6371:6;6364:14;6357:22;6346:9;6339:41;6416:2;6411;6400:9;6396:18;6389:30;6320:4;6436:44;6476:2;6465:9;6461:18;6453:6;6436:44;:::i;7766:219::-;7915:2;7904:9;7897:21;7878:4;7935:44;7975:2;7964:9;7960:18;7952:6;7935:44;:::i;11289:356::-;11491:2;11473:21;;;11510:18;;;11503:30;11569:34;11564:2;11549:18;;11542:62;11636:2;11621:18;;11463:182::o;13905:128::-;13945:3;13976:1;13972:6;13969:1;13966:13;13963:2;;;13982:18;;:::i;:::-;-1:-1:-1;14018:9:1;;13953:80::o;14038:120::-;14078:1;14104;14094:2;;14109:18;;:::i;:::-;-1:-1:-1;14143:9:1;;14084:74::o;14163:422::-;14252:1;14295:5;14252:1;14309:270;14330:7;14320:8;14317:21;14309:270;;;14389:4;14385:1;14381:6;14377:17;14371:4;14368:27;14365:2;;;14398:18;;:::i;:::-;14448:7;14438:8;14434:22;14431:2;;;14468:16;;;;14431:2;14547:22;;;;14507:15;;;;14309:270;;;14313:3;14227:358;;;;;:::o;14590:131::-;14650:5;14679:36;14706:8;14700:4;14775:5;14805:8;14795:2;;-1:-1:-1;14846:1:1;14860:5;;14795:2;14894:4;14884:2;;-1:-1:-1;14931:1:1;14945:5;;14884:2;14976:4;14994:1;14989:59;;;;15062:1;15057:130;;;;14969:218;;14989:59;15019:1;15010:10;;15033:5;;;15057:130;15094:3;15084:8;15081:17;15078:2;;;15101:18;;:::i;:::-;-1:-1:-1;;15157:1:1;15143:16;;15172:5;;14969:218;;15271:2;15261:8;15258:16;15252:3;15246:4;15243:13;15239:36;15233:2;15223:8;15220:16;15215:2;15209:4;15206:12;15202:35;15199:77;15196:2;;;-1:-1:-1;15308:19:1;;;15340:5;;15196:2;15387:34;15412:8;15406:4;15387:34;:::i;:::-;15457:6;15453:1;15449:6;15445:19;15436:7;15433:32;15430:2;;;15468:18;;:::i;:::-;15506:20;;14785:747;-1:-1:-1;;;14785:747:1:o;15537:168::-;15577:7;15643:1;15639;15635:6;15631:14;15628:1;15625:21;15620:1;15613:9;15606:17;15602:45;15599:2;;;15650:18;;:::i;:::-;-1:-1:-1;15690:9:1;;15589:116::o;15710:125::-;15750:4;15778:1;15775;15772:8;15769:2;;;15783:18;;:::i;:::-;-1:-1:-1;15820:9:1;;15759:76::o;15840:258::-;15912:1;15922:113;15936:6;15933:1;15930:13;15922:113;;;16012:11;;;16006:18;15993:11;;;15986:39;15958:2;15951:10;15922:113;;;16053:6;16050:1;16047:13;16044:2;;;-1:-1:-1;;16088:1:1;16070:16;;16063:27;15893:205::o;16103:135::-;16142:3;-1:-1:-1;;16163:17:1;;16160:2;;;16183:18;;:::i;:::-;-1:-1:-1;16230:1:1;16219:13;;16150:88::o;16243:112::-;16275:1;16301;16291:2;;16306:18;;:::i;:::-;-1:-1:-1;16340:9:1;;16281:74::o;16360:127::-;16421:10;16416:3;16412:20;16409:1;16402:31;16452:4;16449:1;16442:15;16476:4;16473:1;16466:15;16492:127;16553:10;16548:3;16544:20;16541:1;16534:31;16584:4;16581:1;16574:15;16608:4;16605:1;16598:15;16624:127;16685:10;16680:3;16676:20;16673:1;16666:31;16716:4;16713:1;16706:15;16740:4;16737:1;16730:15;16756:131;-1:-1:-1;;;;;16831:31:1;;16821:42;;16811:2;;16877:1;16874;16867:12
Swarm Source
ipfs://afe790808b00e3a6fae2a1c34006d34edc459da61c36fdc8d49d96d40bde4912
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.