Contract Overview
Balance:
0 AVAX
AVAX Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
SteakMasterChef
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-04-28 */ // 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/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 contracts/libraries/BoringJoeERC20.sol pragma solidity ^0.8.0; // solhint-disable avoid-low-level-calls library BoringJoeERC20 { bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol() bytes4 private constant SIG_NAME = 0x06fdde03; // name() bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals() bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256) bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256) function returnDataToString(bytes memory data) internal pure returns (string memory) { if (data.length >= 64) { return abi.decode(data, (string)); } else if (data.length == 32) { uint8 i = 0; while (i < 32 && data[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && data[i] != 0; i++) { bytesArray[i] = data[i]; } return string(bytesArray); } else { return "???"; } } /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token symbol. function safeSymbol(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.name version which returns '???' as fallback string. /// @param token The address of the ERC-20 token contract. /// @return (string) Token name. function safeName(IERC20 token) internal view returns (string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME)); return success ? returnDataToString(data) : "???"; } /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value. /// @param token The address of the ERC-20 token contract. /// @return (uint8) Token decimals. function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransfer( IERC20 token, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations. /// Reverts on a failed transfer. /// @param token The address of the ERC-20 token. /// @param from Transfer tokens from. /// @param to Transfer tokens to. /// @param amount The token amount. function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { (bool success, bytes memory data) = address(token).call( abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount) ); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } } // File contracts/interfaces/IBoostedMasterChefJoe.sol pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; interface IBoostedMasterChefJoe { struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. JOE to distribute per block. uint256 lastRewardTimestamp; // Last block number that JOE distribution occurs. uint256 accJoePerShare; // Accumulated JOE per share, times 1e12. See below. } //function userInfo(uint256 _pid, address _user) external view returns (IMasterChefJoe.UserInfo memory); function poolInfo(uint256 pid) external view returns (IBoostedMasterChefJoe.PoolInfo memory); function totalAllocPoint() external view returns (uint256); function joePerSec() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function devPercent() external view returns (uint256); function treasuryPercent() external view returns (uint256); function investorPercent() external view returns (uint256); function pendingTokens(uint256 _pid, address _user) external view returns ( uint256 pendingJoe, address bonusTokenAddress, string memory bonusTokenSymbol, uint256 pendingBonusToken); function emergencyWithdraw(uint256 _pid) external; } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File contracts/interfaces/IVeJoeStaking.sol pragma solidity ^0.8.0; interface IVeJoeStaking { function deposit(uint256 _amount) external; function withdraw(uint256 _amount) external; function claim() external; } // File contracts/protocol/SteakHutVoter.sol pragma solidity ^0.8.0; /// @notice Key Interface between Masterchef/Zapper and Trader Joe. /// Manages the staking / unstaking / rewards of Trader Joe. contract SteakHutVoter is AccessControl { // Create a new role identifier for the minter role bytes32 public constant ZAPPER_ROLE = keccak256("ZAPPER_ROLE"); bytes32 public constant MASTERCHEF_ROLE = keccak256("MASTERCHEF_ROLE"); IBoostedMasterChefJoe public constant BMCJ = IBoostedMasterChefJoe(0x4483f0b6e2F5486D06958C20f8C39A7aBe87bf8F); IVeJoeStaking public constant VeJoeStaking = IVeJoeStaking(0x25D85E17dD9e544F6E9F8D44F99602dbF5a97341); IERC20 public constant JOE = IERC20(0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd); event Deposit(uint256 _pid, uint256 amount); event Withdraw(uint256 _pid, uint256 amount); event ClaimJoe(uint256 amount); event ClaimBonusToken(uint256 amount, address tokenAddress); event StakeJoe(uint256 amount); event ClaimVeJOE(); event EmergencyWithdraw(uint256 _pid, uint256 amount); constructor() { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } /// @notice Deposit LP tokens to BMCJ /// @param _lpToken The LP Token to deposit` /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to deposit function _deposit(IERC20 _lpToken, uint256 _pid, uint256 _amount) external { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); //send LP token to BMCJ _lpToken.approve(address(BMCJ), _amount); //deposit to BMCJ BMCJ.deposit(_pid, _amount); _lpToken.approve(address(BMCJ), 0); emit Deposit(_pid, _amount); } /// @notice Withdraw LP tokens from BMCJ /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to withdraw /// @notice this is to be limited to only masterchef function _withdraw(IERC20 _lpToken, uint256 _pid, uint256 _amount) external { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); //return LP token from BMCJ to this voter BMCJ.withdraw(_pid, _amount); //return LP tokens to the SteakMasterChef _lpToken.transfer(msg.sender, _amount); emit Withdraw(_pid, _amount); } /// @notice Withdraw without caring about rewards (EMERGENCY ONLY) /// @param _lpToken The lp token of requiring withdrawl /// @param _pid The index of the pool. See `poolInfo` /// @notice this is to be limited to only masterchef function _emergencyWithdraw(IERC20 _lpToken, uint256 _pid) external { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); //Emergency withdraw LP tokens to the SHMC BMCJ.emergencyWithdraw(_pid); uint256 _bal = _lpToken.balanceOf(address(this)); //Return LP tokens to the SteakMasterChef _lpToken.transfer(msg.sender, _bal); emit EmergencyWithdraw(_pid, _bal); } /// @notice Claims JOE Rewards from this voter /// @param _amount amount of Joe to Claim /// @notice highly sensitive limited to only SteakHut Master Chef function _claimJOE(uint256 _amount) external { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); require(JOE.balanceOf(address(this)) >= _amount, 'Voter: Reject, Not Enough Joe; Wait.'); JOE.transfer(msg.sender, _amount); emit ClaimJoe(_amount); } /// @notice Claims Bonus Token Rewards /// @param _amount amount of Bonus Token to Claim /// @notice highly sensitive limited to only SteakHut Master Chef function _claimBonusToken(uint256 _amount, address _tokenAddress) external { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); IERC20 bonusToken = IERC20(_tokenAddress); require(bonusToken.balanceOf(address(this)) >= _amount, 'Voter: Reject, Not Enough Bonus Tokens; Wait.'); bonusToken.transfer(msg.sender, _amount); emit ClaimBonusToken(_amount, _tokenAddress); } /// @notice Deposit JOE tokens to veJOEStaking Contract /// @param _amount JOE token amount to deposit /// @notice this is to be limited to only zapper function _stakeJOE(uint256 _amount) external { require(hasRole(ZAPPER_ROLE, msg.sender), "Caller is not Zapper"); JOE.approve(address(VeJoeStaking), _amount); VeJoeStaking.deposit(_amount); JOE.approve(address(VeJoeStaking), 0); emit StakeJoe(_amount); } /// @notice claim any avaliable veJOE /// anyone can call as will claim for voter function _claimVeJoe() external { VeJoeStaking.claim(); emit ClaimVeJOE(); } /** * @notice Open-ended execute function * @dev Very sensitive, restricted to owner * @param target address * @param value value to transfer * @param data calldata * @return bool success * @return bytes result */ function execute( address target, uint256 value, bytes calldata data ) external returns (bool, bytes memory) { require(hasRole(MASTERCHEF_ROLE, msg.sender), "Caller is not masterchef"); (bool success, bytes memory result) = target.call{value: value}(data); return (success, result); } } // File contracts/protocol/SteakMasterChef.sol pragma solidity ^0.8.0; contract SteakMasterChef is Ownable { using SafeMath for uint; using SafeMath for uint256; /// @notice addresses for required JOE Contracts IBoostedMasterChefJoe public constant BMCJ = IBoostedMasterChefJoe(0x4483f0b6e2F5486D06958C20f8C39A7aBe87bf8F); IERC20 public constant JOE = IERC20(0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd); ///@notice enable and disable the masterchef bool public isSteakMasterChefEnabled; ///@notice the fee % that is payable from rewards to the treasury. ///variable from 0 to max of 20%, initial 3%. uint256 public poolFee = 3; ///@notice address where fees are collected to. address public treasuryWallet; ///@notice SteakHut Voter Interface SteakHutVoter public immutable voter; /// @notice Info of each SHMC user /// `amount` LP token amount the user has provided struct UserInfo { uint256 amount; uint256 rewardDebt; } /// @notice Info of each SteakHut MasterChef pool struct PoolInfo { IERC20 lpToken; //accJoePerShare is the amount of accumulated rewards // Accumulated JOE per share, times 1e18. See below. uint256 accJoePerShare; // lastRewardTimestamp = last reward when paid from BJMC to SH_Voter uint256 lastRewardTimestamp; // The total LP supply of the farm // This is the sum of all users boosted amounts in the farm. Updated when // someone deposits or withdraws. uint256 totalLpSupply; //enable and disable pools as absolutely required. bool poolEnabled; } /// @notice Info of each SHMC pool PoolInfo[] public poolInfo; /// @notice Maps an address to a bool to assert that a token isn't added twice mapping(IERC20 => bool) private checkPoolDuplicate; /// @notice Info of each user that stakes LP tokens mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @notice Events 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); event Claim(address indexed user, uint256 indexed pid, uint256 amount); event Add(uint256 indexed pid, IERC20 indexed lpToken); event SetPoolStatus(uint256 indexed pid, bool poolStatus); event SetSteakMasterChefEnabled(bool isEnabled); event SetTreasury(address treasuryAddress); event SetRewardFee(uint256 rewardFee); /// @notice contructor function for SteakMasterChef /// @param _isMasterChefEnabled is the masterchef enabled constructor( bool _isMasterChefEnabled, SteakHutVoter _voterAddress ){ isSteakMasterChefEnabled = _isMasterChefEnabled; voter = _voterAddress; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// @param _lpToken Address of the LP ERC-20 token. function add( IERC20 _lpToken ) external onlyOwner { require(!checkPoolDuplicate[_lpToken], "SteakMasterChef: LP already added"); //require(poolInfo.length <= 50, "SteakMasterChef: Too many pools"); checkPoolDuplicate[_lpToken] = true; // Sanity check to ensure _lpToken is an ERC20 token _lpToken.balanceOf(address(this)); //push the new pool poolInfo.push( PoolInfo({ lpToken: _lpToken, lastRewardTimestamp: uint256(block.timestamp), totalLpSupply: 0, poolEnabled: true, accJoePerShare: 0 }) ); emit Add(poolInfo.length - 1, _lpToken); } /// @notice Returns the number of SHMC pools. /// @return pools The amount of pools in this farm function poolLength() external view returns (uint256 pools) { pools = poolInfo.length; } /// @notice Returns the lp value of a pool /// @param _pid pool id of pool /// @return lpValue The amount of pools in this farm function poolLpSupply(uint256 _pid) external view returns (uint256 lpValue) { PoolInfo storage pool = poolInfo[_pid]; return(pool.totalLpSupply); } /// @notice Enable and Disable Pool Deposits /// @param _pid ID of the pool of interest /// @param _isPoolEnabled is the pool enabled? function setPoolStatus(uint256 _pid, bool _isPoolEnabled) external onlyOwner { PoolInfo storage pool = poolInfo[_pid]; pool.poolEnabled = _isPoolEnabled; emit SetPoolStatus(_pid, _isPoolEnabled); } /// @notice Deposit LP tokens to SteakMasterChef for allocation /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to deposit function deposit(uint256 _pid, uint256 _amount) external { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(isSteakMasterChefEnabled, 'SteakHut MasterChef: Protocol Not Enabled'); require(pool.poolEnabled, 'SteakHut MasterChef: Current Pool Not Enabled'); uint256 balanceBefore = pool.lpToken.balanceOf(address(this)); pool.lpToken.transferFrom(msg.sender, address(this), _amount); uint256 receivedAmount = pool.lpToken.balanceOf(address(this)).sub(balanceBefore); //deposits to the BMCJ contract through Voter _deposit(pool.lpToken, _pid, _amount); //claim reward if user lp balance is greater than 0. if (user.amount > 0) { uint256 pending = user.amount.mul(pool.accJoePerShare).div(1e18).sub( user.rewardDebt ); _transferRewards(pending, _pid); } //update the user and pool statistics _updateUserAndPool(user, pool, receivedAmount, true); //updates users reward debt user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e18); emit Deposit(msg.sender, _pid, receivedAmount); } /// @notice Deposit LP tokens to Voter -> BMCJ for JOE allocation /// @param _lpToken The LP Token to deposit` /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to deposit function _deposit(IERC20 _lpToken, uint256 _pid, uint256 _amount) internal { uint256 beforeJoe = JOE.balanceOf(address(voter)); //Transfer lp tokens to voter for deposit _lpToken.transfer(address(voter), _amount); voter._deposit(_lpToken, _pid, _amount); uint256 afterJoe = JOE.balanceOf(address(voter)); //update the pool accJoePerShare uint256 _harvestAmount = afterJoe.sub(beforeJoe); updatePool(_pid, _harvestAmount); } /// @notice Withdraw LP tokens from SteakMasterChef to sender /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to withdraw function withdraw(uint256 _pid, uint256 _amount) external { require(_amount >= 0, "SteakMasterChef: Withdraw cannot be < 0"); require(isSteakMasterChefEnabled, 'SteakHut MasterChef: Protocol Not Enabled'); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "SteakMasterChef: withdraw not good"); //transfers lp token back to this address from voter _withdraw(pool.lpToken, _pid, _amount); //check and transfer any pending rewards. uint256 pending = user.amount.mul(pool.accJoePerShare).div(1e18).sub( user.rewardDebt ); //Trasfer the rewards to user and take fee. _transferRewards(pending, _pid); //update the pool data _updateUserAndPool(user, pool, _amount, false); //updates the users rewardDebt user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e18); //transfer token from masterchef to depositor pool.lpToken.transfer(msg.sender, _amount); emit Withdraw(msg.sender, _pid, _amount); } /// @notice Withdraw LP tokens from BMCJ to SH Masterchef /// @param _pid The index of the pool. See `poolInfo` /// @param _amount LP token amount to deposit function _withdraw(IERC20 _lpToken, uint256 _pid, uint256 _amount) private { //catch the amount of Joe before and after making a call to BJMC uint256 beforeJoe = JOE.balanceOf(address(voter)); //Return LP token to BMCJ voter._withdraw(_lpToken, _pid, _amount); uint256 afterJoe = JOE.balanceOf(address(voter)); //update the pool accJoePerShare uint256 _harvestAmount = afterJoe.sub(beforeJoe); updatePool(_pid, _harvestAmount); } /// @notice Transfers the rewards to the recipient /// @param _amount The amount of rewards to pay to user /// @param _pid The index of the pool. See `poolInfo` function _transferRewards(uint256 _amount, uint256 _pid) private { //IERC20 JoeToken = IERC20(JOE); //take transaction fee from rewards, send to fee taker wallet uint256 transactionFee = _amount.mul(poolFee).div(100); uint256 userReward = _amount.sub(transactionFee); //claim the pending rewards from the voter voter._claimJOE(_amount); //transfer the rewards to user and treasury JOE.transfer(msg.sender, userReward); JOE.transfer(treasuryWallet, transactionFee); emit Claim(msg.sender, _pid, _amount); } /// @notice Updates user and pool infos /// @param _user The user that needs to be updated /// @param _pool The pool that needs to be updated /// @param _amount The amount that was deposited or withdrawn /// @param _isDeposit If the action of the user is a deposit function _updateUserAndPool( UserInfo storage _user, PoolInfo storage _pool, uint256 _amount, bool _isDeposit ) private { uint256 oldAmount = _user.amount; uint256 newAmount = _isDeposit ? oldAmount.add(_amount) : oldAmount.sub(_amount); //updates the user pool and pool totals if (_amount != 0) { _user.amount = newAmount; _pool.totalLpSupply = _isDeposit ? _pool.totalLpSupply.add(_amount) : _pool.totalLpSupply.sub(_amount); } } /// @notice Updates Pool Data Only /// @param _pid The id of the pool that needs to be updated /// @param _harvestAmount The amount of JOE harvested on each deposit / withdraw // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid, uint256 _harvestAmount) private { PoolInfo storage pool = poolInfo[_pid]; //Check if total LP amount || _harvestAmount is 0 //Don't update pool as no rewards would be avaliable. if (pool.totalLpSupply == 0 || _harvestAmount == 0) { pool.lastRewardTimestamp = block.timestamp; return; } pool.accJoePerShare = pool.accJoePerShare.add( _harvestAmount.mul(1e18).div(pool.totalLpSupply) ); pool.lastRewardTimestamp = block.timestamp; } /// @notice Front End Function to view users pending rewards /// @param _pid pool id /// @param _user user address to view. function pendingJoe(uint256 _pid, address _user) public view returns(uint256){ PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accJoePerShare = pool.accJoePerShare; uint256 lpSupply = pool.totalLpSupply; //estimates a new pool.accJoePerShare when time increased if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 _pendingJoe = pendingHerdRewards(_pid); accJoePerShare = pool.accJoePerShare.add(_pendingJoe.mul(1e18).div(lpSupply)); } uint256 userReward = user.amount.mul(accJoePerShare).div(1e18).sub(user.rewardDebt); //return userReward subtracting any fees return userReward.mul(uint256(100).sub(poolFee)).div(100); } /// @notice view the users LP Pool balance /// @param _pid pool id /// @param _user user address to view. function fetchUserLPBal(uint256 _pid, address _user) view external returns(uint256) { UserInfo storage user = userInfo[_pid][_user]; return(user.amount); } /// @notice Calculates the SteakMasterChef pending JOE rewards front facing UI method /// @param _pid The index of the pool. See `poolInfo` function pendingHerdRewards(uint256 _pid) public view returns(uint256){ (uint256 _pendingHerdJoe, , , ) = BMCJ.pendingTokens(_pid, address(voter)); return(_pendingHerdJoe); } /// @notice sets the protocol active or not /// @param _isEnabled Is the protocol active function setSteakMasterChefEnabled(bool _isEnabled) external onlyOwner { isSteakMasterChefEnabled = _isEnabled; emit SetSteakMasterChefEnabled(_isEnabled); } /// @notice sets the treasury wallet address /// @param _walletAddress is the nominated treasury address function setTreasuryAddress(address _walletAddress) external onlyOwner { require(_walletAddress != address(0), 'SteakMasterChef: Treasury Wallet Cannot be 0x0'); treasuryWallet = _walletAddress; emit SetTreasury(_walletAddress); } /// @notice sets the fee on rewards /// @param _fee is the percentage fee to take on rewards function setRewardFee(uint256 _fee) public onlyOwner { require(_fee <= 20, 'Pool Fee Too High'); poolFee = _fee; emit SetRewardFee(_fee); } /// @notice withdraws without caring about rewards /// @param _pid is the pool to withdraw from /// EMERGENCY ONLY. Sensitive. /// Restricted to only owner. function emergencyWithdraw(uint256 _pid) onlyOwner external { PoolInfo storage pool = poolInfo[_pid]; voter._emergencyWithdraw(pool.lpToken, _pid); uint256 balance = IERC20(pool.lpToken).balanceOf(address(this)); pool.lpToken.transfer(msg.sender, balance); emit EmergencyWithdraw(msg.sender, _pid, balance); } }
[{"inputs":[{"internalType":"bool","name":"_isMasterChefEnabled","type":"bool"},{"internalType":"contract SteakHutVoter","name":"_voterAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"}],"name":"Add","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":"Claim","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":"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":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"bool","name":"poolStatus","type":"bool"}],"name":"SetPoolStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardFee","type":"uint256"}],"name":"SetRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"SetSteakMasterChefEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"SetTreasury","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":"BMCJ","outputs":[{"internalType":"contract IBoostedMasterChefJoe","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JOE","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"fetchUserLPBal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSteakMasterChefEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"pendingHerdRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingJoe","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"accJoePerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalLpSupply","type":"uint256"},{"internalType":"bool","name":"poolEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolLpSupply","outputs":[{"internalType":"uint256","name":"lpValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"bool","name":"_isPoolEnabled","type":"bool"}],"name":"setPoolStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setSteakMasterChefEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"voter","outputs":[{"internalType":"contract SteakHutVoter","name":"","type":"address"}],"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
60a060405260036001553480156200001657600080fd5b50604051620038a1380380620038a183398181016040528101906200003c9190620001af565b6200005c62000050620000b560201b60201c565b620000bd60201b60201c565b81600060146101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505062000278565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050620001928162000244565b92915050565b600081519050620001a9816200025e565b92915050565b60008060408385031215620001c357600080fd5b6000620001d38582860162000181565b9250506020620001e68582860162000198565b9150509250929050565b6000620001fd8262000224565b9050919050565b60008115159050919050565b60006200021d82620001f0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200024f8162000204565b81146200025b57600080fd5b50565b620002698162000210565b81146200027557600080fd5b50565b60805160601c6135c4620002dd60003960008181610ef301528181610fdf0152818161151e01528181611df201528181611e8101528181611f420152818161203d01528181612412015281816124bd0152818161254f015261261001526135c46000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80635312ea8e116100c3578063b554efd61161007c578063b554efd6146103ba578063bbcaf3fe146103ea578063e2bbb15814610406578063e401e21c14610422578063f2fde38b1461043e578063ffebad301461045a57610158565b80635312ea8e146102f95780636605bfda1461031557806368278b3d14610331578063715018a6146103615780638da5cb5b1461036b57806393f1a40b1461038957610158565b8063325577881161011557806332557788146102375780633ccb21491461025557806341a2ac7014610285578063441a3e70146102a15780634626402b146102bd57806346c96aac146102db57610158565b8063081e3eda1461015d578063089fe6aa1461017b5780630a3b0a4f146101995780630d615678146101b55780631526fe27146101e55780632ad2b29714610219575b600080fd5b610165610478565b6040516101729190612f06565b60405180910390f35b610183610485565b6040516101909190612f06565b60405180910390f35b6101b360048036038101906101ae919061290d565b61048b565b005b6101cf60048036038101906101ca9190612988565b6107c2565b6040516101dc9190612f06565b60405180910390f35b6101ff60048036038101906101fa9190612936565b610825565b604051610210959493929190612d78565b60405180910390f35b610221610898565b60405161022e9190612ce2565b60405180910390f35b61023f6108b0565b60405161024c9190612cc7565b60405180910390f35b61026f600480360381019061026a9190612988565b6108c3565b60405161027c9190612f06565b60405180910390f35b61029f600480360381019061029a9190612936565b610a76565b005b6102bb60048036038101906102b69190612a7b565b610b77565b005b6102c5610ecb565b6040516102d29190612c4c565b60405180910390f35b6102e3610ef1565b6040516102f09190612dcb565b60405180910390f35b610313600480360381019061030e9190612936565b610f15565b005b61032f600480360381019061032a9190612892565b611245565b005b61034b60048036038101906103469190612936565b6113ac565b6040516103589190612f06565b60405180910390f35b610369611406565b005b61037361148e565b6040516103809190612c4c565b60405180910390f35b6103a3600480360381019061039e9190612988565b6114b7565b6040516103b1929190612f4a565b60405180910390f35b6103d460048036038101906103cf9190612936565b6114e8565b6040516103e19190612f06565b60405180910390f35b61040460048036038101906103ff9190612a3f565b6115bd565b005b610420600480360381019061041b9190612a7b565b6116de565b005b61043c600480360381019061043791906128bb565b611b7e565b005b61045860048036038101906104539190612892565b611c4e565b005b610462611d46565b60405161046f9190612cfd565b60405180910390f35b6000600380549050905090565b60015481565b610493611d5e565b73ffffffffffffffffffffffffffffffffffffffff166104b161148e565b73ffffffffffffffffffffffffffffffffffffffff1614610507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104fe90612e66565b60405180910390fd5b600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058b90612ee6565b60405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016106259190612c4c565b60206040518083038186803b15801561063d57600080fd5b505afa158015610651573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610675919061295f565b5060036040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600081526020014281526020016000815260200160011515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508073ffffffffffffffffffffffffffffffffffffffff16600160038054905061079391906130bb565b7f1c482cb20f653d55406cc8aa89ebf482b8603c0ffebcf7e6182ff8ac1849d12d60405160405180910390a350565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015491505092915050565b6003818154811061083557600080fd5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040160009054906101000a900460ff16905085565b734483f0b6e2f5486d06958c20f8c39a7abe87bf8f81565b600060149054906101000a900460ff1681565b60008060038481548110610900577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008260010154905060008360030154905083600201544211801561098a575060008114155b156109e357600061099a886114e8565b90506109df6109cc836109be670de0b6b3a764000085611d6690919063ffffffff16565b611d7c90919063ffffffff16565b8660010154611d9290919063ffffffff16565b9250505b6000610a2c8460010154610a1e670de0b6b3a7640000610a10878960000154611d6690919063ffffffff16565b611d7c90919063ffffffff16565b611da890919063ffffffff16565b9050610a696064610a5b610a4c6001546064611da890919063ffffffff16565b84611d6690919063ffffffff16565b611d7c90919063ffffffff16565b9550505050505092915050565b610a7e611d5e565b73ffffffffffffffffffffffffffffffffffffffff16610a9c61148e565b73ffffffffffffffffffffffffffffffffffffffff1614610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae990612e66565b60405180910390fd5b6014811115610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90612e06565b60405180910390fd5b806001819055507f8241a79c714425e571a9f1686404d094a6271d36603bfbff7341608c35cba26981604051610b6c9190612f06565b60405180910390a150565b6000811015610bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb290612ec6565b60405180910390fd5b600060149054906101000a900460ff16610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190612ea6565b60405180910390fd5b600060038381548110610c46577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508281600001541015610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890612e26565b60405180910390fd5b610d208260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585611dbe565b6000610d6d8260010154610d5f670de0b6b3a7640000610d5187600101548760000154611d6690919063ffffffff16565b611d7c90919063ffffffff16565b611da890919063ffffffff16565b9050610d798186611ff8565b610d868284866000612281565b610dbb670de0b6b3a7640000610dad85600101548560000154611d6690919063ffffffff16565b611d7c90919063ffffffff16565b82600101819055508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610e22929190612c9e565b602060405180830381600087803b158015610e3c57600080fd5b505af1158015610e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7491906128e4565b50843373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610ebc9190612f06565b60405180910390a35050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f1d611d5e565b73ffffffffffffffffffffffffffffffffffffffff16610f3b61148e565b73ffffffffffffffffffffffffffffffffffffffff1614610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890612e66565b60405180910390fd5b600060038281548110610fcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020190507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6f100428260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161105c929190612d18565b600060405180830381600087803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b5050505060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110ed9190612c4c565b60206040518083038186803b15801561110557600080fd5b505afa158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d919061295f565b90508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161119e929190612c9e565b602060405180830381600087803b1580156111b857600080fd5b505af11580156111cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f091906128e4565b50823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040516112389190612f06565b60405180910390a3505050565b61124d611d5e565b73ffffffffffffffffffffffffffffffffffffffff1661126b61148e565b73ffffffffffffffffffffffffffffffffffffffff16146112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890612e66565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890612e86565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef3816040516113a19190612c4c565b60405180910390a150565b600080600383815481106113e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020190508060030154915050919050565b61140e611d5e565b73ffffffffffffffffffffffffffffffffffffffff1661142c61148e565b73ffffffffffffffffffffffffffffffffffffffff1614611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147990612e66565b60405180910390fd5b61148c600061231a565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154905082565b600080734483f0b6e2f5486d06958c20f8c39a7abe87bf8f73ffffffffffffffffffffffffffffffffffffffff1663ffcd4263847f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040161155a929190612f21565b60006040518083038186803b15801561157257600080fd5b505afa158015611586573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115af91906129c4565b505050905080915050919050565b6115c5611d5e565b73ffffffffffffffffffffffffffffffffffffffff166115e361148e565b73ffffffffffffffffffffffffffffffffffffffff1614611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090612e66565b60405180910390fd5b600060038381548110611675577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600502019050818160040160006101000a81548160ff021916908315150217905550827fe8a086c42c969bc2e434b2f277c2d107b46842719ecb89a705ab603f5464cd90836040516116d19190612cc7565b60405180910390a2505050565b60006003838154811061171a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060050201905060006005600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600060149054906101000a900460ff166117cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c490612ea6565b60405180910390fd5b8160040160009054906101000a900460ff1661181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590612e46565b60405180910390fd5b60008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161187d9190612c4c565b60206040518083038186803b15801561189557600080fd5b505afa1580156118a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cd919061295f565b90508260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b815260040161193093929190612c67565b602060405180830381600087803b15801561194a57600080fd5b505af115801561195e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198291906128e4565b506000611a44828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119e69190612c4c565b60206040518083038186803b1580156119fe57600080fd5b505afa158015611a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a36919061295f565b611da890919063ffffffff16565b9050611a758460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687876123de565b600083600001541115611add576000611acf8460010154611ac1670de0b6b3a7640000611ab389600101548960000154611d6690919063ffffffff16565b611d7c90919063ffffffff16565b611da890919063ffffffff16565b9050611adb8188611ff8565b505b611aea8385836001612281565b611b1f670de0b6b3a7640000611b1186600101548660000154611d6690919063ffffffff16565b611d7c90919063ffffffff16565b8360010181905550853373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1583604051611b6e9190612f06565b60405180910390a3505050505050565b611b86611d5e565b73ffffffffffffffffffffffffffffffffffffffff16611ba461148e565b73ffffffffffffffffffffffffffffffffffffffff1614611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf190612e66565b60405180910390fd5b80600060146101000a81548160ff0219169083151502179055507f71316fdff81158f68ffc2afa2c5584ba8934ea259db932d05a76149109ef2d0481604051611c439190612cc7565b60405180910390a150565b611c56611d5e565b73ffffffffffffffffffffffffffffffffffffffff16611c7461148e565b73ffffffffffffffffffffffffffffffffffffffff1614611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc190612e66565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3190612de6565b60405180910390fd5b611d438161231a565b50565b736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd81565b600033905090565b60008183611d749190613061565b905092915050565b60008183611d8a9190613030565b905092915050565b60008183611da09190612fda565b905092915050565b60008183611db691906130bb565b905092915050565b6000736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611e2d9190612c4c565b60206040518083038186803b158015611e4557600080fd5b505afa158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d919061295f565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166349904b468585856040518463ffffffff1660e01b8152600401611edc93929190612d41565b600060405180830381600087803b158015611ef657600080fd5b505af1158015611f0a573d6000803e3d6000fd5b505050506000736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611f7d9190612c4c565b60206040518083038186803b158015611f9557600080fd5b505afa158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd919061295f565b90506000611fe48383611da890919063ffffffff16565b9050611ff085826126c6565b505050505050565b6000612022606461201460015486611d6690919063ffffffff16565b611d7c90919063ffffffff16565b905060006120398285611da890919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379fcf671856040518263ffffffff1660e01b81526004016120949190612f06565b600060405180830381600087803b1580156120ae57600080fd5b505af11580156120c2573d6000803e3d6000fd5b50505050736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612115929190612c9e565b602060405180830381600087803b15801561212f57600080fd5b505af1158015612143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216791906128e4565b50736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016121d9929190612c9e565b602060405180830381600087803b1580156121f357600080fd5b505af1158015612207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222b91906128e4565b50823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7866040516122739190612f06565b60405180910390a350505050565b6000846000015490506000826122a9576122a48483611da890919063ffffffff16565b6122bd565b6122bc8483611d9290919063ffffffff16565b5b90506000841461231257808660000181905550826122f1576122ec848660030154611da890919063ffffffff16565b612309565b612308848660030154611d9290919063ffffffff16565b5b85600301819055505b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161244d9190612c4c565b60206040518083038186803b15801561246557600080fd5b505afa158015612479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249d919061295f565b90508373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b81526004016124fa929190612c9e565b602060405180830381600087803b15801561251457600080fd5b505af1158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c91906128e4565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663486704a48585856040518463ffffffff1660e01b81526004016125aa93929190612d41565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050506000736e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161264b9190612c4c565b60206040518083038186803b15801561266357600080fd5b505afa158015612677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269b919061295f565b905060006126b28383611da890919063ffffffff16565b90506126be85826126c6565b505050505050565b600060038381548110612702577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906005020190506000816003015414806127255750600082145b156127395742816002018190555050612793565b61278061276d826003015461275f670de0b6b3a764000086611d6690919063ffffffff16565b611d7c90919063ffffffff16565b8260010154611d9290919063ffffffff16565b8160010181905550428160020181905550505b5050565b60006127aa6127a584612f98565b612f73565b9050828152602081018484840111156127c257600080fd5b6127cd8482856131b5565b509392505050565b6000813590506127e481613532565b92915050565b6000815190506127f981613532565b92915050565b60008135905061280e81613549565b92915050565b60008151905061282381613549565b92915050565b60008135905061283881613560565b92915050565b600082601f83011261284f57600080fd5b815161285f848260208601612797565b91505092915050565b60008135905061287781613577565b92915050565b60008151905061288c81613577565b92915050565b6000602082840312156128a457600080fd5b60006128b2848285016127d5565b91505092915050565b6000602082840312156128cd57600080fd5b60006128db848285016127ff565b91505092915050565b6000602082840312156128f657600080fd5b600061290484828501612814565b91505092915050565b60006020828403121561291f57600080fd5b600061292d84828501612829565b91505092915050565b60006020828403121561294857600080fd5b600061295684828501612868565b91505092915050565b60006020828403121561297157600080fd5b600061297f8482850161287d565b91505092915050565b6000806040838503121561299b57600080fd5b60006129a985828601612868565b92505060206129ba858286016127d5565b9150509250929050565b600080600080608085870312156129da57600080fd5b60006129e88782880161287d565b94505060206129f9878288016127ea565b935050604085015167ffffffffffffffff811115612a1657600080fd5b612a228782880161283e565b9250506060612a338782880161287d565b91505092959194509250565b60008060408385031215612a5257600080fd5b6000612a6085828601612868565b9250506020612a71858286016127ff565b9150509250929050565b60008060408385031215612a8e57600080fd5b6000612a9c85828601612868565b9250506020612aad85828601612868565b9150509250929050565b612ac0816130ef565b82525050565b612acf81613101565b82525050565b612ade81613149565b82525050565b612aed8161316d565b82525050565b612afc81613191565b82525050565b6000612b0f602683612fc9565b9150612b1a826132b7565b604082019050919050565b6000612b32601183612fc9565b9150612b3d82613306565b602082019050919050565b6000612b55602283612fc9565b9150612b608261332f565b604082019050919050565b6000612b78602d83612fc9565b9150612b838261337e565b604082019050919050565b6000612b9b602083612fc9565b9150612ba6826133cd565b602082019050919050565b6000612bbe602e83612fc9565b9150612bc9826133f6565b604082019050919050565b6000612be1602983612fc9565b9150612bec82613445565b604082019050919050565b6000612c04602783612fc9565b9150612c0f82613494565b604082019050919050565b6000612c27602183612fc9565b9150612c32826134e3565b604082019050919050565b612c468161313f565b82525050565b6000602082019050612c616000830184612ab7565b92915050565b6000606082019050612c7c6000830186612ab7565b612c896020830185612ab7565b612c966040830184612c3d565b949350505050565b6000604082019050612cb36000830185612ab7565b612cc06020830184612c3d565b9392505050565b6000602082019050612cdc6000830184612ac6565b92915050565b6000602082019050612cf76000830184612ad5565b92915050565b6000602082019050612d126000830184612ae4565b92915050565b6000604082019050612d2d6000830185612ae4565b612d3a6020830184612c3d565b9392505050565b6000606082019050612d566000830186612ae4565b612d636020830185612c3d565b612d706040830184612c3d565b949350505050565b600060a082019050612d8d6000830188612ae4565b612d9a6020830187612c3d565b612da76040830186612c3d565b612db46060830185612c3d565b612dc16080830184612ac6565b9695505050505050565b6000602082019050612de06000830184612af3565b92915050565b60006020820190508181036000830152612dff81612b02565b9050919050565b60006020820190508181036000830152612e1f81612b25565b9050919050565b60006020820190508181036000830152612e3f81612b48565b9050919050565b60006020820190508181036000830152612e5f81612b6b565b9050919050565b60006020820190508181036000830152612e7f81612b8e565b9050919050565b60006020820190508181036000830152612e9f81612bb1565b9050919050565b60006020820190508181036000830152612ebf81612bd4565b9050919050565b60006020820190508181036000830152612edf81612bf7565b9050919050565b60006020820190508181036000830152612eff81612c1a565b9050919050565b6000602082019050612f1b6000830184612c3d565b92915050565b6000604082019050612f366000830185612c3d565b612f436020830184612ab7565b9392505050565b6000604082019050612f5f6000830185612c3d565b612f6c6020830184612c3d565b9392505050565b6000612f7d612f8e565b9050612f8982826131e8565b919050565b6000604051905090565b600067ffffffffffffffff821115612fb357612fb2613277565b5b612fbc826132a6565b9050602081019050919050565b600082825260208201905092915050565b6000612fe58261313f565b9150612ff08361313f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561302557613024613219565b5b828201905092915050565b600061303b8261313f565b91506130468361313f565b92508261305657613055613248565b5b828204905092915050565b600061306c8261313f565b91506130778361313f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130b0576130af613219565b5b828202905092915050565b60006130c68261313f565b91506130d18361313f565b9250828210156130e4576130e3613219565b5b828203905092915050565b60006130fa8261311f565b9050919050565b60008115159050919050565b6000613118826130ef565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006131548261315b565b9050919050565b60006131668261311f565b9050919050565b60006131788261317f565b9050919050565b600061318a8261311f565b9050919050565b600061319c826131a3565b9050919050565b60006131ae8261311f565b9050919050565b60005b838110156131d35780820151818401526020810190506131b8565b838111156131e2576000848401525b50505050565b6131f1826132a6565b810181811067ffffffffffffffff821117156132105761320f613277565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f506f6f6c2046656520546f6f2048696768000000000000000000000000000000600082015250565b7f537465616b4d6173746572436865663a207769746864726177206e6f7420676f60008201527f6f64000000000000000000000000000000000000000000000000000000000000602082015250565b7f537465616b487574204d6173746572436865663a2043757272656e7420506f6f60008201527f6c204e6f7420456e61626c656400000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f537465616b4d6173746572436865663a2054726561737572792057616c6c657460008201527f2043616e6e6f7420626520307830000000000000000000000000000000000000602082015250565b7f537465616b487574204d6173746572436865663a2050726f746f636f6c204e6f60008201527f7420456e61626c65640000000000000000000000000000000000000000000000602082015250565b7f537465616b4d6173746572436865663a2057697468647261772063616e6e6f7460008201527f206265203c203000000000000000000000000000000000000000000000000000602082015250565b7f537465616b4d6173746572436865663a204c5020616c7265616479206164646560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b61353b816130ef565b811461354657600080fd5b50565b61355281613101565b811461355d57600080fd5b50565b6135698161310d565b811461357457600080fd5b50565b6135808161313f565b811461358b57600080fd5b5056fea264697066735822122071070b6153e378888d987216d12dff0baa36db78756f79f5d2e67d6d54ebe98d64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000001ab6b2f60a7e8da9d521cf8f90b2a5b5d314b3a6
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000010000000000000000000000001ab6b2f60a7e8da9d521cf8f90b2a5b5d314b3a6
-----Decoded View---------------
Arg [0] : _isMasterChefEnabled (bool): True
Arg [1] : _voterAddress (address): 0x1ab6b2f60a7e8da9d521cf8f90b2a5b5d314b3a6
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000001ab6b2f60a7e8da9d521cf8f90b2a5b5d314b3a6
Deployed ByteCode Sourcemap
39475:14844:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43446:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40066:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42564:767;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52256:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41181:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;39638:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39897:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51299:828;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53591:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46690:1210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40158:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40237:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53949:367;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53216:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43700:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2589:103;;;:::i;:::-;;1938:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41416:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;52592:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44028:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44448:1299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52911:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2847:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39755:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43446:102;43491:13;43525:8;:15;;;;43517:23;;43446:102;:::o;40066:26::-;;;;:::o;42564:767::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42650:18:::1;:28;42669:8;42650:28;;;;;;;;;;;;;;;;;;;;;;;;;42649:29;42641:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42836:4;42805:18;:28;42824:8;42805:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;42915:8;:18;;;42942:4;42915:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42990:8;43018:234;;;;;;;;43055:8;43018:234;;;;;;43235:1;43018:234;;;;43111:15;43018:234;;;;43161:1;43018:234;;;;43195:4;43018:234;;;;::::0;42990:273:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43314:8;43289:34;;43311:1;43293:8;:15;;;;:19;;;;:::i;:::-;43289:34;;;;;;;;;;42564:767:::0;:::o;52256:178::-;52331:7;52351:21;52375:8;:14;52384:4;52375:14;;;;;;;;;;;:21;52390:5;52375:21;;;;;;;;;;;;;;;52351:45;;52414:4;:11;;;52407:19;;;52256:178;;;;:::o;41181:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39638:110::-;39705:42;39638:110;:::o;39897:36::-;;;;;;;;;;;;;:::o;51299:828::-;51368:7;51387:21;51411:8;51420:4;51411:14;;;;;;;;;;;;;;;;;;;;;;;;;;51387:38;;51436:21;51460:8;:14;51469:4;51460:14;;;;;;;;;;;:21;51475:5;51460:21;;;;;;;;;;;;;;;51436:45;;51494:22;51519:4;:19;;;51494:44;;51549:16;51568:4;:18;;;51549:37;;51688:4;:24;;;51670:15;:42;:59;;;;;51728:1;51716:8;:13;;51670:59;51666:230;;;51746:19;51768:24;51787:4;51768:18;:24::i;:::-;51746:46;;51824:60;51848:35;51874:8;51848:21;51864:4;51848:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;51824:4;:19;;;:23;;:60;;;;:::i;:::-;51807:77;;51666:230;;51916:18;51937:62;51983:4;:15;;;51937:41;51973:4;51937:31;51953:14;51937:4;:11;;;:15;;:31;;;;:::i;:::-;:35;;:41;;;;:::i;:::-;:45;;:62;;;;:::i;:::-;51916:83;;52067:50;52113:3;52067:41;52082:25;52099:7;;52090:3;52082:16;;:25;;;;:::i;:::-;52067:10;:14;;:41;;;;:::i;:::-;:45;;:50;;;;:::i;:::-;52060:57;;;;;;;51299:828;;;;:::o;53591:173::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53671:2:::1;53663:4;:10;;53655:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;53716:4;53706:7;:14;;;;53738:18;53751:4;53738:18;;;;;;:::i;:::-;;;;;;;;53591:173:::0;:::o;46690:1210::-;46778:1;46767:7;:12;;46759:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;46842:24;;;;;;;;;;;46834:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;46925:21;46949:8;46958:4;46949:14;;;;;;;;;;;;;;;;;;;;;;;;;;46925:38;;46974:21;46998:8;:14;47007:4;46998:14;;;;;;;;;;;:26;47013:10;46998:26;;;;;;;;;;;;;;;46974:50;;47058:7;47043:4;:11;;;:22;;47035:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47189:38;47199:4;:12;;;;;;;;;;;;47213:4;47219:7;47189:9;:38::i;:::-;47290:15;47321:95;47390:4;:15;;;47321:46;47362:4;47321:36;47337:4;:19;;;47321:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;:50;;:95;;;;:::i;:::-;47290:126;;47482:31;47499:7;47508:4;47482:16;:31::i;:::-;47558:46;47577:4;47583;47589:7;47598:5;47558:18;:46::i;:::-;47683;47724:4;47683:36;47699:4;:19;;;47683:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;47665:4;:15;;:64;;;;47797:4;:12;;;;;;;;;;;;:21;;;47819:10;47831:7;47797:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47878:4;47866:10;47857:35;;;47884:7;47857:35;;;;;;:::i;:::-;;;;;;;;46690:1210;;;;;:::o;40158:29::-;;;;;;;;;;;;;:::o;40237:36::-;;;:::o;53949:367::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54020:21:::1;54044:8;54053:4;54044:14;;;;;;;;;;;;;;;;;;;;;;;;;;54020:38;;54071:5;:24;;;54096:4;:12;;;;;;;;;;;;54110:4;54071:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54128:15;54153:4;:12;;;;;;;;;;;;54146:30;;;54185:4;54146:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54128:63;;54204:4;:12;;;;;;;;;;;;:21;;;54226:10;54238:7;54204:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54294:4;54282:10;54264:44;;;54300:7;54264:44;;;;;;:::i;:::-;;;;;;;;2229:1;;53949:367:::0;:::o;53216:264::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53332:1:::1;53306:28;;:14;:28;;;;53298:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53413:14;53396;;:31;;;;;;;;;;;;;;;;;;53445:27;53457:14;53445:27;;;;;;:::i;:::-;;;;;;;;53216:264:::0;:::o;43700:170::-;43759:15;43787:21;43811:8;43820:4;43811:14;;;;;;;;;;;;;;;;;;;;;;;;;;43787:38;;43843:4;:18;;;43836:26;;;43700:170;;;:::o;2589:103::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2654:30:::1;2681:1;2654:18;:30::i;:::-;2589:103::o:0;1938:87::-;1984:7;2011:6;;;;;;;;;;;2004:13;;1938:87;:::o;41416:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52592:212::-;52654:7;52682:23;39705:42;52715:18;;;52734:4;52748:5;52715:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52681:74;;;;;52780:15;52773:23;;;52592:212;;;:::o;44028:231::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44116:21:::1;44140:8;44149:4;44140:14;;;;;;;;;;;;;;;;;;;;;;;;;;44116:38;;44184:14;44165:4;:16;;;:33;;;;;;;;;;;;;;;;;;44230:4;44216:35;44236:14;44216:35;;;;;;:::i;:::-;;;;;;;;2229:1;44028:231:::0;;:::o;44448:1299::-;44518:21;44542:8;44551:4;44542:14;;;;;;;;;;;;;;;;;;;;;;;;;;44518:38;;44567:21;44591:8;:14;44600:4;44591:14;;;;;;;;;;;:26;44606:10;44591:26;;;;;;;;;;;;;;;44567:50;;44638:24;;;;;;;;;;;44630:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44727:4;:16;;;;;;;;;;;;44719:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44814:21;44838:4;:12;;;;;;;;;;;;:22;;;44869:4;44838:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44814:61;;44886:4;:12;;;;;;;;;;;;:25;;;44912:10;44932:4;44939:7;44886:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44958:22;44983:56;45025:13;44983:4;:12;;;;;;;;;;;;:22;;;45014:4;44983:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;:56;;;;:::i;:::-;44958:81;;45107:37;45116:4;:12;;;;;;;;;;;;45130:4;45136:7;45107:8;:37::i;:::-;45237:1;45223:4;:11;;;:15;45219:236;;;45255:15;45290:107;45363:4;:15;;;45290:46;45331:4;45290:36;45306:4;:19;;;45290:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;:50;;:107;;;;:::i;:::-;45255:142;;45412:31;45429:7;45438:4;45412:16;:31::i;:::-;45219:236;;45514:52;45533:4;45539;45545:14;45561:4;45514:18;:52::i;:::-;45634:46;45675:4;45634:36;45650:4;:19;;;45634:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46;;;;:::i;:::-;45616:4;:15;;:64;;;;45718:4;45706:10;45698:41;;;45724:14;45698:41;;;;;;:::i;:::-;;;;;;;;44448:1299;;;;;;:::o;52911:182::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53020:10:::1;52993:24;;:37;;;;;;;;;;;;;;;;;;53048;53074:10;53048:37;;;;;;:::i;:::-;;;;;;;;52911:182:::0;:::o;2847:201::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2956:1:::1;2936:22;;:8;:22;;;;2928:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3012:28;3031:8;3012:18;:28::i;:::-;2847:201:::0;:::o;39755:79::-;39791:42;39755:79;:::o;656:98::-;709:7;736:10;729:17;;656:98;:::o;9901:::-;9959:7;9990:1;9986;:5;;;;:::i;:::-;9979:12;;9901:98;;;;:::o;10300:::-;10358:7;10389:1;10385;:5;;;;:::i;:::-;10378:12;;10300:98;;;;:::o;9163:::-;9221:7;9252:1;9248;:5;;;;:::i;:::-;9241:12;;9163:98;;;;:::o;9544:::-;9602:7;9633:1;9629;:5;;;;:::i;:::-;9622:12;;9544:98;;;;:::o;48081:531::-;48243:17;39791:42;48263:13;;;48285:5;48263:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48243:49;;48348:5;:15;;;48364:8;48374:4;48380:7;48348:40;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48401:16;39791:42;48420:13;;;48442:5;48420:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48401:48;;48512:22;48537:23;48550:9;48537:8;:12;;:23;;;;:::i;:::-;48512:48;;48572:32;48583:4;48589:14;48572:10;:32::i;:::-;48081:531;;;;;;:::o;48797:624::-;48988:22;49013:29;49038:3;49013:20;49025:7;;49013;:11;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;48988:54;;49053:18;49074:27;49086:14;49074:7;:11;;:27;;;;:::i;:::-;49053:48;;49174:5;:15;;;49190:7;49174:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39791:42;49264:12;;;49277:10;49289;49264:36;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39791:42;49311:12;;;49324:14;;;;;;;;;;;49340;49311:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49399:4;49387:10;49381:32;;;49405:7;49381:32;;;;;;:::i;:::-;;;;;;;;48797:624;;;;:::o;49721:560::-;49893:17;49913:5;:12;;;49893:32;;49936:17;49956:10;:60;;49994:22;50008:7;49994:9;:13;;:22;;;;:::i;:::-;49956:60;;;49969:22;49983:7;49969:9;:13;;:22;;;;:::i;:::-;49956:60;49936:80;;50093:1;50082:7;:12;50078:186;;50126:9;50111:5;:12;;:24;;;;50172:10;:80;;50220:32;50244:7;50220:5;:19;;;:23;;:32;;;;:::i;:::-;50172:80;;;50185:32;50209:7;50185:5;:19;;;:23;;:32;;;;:::i;:::-;50172:80;50150:5;:19;;:102;;;;50078:186;49721:560;;;;;;:::o;3208:191::-;3282:16;3301:6;;;;;;;;;;;3282:25;;3327:8;3318:6;;:17;;;;;;;;;;;;;;;;;;3382:8;3351:40;;3372:8;3351:40;;;;;;;;;;;;3208:191;;:::o;45986:518::-;46074:17;39791:42;46094:13;;;46116:5;46094:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46074:49;;46195:8;:17;;;46221:5;46229:7;46195:42;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46250:5;:14;;;46265:8;46275:4;46281:7;46250:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46302:16;39791:42;46321:13;;;46343:5;46321:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46302:48;;46405:22;46430:23;46443:9;46430:8;:12;;:23;;;;:::i;:::-;46405:48;;46464:32;46475:4;46481:14;46464:10;:32::i;:::-;45986:518;;;;;;:::o;50548:603::-;50625:21;50649:8;50658:4;50649:14;;;;;;;;;;;;;;;;;;;;;;;;;;50625:38;;50833:1;50811:4;:18;;;:23;:46;;;;50856:1;50838:14;:19;50811:46;50807:142;;;50901:15;50874:4;:24;;:42;;;;50931:7;;;50807:142;50991:97;51029:48;51058:4;:18;;;51029:24;51048:4;51029:14;:18;;:24;;;;:::i;:::-;:28;;:48;;;;:::i;:::-;50991:4;:19;;;:23;;:97;;;;:::i;:::-;50969:4;:19;;:119;;;;51128:15;51101:4;:24;;:42;;;;50548:603;;;;:::o;7:354:1:-;96:5;121:66;137:49;179:6;137:49;:::i;:::-;121:66;:::i;:::-;112:75;;210:6;203:5;196:21;248:4;241:5;237:16;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;316:39;348:6;343:3;338;316:39;:::i;:::-;102:259;;;;;;:::o;367:139::-;413:5;451:6;438:20;429:29;;467:33;494:5;467:33;:::i;:::-;419:87;;;;:::o;512:143::-;569:5;600:6;594:13;585:22;;616:33;643:5;616:33;:::i;:::-;575:80;;;;:::o;661:133::-;704:5;742:6;729:20;720:29;;758:30;782:5;758:30;:::i;:::-;710:84;;;;:::o;800:137::-;854:5;885:6;879:13;870:22;;901:30;925:5;901:30;:::i;:::-;860:77;;;;:::o;943:167::-;1003:5;1041:6;1028:20;1019:29;;1057:47;1098:5;1057:47;:::i;:::-;1009:101;;;;:::o;1130:288::-;1197:5;1246:3;1239:4;1231:6;1227:17;1223:27;1213:2;;1264:1;1261;1254:12;1213:2;1297:6;1291:13;1322:90;1408:3;1400:6;1393:4;1385:6;1381:17;1322:90;:::i;:::-;1313:99;;1203:215;;;;;:::o;1424:139::-;1470:5;1508:6;1495:20;1486:29;;1524:33;1551:5;1524:33;:::i;:::-;1476:87;;;;:::o;1569:143::-;1626:5;1657:6;1651:13;1642:22;;1673:33;1700:5;1673:33;:::i;:::-;1632:80;;;;:::o;1718:262::-;1777:6;1826:2;1814:9;1805:7;1801:23;1797:32;1794:2;;;1842:1;1839;1832:12;1794:2;1885:1;1910:53;1955:7;1946:6;1935:9;1931:22;1910:53;:::i;:::-;1900:63;;1856:117;1784:196;;;;:::o;1986:256::-;2042:6;2091:2;2079:9;2070:7;2066:23;2062:32;2059:2;;;2107:1;2104;2097:12;2059:2;2150:1;2175:50;2217:7;2208:6;2197:9;2193:22;2175:50;:::i;:::-;2165:60;;2121:114;2049:193;;;;:::o;2248:278::-;2315:6;2364:2;2352:9;2343:7;2339:23;2335:32;2332:2;;;2380:1;2377;2370:12;2332:2;2423:1;2448:61;2501:7;2492:6;2481:9;2477:22;2448:61;:::i;:::-;2438:71;;2394:125;2322:204;;;;:::o;2532:290::-;2605:6;2654:2;2642:9;2633:7;2629:23;2625:32;2622:2;;;2670:1;2667;2660:12;2622:2;2713:1;2738:67;2797:7;2788:6;2777:9;2773:22;2738:67;:::i;:::-;2728:77;;2684:131;2612:210;;;;:::o;2828:262::-;2887:6;2936:2;2924:9;2915:7;2911:23;2907:32;2904:2;;;2952:1;2949;2942:12;2904:2;2995:1;3020:53;3065:7;3056:6;3045:9;3041:22;3020:53;:::i;:::-;3010:63;;2966:117;2894:196;;;;:::o;3096:284::-;3166:6;3215:2;3203:9;3194:7;3190:23;3186:32;3183:2;;;3231:1;3228;3221:12;3183:2;3274:1;3299:64;3355:7;3346:6;3335:9;3331:22;3299:64;:::i;:::-;3289:74;;3245:128;3173:207;;;;:::o;3386:407::-;3454:6;3462;3511:2;3499:9;3490:7;3486:23;3482:32;3479:2;;;3527:1;3524;3517:12;3479:2;3570:1;3595:53;3640:7;3631:6;3620:9;3616:22;3595:53;:::i;:::-;3585:63;;3541:117;3697:2;3723:53;3768:7;3759:6;3748:9;3744:22;3723:53;:::i;:::-;3713:63;;3668:118;3469:324;;;;;:::o;3799:859::-;3906:6;3914;3922;3930;3979:3;3967:9;3958:7;3954:23;3950:33;3947:2;;;3996:1;3993;3986:12;3947:2;4039:1;4064:64;4120:7;4111:6;4100:9;4096:22;4064:64;:::i;:::-;4054:74;;4010:128;4177:2;4203:64;4259:7;4250:6;4239:9;4235:22;4203:64;:::i;:::-;4193:74;;4148:129;4337:2;4326:9;4322:18;4316:25;4368:18;4360:6;4357:30;4354:2;;;4400:1;4397;4390:12;4354:2;4428:74;4494:7;4485:6;4474:9;4470:22;4428:74;:::i;:::-;4418:84;;4287:225;4551:2;4577:64;4633:7;4624:6;4613:9;4609:22;4577:64;:::i;:::-;4567:74;;4522:129;3937:721;;;;;;;:::o;4664:401::-;4729:6;4737;4786:2;4774:9;4765:7;4761:23;4757:32;4754:2;;;4802:1;4799;4792:12;4754:2;4845:1;4870:53;4915:7;4906:6;4895:9;4891:22;4870:53;:::i;:::-;4860:63;;4816:117;4972:2;4998:50;5040:7;5031:6;5020:9;5016:22;4998:50;:::i;:::-;4988:60;;4943:115;4744:321;;;;;:::o;5071:407::-;5139:6;5147;5196:2;5184:9;5175:7;5171:23;5167:32;5164:2;;;5212:1;5209;5202:12;5164:2;5255:1;5280:53;5325:7;5316:6;5305:9;5301:22;5280:53;:::i;:::-;5270:63;;5226:117;5382:2;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5353:118;5154:324;;;;;:::o;5484:118::-;5571:24;5589:5;5571:24;:::i;:::-;5566:3;5559:37;5549:53;;:::o;5608:109::-;5689:21;5704:5;5689:21;:::i;:::-;5684:3;5677:34;5667:50;;:::o;5723:189::-;5839:66;5899:5;5839:66;:::i;:::-;5834:3;5827:79;5817:95;;:::o;5918:159::-;6019:51;6064:5;6019:51;:::i;:::-;6014:3;6007:64;5997:80;;:::o;6083:175::-;6192:59;6245:5;6192:59;:::i;:::-;6187:3;6180:72;6170:88;;:::o;6264:366::-;6406:3;6427:67;6491:2;6486:3;6427:67;:::i;:::-;6420:74;;6503:93;6592:3;6503:93;:::i;:::-;6621:2;6616:3;6612:12;6605:19;;6410:220;;;:::o;6636:366::-;6778:3;6799:67;6863:2;6858:3;6799:67;:::i;:::-;6792:74;;6875:93;6964:3;6875:93;:::i;:::-;6993:2;6988:3;6984:12;6977:19;;6782:220;;;:::o;7008:366::-;7150:3;7171:67;7235:2;7230:3;7171:67;:::i;:::-;7164:74;;7247:93;7336:3;7247:93;:::i;:::-;7365:2;7360:3;7356:12;7349:19;;7154:220;;;:::o;7380:366::-;7522:3;7543:67;7607:2;7602:3;7543:67;:::i;:::-;7536:74;;7619:93;7708:3;7619:93;:::i;:::-;7737:2;7732:3;7728:12;7721:19;;7526:220;;;:::o;7752:366::-;7894:3;7915:67;7979:2;7974:3;7915:67;:::i;:::-;7908:74;;7991:93;8080:3;7991:93;:::i;:::-;8109:2;8104:3;8100:12;8093:19;;7898:220;;;:::o;8124:366::-;8266:3;8287:67;8351:2;8346:3;8287:67;:::i;:::-;8280:74;;8363:93;8452:3;8363:93;:::i;:::-;8481:2;8476:3;8472:12;8465:19;;8270:220;;;:::o;8496:366::-;8638:3;8659:67;8723:2;8718:3;8659:67;:::i;:::-;8652:74;;8735:93;8824:3;8735:93;:::i;:::-;8853:2;8848:3;8844:12;8837:19;;8642:220;;;:::o;8868:366::-;9010:3;9031:67;9095:2;9090:3;9031:67;:::i;:::-;9024:74;;9107:93;9196:3;9107:93;:::i;:::-;9225:2;9220:3;9216:12;9209:19;;9014:220;;;:::o;9240:366::-;9382:3;9403:67;9467:2;9462:3;9403:67;:::i;:::-;9396:74;;9479:93;9568:3;9479:93;:::i;:::-;9597:2;9592:3;9588:12;9581:19;;9386:220;;;:::o;9612:118::-;9699:24;9717:5;9699:24;:::i;:::-;9694:3;9687:37;9677:53;;:::o;9736:222::-;9829:4;9867:2;9856:9;9852:18;9844:26;;9880:71;9948:1;9937:9;9933:17;9924:6;9880:71;:::i;:::-;9834:124;;;;:::o;9964:442::-;10113:4;10151:2;10140:9;10136:18;10128:26;;10164:71;10232:1;10221:9;10217:17;10208:6;10164:71;:::i;:::-;10245:72;10313:2;10302:9;10298:18;10289:6;10245:72;:::i;:::-;10327;10395:2;10384:9;10380:18;10371:6;10327:72;:::i;:::-;10118:288;;;;;;:::o;10412:332::-;10533:4;10571:2;10560:9;10556:18;10548:26;;10584:71;10652:1;10641:9;10637:17;10628:6;10584:71;:::i;:::-;10665:72;10733:2;10722:9;10718:18;10709:6;10665:72;:::i;:::-;10538:206;;;;;:::o;10750:210::-;10837:4;10875:2;10864:9;10860:18;10852:26;;10888:65;10950:1;10939:9;10935:17;10926:6;10888:65;:::i;:::-;10842:118;;;;:::o;10966:280::-;11088:4;11126:2;11115:9;11111:18;11103:26;;11139:100;11236:1;11225:9;11221:17;11212:6;11139:100;:::i;:::-;11093:153;;;;:::o;11252:250::-;11359:4;11397:2;11386:9;11382:18;11374:26;;11410:85;11492:1;11481:9;11477:17;11468:6;11410:85;:::i;:::-;11364:138;;;;:::o;11508:360::-;11643:4;11681:2;11670:9;11666:18;11658:26;;11694:85;11776:1;11765:9;11761:17;11752:6;11694:85;:::i;:::-;11789:72;11857:2;11846:9;11842:18;11833:6;11789:72;:::i;:::-;11648:220;;;;;:::o;11874:470::-;12037:4;12075:2;12064:9;12060:18;12052:26;;12088:85;12170:1;12159:9;12155:17;12146:6;12088:85;:::i;:::-;12183:72;12251:2;12240:9;12236:18;12227:6;12183:72;:::i;:::-;12265;12333:2;12322:9;12318:18;12309:6;12265:72;:::i;:::-;12042:302;;;;;;:::o;12350:680::-;12563:4;12601:3;12590:9;12586:19;12578:27;;12615:85;12697:1;12686:9;12682:17;12673:6;12615:85;:::i;:::-;12710:72;12778:2;12767:9;12763:18;12754:6;12710:72;:::i;:::-;12792;12860:2;12849:9;12845:18;12836:6;12792:72;:::i;:::-;12874;12942:2;12931:9;12927:18;12918:6;12874:72;:::i;:::-;12956:67;13018:3;13007:9;13003:19;12994:6;12956:67;:::i;:::-;12568:462;;;;;;;;:::o;13036:266::-;13151:4;13189:2;13178:9;13174:18;13166:26;;13202:93;13292:1;13281:9;13277:17;13268:6;13202:93;:::i;:::-;13156:146;;;;:::o;13308:419::-;13474:4;13512:2;13501:9;13497:18;13489:26;;13561:9;13555:4;13551:20;13547:1;13536:9;13532:17;13525:47;13589:131;13715:4;13589:131;:::i;:::-;13581:139;;13479:248;;;:::o;13733:419::-;13899:4;13937:2;13926:9;13922:18;13914:26;;13986:9;13980:4;13976:20;13972:1;13961:9;13957:17;13950:47;14014:131;14140:4;14014:131;:::i;:::-;14006:139;;13904:248;;;:::o;14158:419::-;14324:4;14362:2;14351:9;14347:18;14339:26;;14411:9;14405:4;14401:20;14397:1;14386:9;14382:17;14375:47;14439:131;14565:4;14439:131;:::i;:::-;14431:139;;14329:248;;;:::o;14583:419::-;14749:4;14787:2;14776:9;14772:18;14764:26;;14836:9;14830:4;14826:20;14822:1;14811:9;14807:17;14800:47;14864:131;14990:4;14864:131;:::i;:::-;14856:139;;14754:248;;;:::o;15008:419::-;15174:4;15212:2;15201:9;15197:18;15189:26;;15261:9;15255:4;15251:20;15247:1;15236:9;15232:17;15225:47;15289:131;15415:4;15289:131;:::i;:::-;15281:139;;15179:248;;;:::o;15433:419::-;15599:4;15637:2;15626:9;15622:18;15614:26;;15686:9;15680:4;15676:20;15672:1;15661:9;15657:17;15650:47;15714:131;15840:4;15714:131;:::i;:::-;15706:139;;15604:248;;;:::o;15858:419::-;16024:4;16062:2;16051:9;16047:18;16039:26;;16111:9;16105:4;16101:20;16097:1;16086:9;16082:17;16075:47;16139:131;16265:4;16139:131;:::i;:::-;16131:139;;16029:248;;;:::o;16283:419::-;16449:4;16487:2;16476:9;16472:18;16464:26;;16536:9;16530:4;16526:20;16522:1;16511:9;16507:17;16500:47;16564:131;16690:4;16564:131;:::i;:::-;16556:139;;16454:248;;;:::o;16708:419::-;16874:4;16912:2;16901:9;16897:18;16889:26;;16961:9;16955:4;16951:20;16947:1;16936:9;16932:17;16925:47;16989:131;17115:4;16989:131;:::i;:::-;16981:139;;16879:248;;;:::o;17133:222::-;17226:4;17264:2;17253:9;17249:18;17241:26;;17277:71;17345:1;17334:9;17330:17;17321:6;17277:71;:::i;:::-;17231:124;;;;:::o;17361:332::-;17482:4;17520:2;17509:9;17505:18;17497:26;;17533:71;17601:1;17590:9;17586:17;17577:6;17533:71;:::i;:::-;17614:72;17682:2;17671:9;17667:18;17658:6;17614:72;:::i;:::-;17487:206;;;;;:::o;17699:332::-;17820:4;17858:2;17847:9;17843:18;17835:26;;17871:71;17939:1;17928:9;17924:17;17915:6;17871:71;:::i;:::-;17952:72;18020:2;18009:9;18005:18;17996:6;17952:72;:::i;:::-;17825:206;;;;;:::o;18037:129::-;18071:6;18098:20;;:::i;:::-;18088:30;;18127:33;18155:4;18147:6;18127:33;:::i;:::-;18078:88;;;:::o;18172:75::-;18205:6;18238:2;18232:9;18222:19;;18212:35;:::o;18253:308::-;18315:4;18405:18;18397:6;18394:30;18391:2;;;18427:18;;:::i;:::-;18391:2;18465:29;18487:6;18465:29;:::i;:::-;18457:37;;18549:4;18543;18539:15;18531:23;;18320:241;;;:::o;18567:169::-;18651:11;18685:6;18680:3;18673:19;18725:4;18720:3;18716:14;18701:29;;18663:73;;;;:::o;18742:305::-;18782:3;18801:20;18819:1;18801:20;:::i;:::-;18796:25;;18835:20;18853:1;18835:20;:::i;:::-;18830:25;;18989:1;18921:66;18917:74;18914:1;18911:81;18908:2;;;18995:18;;:::i;:::-;18908:2;19039:1;19036;19032:9;19025:16;;18786:261;;;;:::o;19053:185::-;19093:1;19110:20;19128:1;19110:20;:::i;:::-;19105:25;;19144:20;19162:1;19144:20;:::i;:::-;19139:25;;19183:1;19173:2;;19188:18;;:::i;:::-;19173:2;19230:1;19227;19223:9;19218:14;;19095:143;;;;:::o;19244:348::-;19284:7;19307:20;19325:1;19307:20;:::i;:::-;19302:25;;19341:20;19359:1;19341:20;:::i;:::-;19336:25;;19529:1;19461:66;19457:74;19454:1;19451:81;19446:1;19439:9;19432:17;19428:105;19425:2;;;19536:18;;:::i;:::-;19425:2;19584:1;19581;19577:9;19566:20;;19292:300;;;;:::o;19598:191::-;19638:4;19658:20;19676:1;19658:20;:::i;:::-;19653:25;;19692:20;19710:1;19692:20;:::i;:::-;19687:25;;19731:1;19728;19725:8;19722:2;;;19736:18;;:::i;:::-;19722:2;19781:1;19778;19774:9;19766:17;;19643:146;;;;:::o;19795:96::-;19832:7;19861:24;19879:5;19861:24;:::i;:::-;19850:35;;19840:51;;;:::o;19897:90::-;19931:7;19974:5;19967:13;19960:21;19949:32;;19939:48;;;:::o;19993:110::-;20044:7;20073:24;20091:5;20073:24;:::i;:::-;20062:35;;20052:51;;;:::o;20109:126::-;20146:7;20186:42;20179:5;20175:54;20164:65;;20154:81;;;:::o;20241:77::-;20278:7;20307:5;20296:16;;20286:32;;;:::o;20324:184::-;20403:9;20436:66;20496:5;20436:66;:::i;:::-;20423:79;;20413:95;;;:::o;20514:142::-;20593:9;20626:24;20644:5;20626:24;:::i;:::-;20613:37;;20603:53;;;:::o;20662:154::-;20726:9;20759:51;20804:5;20759:51;:::i;:::-;20746:64;;20736:80;;;:::o;20822:127::-;20886:9;20919:24;20937:5;20919:24;:::i;:::-;20906:37;;20896:53;;;:::o;20955:170::-;21027:9;21060:59;21113:5;21060:59;:::i;:::-;21047:72;;21037:88;;;:::o;21131:135::-;21203:9;21236:24;21254:5;21236:24;:::i;:::-;21223:37;;21213:53;;;:::o;21272:307::-;21340:1;21350:113;21364:6;21361:1;21358:13;21350:113;;;21449:1;21444:3;21440:11;21434:18;21430:1;21425:3;21421:11;21414:39;21386:2;21383:1;21379:10;21374:15;;21350:113;;;21481:6;21478:1;21475:13;21472:2;;;21561:1;21552:6;21547:3;21543:16;21536:27;21472:2;21321:258;;;;:::o;21585:281::-;21668:27;21690:4;21668:27;:::i;:::-;21660:6;21656:40;21798:6;21786:10;21783:22;21762:18;21750:10;21747:34;21744:62;21741:2;;;21809:18;;:::i;:::-;21741:2;21849:10;21845:2;21838:22;21628:238;;;:::o;21872:180::-;21920:77;21917:1;21910:88;22017:4;22014:1;22007:15;22041:4;22038:1;22031:15;22058:180;22106:77;22103:1;22096:88;22203:4;22200:1;22193:15;22227:4;22224:1;22217:15;22244:180;22292:77;22289:1;22282:88;22389:4;22386:1;22379:15;22413:4;22410:1;22403:15;22430:102;22471:6;22522:2;22518:7;22513:2;22506:5;22502:14;22498:28;22488:38;;22478:54;;;:::o;22538:225::-;22678:34;22674:1;22666:6;22662:14;22655:58;22747:8;22742:2;22734:6;22730:15;22723:33;22644:119;:::o;22769:167::-;22909:19;22905:1;22897:6;22893:14;22886:43;22875:61;:::o;22942:221::-;23082:34;23078:1;23070:6;23066:14;23059:58;23151:4;23146:2;23138:6;23134:15;23127:29;23048:115;:::o;23169:232::-;23309:34;23305:1;23297:6;23293:14;23286:58;23378:15;23373:2;23365:6;23361:15;23354:40;23275:126;:::o;23407:182::-;23547:34;23543:1;23535:6;23531:14;23524:58;23513:76;:::o;23595:233::-;23735:34;23731:1;23723:6;23719:14;23712:58;23804:16;23799:2;23791:6;23787:15;23780:41;23701:127;:::o;23834:228::-;23974:34;23970:1;23962:6;23958:14;23951:58;24043:11;24038:2;24030:6;24026:15;24019:36;23940:122;:::o;24068:226::-;24208:34;24204:1;24196:6;24192:14;24185:58;24277:9;24272:2;24264:6;24260:15;24253:34;24174:120;:::o;24300:220::-;24440:34;24436:1;24428:6;24424:14;24417:58;24509:3;24504:2;24496:6;24492:15;24485:28;24406:114;:::o;24526:122::-;24599:24;24617:5;24599:24;:::i;:::-;24592:5;24589:35;24579:2;;24638:1;24635;24628:12;24579:2;24569:79;:::o;24654:116::-;24724:21;24739:5;24724:21;:::i;:::-;24717:5;24714:32;24704:2;;24760:1;24757;24750:12;24704:2;24694:76;:::o;24776:150::-;24863:38;24895:5;24863:38;:::i;:::-;24856:5;24853:49;24843:2;;24916:1;24913;24906:12;24843:2;24833:93;:::o;24932:122::-;25005:24;25023:5;25005:24;:::i;:::-;24998:5;24995:35;24985:2;;25044:1;25041;25034:12;24985:2;24975:79;:::o
Swarm Source
ipfs://71070b6153e378888d987216d12dff0baa36db78756f79f5d2e67d6d54ebe98d
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.