Contract
0xd6a4F121CA35509aF06A0Be99093d08462f53052
15
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xbd853b04016d7e435227793ef551a1096c055217256ba0642ed8f5b30f04e40f | 5242811 | 729 days 15 hrs ago | 0x154c2a2a404a0d272080e3c9780bff3fda89c5ba | Trader Joe: Master Chef Joe V2 | 0.1 AVAX |
[ Download CSV Export ]
Contract Name:
MasterChefJoeV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2021-11-05 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, 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/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ 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) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @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. 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) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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) { 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal virtual { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/JoeToken.sol pragma solidity 0.6.12; // JoeToken with Governance. contract JoeToken is ERC20("JoeToken", "JOE"), Ownable { /// @notice Total number of tokens uint256 public maxSupply = 500_000_000e18; // 500 million Joe /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterJoe). function mint(address _to, uint256 _amount) public onlyOwner { require( totalSupply().add(_amount) <= maxSupply, "JOE::mint: cannot exceed max supply" ); _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @notice A record of each accounts delegate mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "JOE::delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "JOE::delegateBySig: invalid nonce" ); require(now <= expiry, "JOE::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { require( blockNumber < block.number, "JOE::getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying JOEs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint256 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32( block.number, "JOE::_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } } // File: contracts/libraries/BoringERC20.sol pragma solidity 0.6.12; // solhint-disable avoid-low-level-calls library BoringERC20 { 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: hardhat/console.sol pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File: contracts/MasterChefJoeV2.sol pragma solidity 0.6.12; pragma experimental ABIEncoderV2; interface IRewarder { using SafeERC20 for IERC20; function onJoeReward(address user, uint256 newLpAmount) external; function pendingTokens(address user) external view returns (uint256 pending); function rewardToken() external view returns (address); } // MasterChefJoe is a boss. He says "go f your blocks lego boy, I'm gonna use timestamp instead". // And to top it off, it takes no risks. Because the biggest risk is operator error. // So we make it virtually impossible for the operator of this contract to cause a bug with people's harvests. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once JOE is sufficiently // distributed and the community can show to govern itself. // // With thanks to the Lydia Finance team. // // Godspeed and may the 10x be with you. contract MasterChefJoeV2 is Ownable { using SafeMath for uint256; using BoringERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of JOEs // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accJoePerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accJoePerShare` (and `lastRewardTimestamp`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. JOEs to distribute per second. uint256 lastRewardTimestamp; // Last timestamp that JOEs distribution occurs. uint256 accJoePerShare; // Accumulated JOEs per share, times 1e12. See below. IRewarder rewarder; } // The JOE TOKEN! JoeToken public joe; // Dev address. address public devAddr; // Treasury address. address public treasuryAddr; // Investor address address public investorAddr; // JOE tokens created per second. uint256 public joePerSec; // Percentage of pool rewards that goto the devs. uint256 public devPercent; // Percentage of pool rewards that goes to the treasury. uint256 public treasuryPercent; // Percentage of pool rewards that goes to the investor. uint256 public investorPercent; // Info of each pool. PoolInfo[] public poolInfo; // Set of all LP tokens that have been added as pools EnumerableSet.AddressSet private lpTokens; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; // The timestamp when JOE mining starts. uint256 public startTimestamp; event Add( uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder ); event Set( uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite ); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event UpdatePool( uint256 indexed pid, uint256 lastRewardTimestamp, uint256 lpSupply, uint256 accJoePerShare ); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); event SetDevAddress(address indexed oldAddress, address indexed newAddress); event UpdateEmissionRate(address indexed user, uint256 _joePerSec); constructor( JoeToken _joe, address _devAddr, address _treasuryAddr, address _investorAddr, uint256 _joePerSec, uint256 _startTimestamp, uint256 _devPercent, uint256 _treasuryPercent, uint256 _investorPercent ) public { require( 0 <= _devPercent && _devPercent <= 1000, "constructor: invalid dev percent value" ); require( 0 <= _treasuryPercent && _treasuryPercent <= 1000, "constructor: invalid treasury percent value" ); require( 0 <= _investorPercent && _investorPercent <= 1000, "constructor: invalid investor percent value" ); require( _devPercent + _treasuryPercent + _investorPercent <= 1000, "constructor: total percent over max" ); joe = _joe; devAddr = _devAddr; treasuryAddr = _treasuryAddr; investorAddr = _investorAddr; joePerSec = _joePerSec; startTimestamp = _startTimestamp; devPercent = _devPercent; treasuryPercent = _treasuryPercent; investorPercent = _investorPercent; totalAllocPoint = 0; } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add( uint256 _allocPoint, IERC20 _lpToken, IRewarder _rewarder ) public onlyOwner { require( Address.isContract(address(_lpToken)), "add: LP token must be a valid contract" ); require( Address.isContract(address(_rewarder)) || address(_rewarder) == address(0), "add: rewarder must be contract or zero" ); require(!lpTokens.contains(address(_lpToken)), "add: LP already added"); massUpdatePools(); uint256 lastRewardTimestamp = block.timestamp > startTimestamp ? block.timestamp : startTimestamp; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardTimestamp: lastRewardTimestamp, accJoePerShare: 0, rewarder: _rewarder }) ); lpTokens.add(address(_lpToken)); emit Add(poolInfo.length.sub(1), _allocPoint, _lpToken, _rewarder); } // Update the given pool's JOE allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite ) public onlyOwner { require( Address.isContract(address(_rewarder)) || address(_rewarder) == address(0), "set: rewarder must be contract or zero" ); massUpdatePools(); totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; if (overwrite) { poolInfo[_pid].rewarder = _rewarder; } emit Set( _pid, _allocPoint, overwrite ? _rewarder : poolInfo[_pid].rewarder, overwrite ); } // View function to see pending JOEs on frontend. function pendingTokens(uint256 _pid, address _user) external view returns ( uint256 pendingJoe, address bonusTokenAddress, string memory bonusTokenSymbol, uint256 pendingBonusToken ) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accJoePerShare = pool.accJoePerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 multiplier = block.timestamp.sub(pool.lastRewardTimestamp); uint256 lpPercent = 1000 - devPercent - treasuryPercent - investorPercent; uint256 joeReward = multiplier .mul(joePerSec) .mul(pool.allocPoint) .div(totalAllocPoint) .mul(lpPercent) .div(1000); accJoePerShare = accJoePerShare.add( joeReward.mul(1e12).div(lpSupply) ); } pendingJoe = user.amount.mul(accJoePerShare).div(1e12).sub( user.rewardDebt ); // If it's a double reward farm, we return info about the bonus token if (address(pool.rewarder) != address(0)) { (bonusTokenAddress, bonusTokenSymbol) = rewarderBonusTokenInfo( _pid ); pendingBonusToken = pool.rewarder.pendingTokens(_user); } } // Get bonus token info from the rewarder contract for a given pool, if it is a double reward farm function rewarderBonusTokenInfo(uint256 _pid) public view returns (address bonusTokenAddress, string memory bonusTokenSymbol) { PoolInfo storage pool = poolInfo[_pid]; if (address(pool.rewarder) != address(0)) { bonusTokenAddress = address(pool.rewarder.rewardToken()); bonusTokenSymbol = IERC20(pool.rewarder.rewardToken()).safeSymbol(); } } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 multiplier = block.timestamp.sub(pool.lastRewardTimestamp); uint256 joeReward = multiplier.mul(joePerSec).mul(pool.allocPoint).div( totalAllocPoint ); uint256 lpPercent = 1000 - devPercent - treasuryPercent - investorPercent; joe.mint(devAddr, joeReward.mul(devPercent).div(1000)); joe.mint(treasuryAddr, joeReward.mul(treasuryPercent).div(1000)); joe.mint(investorAddr, joeReward.mul(investorPercent).div(1000)); joe.mint(address(this), joeReward.mul(lpPercent).div(1000)); pool.accJoePerShare = pool.accJoePerShare.add( joeReward.mul(1e12).div(lpSupply).mul(lpPercent).div(1000) ); pool.lastRewardTimestamp = block.timestamp; emit UpdatePool( _pid, pool.lastRewardTimestamp, lpSupply, pool.accJoePerShare ); } // Deposit LP tokens to MasterChef for JOE allocation. function deposit(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { // Harvest JOE uint256 pending = user .amount .mul(pool.accJoePerShare) .div(1e12) .sub(user.rewardDebt); safeJoeTransfer(msg.sender, pending); emit Harvest(msg.sender, _pid, pending); } user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); IRewarder rewarder = poolInfo[_pid].rewarder; if (address(rewarder) != address(0)) { rewarder.onJoeReward(msg.sender, user.amount); } pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); // Harvest JOE uint256 pending = user.amount.mul(pool.accJoePerShare).div(1e12).sub( user.rewardDebt ); safeJoeTransfer(msg.sender, pending); emit Harvest(msg.sender, _pid, pending); user.amount = user.amount.sub(_amount); user.rewardDebt = user.amount.mul(pool.accJoePerShare).div(1e12); IRewarder rewarder = poolInfo[_pid].rewarder; if (address(rewarder) != address(0)) { rewarder.onJoeReward(msg.sender, user.amount); } pool.lpToken.safeTransfer(address(msg.sender), _amount); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.rewardDebt = 0; } // Safe joe transfer function, just in case if rounding error causes pool to not have enough JOEs. function safeJoeTransfer(address _to, uint256 _amount) internal { uint256 joeBal = joe.balanceOf(address(this)); if (_amount > joeBal) { joe.transfer(_to, joeBal); } else { joe.transfer(_to, _amount); } } // Update dev address by the previous dev. function dev(address _devAddr) public { require(msg.sender == devAddr, "dev: wut?"); devAddr = _devAddr; emit SetDevAddress(msg.sender, _devAddr); } function setDevPercent(uint256 _newDevPercent) public onlyOwner { require( 0 <= _newDevPercent && _newDevPercent <= 1000, "setDevPercent: invalid percent value" ); require( treasuryPercent + _newDevPercent + investorPercent <= 1000, "setDevPercent: total percent over max" ); devPercent = _newDevPercent; } // Update treasury address by the previous treasury. function setTreasuryAddr(address _treasuryAddr) public { require(msg.sender == treasuryAddr, "setTreasuryAddr: wut?"); treasuryAddr = _treasuryAddr; } function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner { require( 0 <= _newTreasuryPercent && _newTreasuryPercent <= 1000, "setTreasuryPercent: invalid percent value" ); require( devPercent + _newTreasuryPercent + investorPercent <= 1000, "setTreasuryPercent: total percent over max" ); treasuryPercent = _newTreasuryPercent; } // Update the investor address by the previous investor. function setInvestorAddr(address _investorAddr) public { require(msg.sender == investorAddr, "setInvestorAddr: wut?"); investorAddr = _investorAddr; } function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner { require( 0 <= _newInvestorPercent && _newInvestorPercent <= 1000, "setInvestorPercent: invalid percent value" ); require( devPercent + _newInvestorPercent + treasuryPercent <= 1000, "setInvestorPercent: total percent over max" ); investorPercent = _newInvestorPercent; } // Pancake has to add hidden dummy pools inorder to alter the emission, // here we make it simple and transparent to all. function updateEmissionRate(uint256 _joePerSec) public onlyOwner { massUpdatePools(); joePerSec = _joePerSec; emit UpdateEmissionRate(msg.sender, _joePerSec); } }
[{"inputs":[{"internalType":"contract JoeToken","name":"_joe","type":"address"},{"internalType":"address","name":"_devAddr","type":"address"},{"internalType":"address","name":"_treasuryAddr","type":"address"},{"internalType":"address","name":"_investorAddr","type":"address"},{"internalType":"uint256","name":"_joePerSec","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_devPercent","type":"uint256"},{"internalType":"uint256","name":"_treasuryPercent","type":"uint256"},{"internalType":"uint256","name":"_investorPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"lpToken","type":"address"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","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":"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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Harvest","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":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IRewarder","name":"rewarder","type":"address"},{"indexed":false,"internalType":"bool","name":"overwrite","type":"bool"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_joePerSec","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accJoePerShare","type":"uint256"}],"name":"UpdatePool","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":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IRewarder","name":"_rewarder","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":"address","name":"_devAddr","type":"address"}],"name":"dev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investorAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joe","outputs":[{"internalType":"contract JoeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"joePerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"pendingJoe","type":"uint256"},{"internalType":"address","name":"bonusTokenAddress","type":"address"},{"internalType":"string","name":"bonusTokenSymbol","type":"string"},{"internalType":"uint256","name":"pendingBonusToken","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":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accJoePerShare","type":"uint256"},{"internalType":"contract IRewarder","name":"rewarder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"rewarderBonusTokenInfo","outputs":[{"internalType":"address","name":"bonusTokenAddress","type":"address"},{"internalType":"string","name":"bonusTokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IRewarder","name":"_rewarder","type":"address"},{"internalType":"bool","name":"overwrite","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDevPercent","type":"uint256"}],"name":"setDevPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddr","type":"address"}],"name":"setInvestorAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInvestorPercent","type":"uint256"}],"name":"setInvestorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddr","type":"address"}],"name":"setTreasuryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryPercent","type":"uint256"}],"name":"setTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_joePerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002d5e38038062002d5e8339810160408190526200003491620001a3565b6000620000406200019f565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506103e8831115620000b85760405162461bcd60e51b8152600401620000af9062000288565b60405180910390fd5b6103e8821115620000dd5760405162461bcd60e51b8152600401620000af906200023d565b6103e8811115620001025760405162461bcd60e51b8152600401620000af9062000311565b6103e8818385010111156200012b5760405162461bcd60e51b8152600401620000af90620002ce565b600180546001600160a01b039a8b166001600160a01b03199182161790915560028054998b169982169990991790985560038054978a169789169790971790965560048054959098169490961693909317909555600555600e939093556006929092556007556008556000600d5562000375565b3390565b60008060008060008060008060006101208a8c031215620001c2578485fd5b8951620001cf816200035c565b60208b0151909950620001e2816200035c565b60408b0151909850620001f5816200035c565b60608b015190975062000208816200035c565b8096505060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b6020808252602b908201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560408201526a7263656e742076616c756560a81b606082015260800190565b60208082526026908201527f636f6e7374727563746f723a20696e76616c6964206465762070657263656e746040820152652076616c756560d01b606082015260800190565b60208082526023908201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206040820152620dac2f60eb1b606082015260800190565b6020808252602b908201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560408201526a7263656e742076616c756560a81b606082015260800190565b6001600160a01b03811681146200037257600080fd5b50565b6129d980620003856000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806389a2bc251161010f578063bc70fdbc116100a2578063e6fd48bc11610071578063e6fd48bc146103d7578063f2fde38b146103df578063fc3c28af146103f2578063ffcd4263146103fa576101f0565b8063bc70fdbc14610393578063ca418d23146103b4578063da09c72c146103bc578063e2bbb158146103c4576101f0565b8063a7e05b9c116100de578063a7e05b9c1461035d578063ab7de09814610370578063acc4cc5014610383578063b985a3a01461038b576101f0565b806389a2bc251461030e5780638d88a90e146103215780638da5cb5b1461033457806393f1a40b1461033c576101f0565b8063441a3e70116101875780636eaddad2116101565780636eaddad2146102cd578063715018a6146102e0578063876d3c9c146102e857806388bba42f146102fb576101f0565b8063441a3e701461028c57806351eb05a61461029f5780635312ea8e146102b2578063630b5ba1146102c5576101f0565b80630f51f8ff116101c35780630f51f8ff146102385780631526fe271461024b57806317caf6f11461026f57806330d9a62a14610277576101f0565b806304ef9d58146101f55780630735b20814610213578063081e3eda1461021b5780630ba84cd214610223575b600080fd5b6101fd61041d565b60405161020a91906128dc565b60405180910390f35b6101fd610423565b6101fd610429565b6102366102313660046121bb565b61042f565b005b6102366102463660046120cc565b6104c1565b61025e6102593660046121bb565b61050d565b60405161020a959493929190612382565b6101fd610558565b61027f61055e565b60405161020a919061230d565b61023661029a36600461225b565b61056d565b6102366102ad3660046121bb565b61077c565b6102366102c03660046121bb565b610b16565b610236610bb5565b6102366102db3660046121bb565b610bd8565b610236610c68565b6102366102f63660046121bb565b610cf1565b61023661030936600461227c565b610d81565b61023661031c3660046121bb565b610f2e565b61023661032f3660046120cc565b610fbe565b61027f611034565b61034f61034a3660046121eb565b611043565b60405161020a929190612930565b61023661036b3660046120cc565b611067565b61023661037e36600461221a565b6110b3565b61027f611334565b61027f611343565b6103a66103a13660046121bb565b611352565b60405161020a92919061235e565b6101fd6114ab565b61027f6114b1565b6102366103d236600461225b565b6114c0565b6101fd6116ab565b6102366103ed3660046120cc565b6116b1565b6101fd611771565b61040d6104083660046121eb565b611777565b60405161020a94939291906128e5565b60075481565b60085481565b60095490565b6104376119b8565b6001600160a01b0316610448611034565b6001600160a01b0316146104775760405162461bcd60e51b815260040161046e90612644565b60405180910390fd5b61047f610bb5565b600581905560405133907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c4053906104b69084906128dc565b60405180910390a250565b6004546001600160a01b031633146104eb5760405162461bcd60e51b815260040161046e9061277c565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6009818154811061051a57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0393841695509193909290911685565b600d5481565b6003546001600160a01b031681565b60006009838154811061057c57fe5b60009182526020808320868452600c8252604080852033865290925292208054600590920290920192508311156105c55760405162461bcd60e51b815260040161046e906127ab565b6105ce8461077c565b6000610608826001015461060264e8d4a510006105fc876003015487600001546119bc90919063ffffffff16565b906119ff565b90611a31565b90506106143382611a59565b84336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249548360405161064e91906128dc565b60405180910390a381546106629085611a31565b808355600384015461067f9164e8d4a51000916105fc91906119bc565b826001018190555060006009868154811061069657fe5b60009182526020909120600460059092020101546001600160a01b03169050801561071c5782546040516301a7af8b60e41b81526001600160a01b03831691631a7af8b0916106e9913391600401612321565b600060405180830381600087803b15801561070357600080fd5b505af1158015610717573d6000803e3d6000fd5b505050505b8354610732906001600160a01b03163387611bf9565b85336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5688760405161076c91906128dc565b60405180910390a3505050505050565b60006009828154811061078b57fe5b90600052602060002090600502019050806002015442116107ac5750610b13565b80546040516370a0823160e01b81526000916001600160a01b0316906370a08231906107dc90309060040161230d565b60206040518083038186803b1580156107f457600080fd5b505afa158015610808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082c91906121d3565b905080610840575042600290910155610b13565b6000610859836002015442611a3190919063ffffffff16565b90506000610886600d546105fc8660010154610880600554876119bc90919063ffffffff16565b906119bc565b6008546007546006546001546002549495506103e88281039390930393909303936001600160a01b03938416936340c10f19939116916108cc91906105fc9088906119bc565b6040518363ffffffff1660e01b81526004016108e9929190612321565b600060405180830381600087803b15801561090357600080fd5b505af1158015610917573d6000803e3d6000fd5b50506001546003546007546001600160a01b0392831694506340c10f19935091169061094c906103e8906105fc9088906119bc565b6040518363ffffffff1660e01b8152600401610969929190612321565b600060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b50506001546004546008546001600160a01b0392831694506340c10f1993509116906109cc906103e8906105fc9088906119bc565b6040518363ffffffff1660e01b81526004016109e9929190612321565b600060405180830381600087803b158015610a0357600080fd5b505af1158015610a17573d6000803e3d6000fd5b50506001546001600160a01b031691506340c10f19905030610a3f6103e86105fc87876119bc565b6040518363ffffffff1660e01b8152600401610a5c929190612321565b600060405180830381600087803b158015610a7657600080fd5b505af1158015610a8a573d6000803e3d6000fd5b50505050610ac2610ab76103e86105fc84610880896105fc64e8d4a510008a6119bc90919063ffffffff16565b600387015490611cef565b60038601819055426002870181905560405188927f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4692610b05929091899161293e565b60405180910390a250505050505b50565b600060098281548110610b2557fe5b60009182526020808320858452600c82526040808520338087529352909320805460059093029093018054909450610b6a926001600160a01b03919091169190611bf9565b8054604051849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059591610b9e916128dc565b60405180910390a360008082556001909101555050565b60095460005b81811015610bd457610bcc8161077c565b600101610bbb565b5050565b610be06119b8565b6001600160a01b0316610bf1611034565b6001600160a01b031614610c175760405162461bcd60e51b815260040161046e90612644565b6103e8811115610c395760405162461bcd60e51b815260040161046e90612898565b6103e86008548260075401011115610c635760405162461bcd60e51b815260040161046e906126a8565b600655565b610c706119b8565b6001600160a01b0316610c81611034565b6001600160a01b031614610ca75760405162461bcd60e51b815260040161046e90612644565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610cf96119b8565b6001600160a01b0316610d0a611034565b6001600160a01b031614610d305760405162461bcd60e51b815260040161046e90612644565b6103e8811115610d525760405162461bcd60e51b815260040161046e906126ed565b6103e86007548260065401011115610d7c5760405162461bcd60e51b815260040161046e90612433565b600855565b610d896119b8565b6001600160a01b0316610d9a611034565b6001600160a01b031614610dc05760405162461bcd60e51b815260040161046e90612644565b610dc982611d14565b80610ddb57506001600160a01b038216155b610df75760405162461bcd60e51b815260040161046e906127d7565b610dff610bb5565b610e3c83610e3660098781548110610e1357fe5b906000526020600020906005020160010154600d54611a3190919063ffffffff16565b90611cef565b600d819055508260098581548110610e5057fe5b9060005260206000209060050201600101819055508015610eaf578160098581548110610e7957fe5b906000526020600020906005020160040160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b80610ee35760098481548110610ec157fe5b60009182526020909120600460059092020101546001600160a01b0316610ee5565b815b6001600160a01b0316847fa54644aae5c48c5971516f334e4fe8ecbc7930e23f34877d4203c6551e67ffaa8584604051610f20929190612920565b60405180910390a350505050565b610f366119b8565b6001600160a01b0316610f47611034565b6001600160a01b031614610f6d5760405162461bcd60e51b815260040161046e90612644565b6103e8811115610f8f5760405162461bcd60e51b815260040161046e906124fa565b6103e86008548260065401011115610fb95760405162461bcd60e51b815260040161046e906123b2565b600755565b6002546001600160a01b03163314610fe85760405162461bcd60e51b815260040161046e906125b1565b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e790600090a350565b6000546001600160a01b031690565b600c6020908152600092835260408084209091529082529020805460019091015482565b6003546001600160a01b031633146110915760405162461bcd60e51b815260040161046e90612679565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6110bb6119b8565b6001600160a01b03166110cc611034565b6001600160a01b0316146110f25760405162461bcd60e51b815260040161046e90612644565b6110fb82611d14565b6111175760405162461bcd60e51b815260040161046e90612736565b61112081611d14565b8061113257506001600160a01b038116155b61114e5760405162461bcd60e51b815260040161046e9061281d565b611159600a83611d1e565b156111765760405162461bcd60e51b815260040161046e90612615565b61117e610bb5565b6000600e54421161119157600e54611193565b425b600d549091506111a39085611cef565b600d556040805160a0810182526001600160a01b038581168252602082018781529282018481526000606084018181528784166080860190815260098054600181018255935294517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600590930292830180546001600160a01b031990811692871692909217905595517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b083015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b182015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b282015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b3909201805490931691161790556112d8600a84611d33565b506009546001600160a01b0380841691908516906112f7906001611a31565b7f4b16bd2431ad24dc020ab0e1de7fcb6563dead6a24fb10089d6c23e97a70381f8760405161132691906128dc565b60405180910390a450505050565b6004546001600160a01b031681565b6001546001600160a01b031681565b6000606060006009848154811061136557fe5b6000918252602090912060059091020160048101549091506001600160a01b0316156114a5576004808201546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c1928282019260209290829003018186803b1580156113cf57600080fd5b505afa1580156113e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140791906120e8565b92506114a28160040160009054906101000a90046001600160a01b03166001600160a01b031663f7c618c16040518163ffffffff1660e01b815260040160206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149491906120e8565b6001600160a01b0316611d48565b91505b50915091565b60055481565b6002546001600160a01b031681565b6000600983815481106114cf57fe5b60009182526020808320868452600c825260408085203386529092529220600590910290910191506115008461077c565b805415611585576000611535826001015461060264e8d4a510006105fc876003015487600001546119bc90919063ffffffff16565b90506115413382611a59565b84336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae06609249548360405161157b91906128dc565b60405180910390a3505b80546115919084611cef565b80825560038301546115ae9164e8d4a51000916105fc91906119bc565b81600101819055506000600985815481106115c557fe5b60009182526020909120600460059092020101546001600160a01b03169050801561164b5781546040516301a7af8b60e41b81526001600160a01b03831691631a7af8b091611618913391600401612321565b600060405180830381600087803b15801561163257600080fd5b505af1158015611646573d6000803e3d6000fd5b505050505b8254611662906001600160a01b0316333087611e0b565b84336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161169c91906128dc565b60405180910390a35050505050565b600e5481565b6116b96119b8565b6001600160a01b03166116ca611034565b6001600160a01b0316146116f05760405162461bcd60e51b815260040161046e90612644565b6001600160a01b0381166117165760405162461bcd60e51b815260040161046e9061247d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60065481565b60008060606000806009878154811061178c57fe5b600091825260208083208a8452600c825260408085206001600160a01b03808d16875293528085206003600590950290920193840154845491516370a0823160e01b815294965091949193919216906370a08231906117ef90309060040161230d565b60206040518083038186803b15801561180757600080fd5b505afa15801561181b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183f91906121d3565b905083600201544211801561185357508015155b156118da576000611871856002015442611a3190919063ffffffff16565b905060006008546007546006546103e8030303905060006118b56103e86105fc84610880600d546105fc8d600101546108806005548c6119bc90919063ffffffff16565b90506118d46118cd856105fc8464e8d4a510006119bc565b8690611cef565b94505050505b611902836001015461060264e8d4a510006105fc8688600001546119bc90919063ffffffff16565b60048501549098506001600160a01b0316156119ab576119218a611352565b60048087015460405163c031a66f60e01b8152939a509198506001600160a01b039091169163c031a66f91611958918d910161230d565b60206040518083038186803b15801561197057600080fd5b505afa158015611984573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a891906121d3565b94505b5050505092959194509250565b3390565b6000826119cb575060006119f9565b828202828482816119d857fe5b04146119f65760405162461bcd60e51b815260040161046e906125d4565b90505b92915050565b6000808211611a205760405162461bcd60e51b815260040161046e9061257a565b818381611a2957fe5b049392505050565b600082821115611a535760405162461bcd60e51b815260040161046e90612543565b50900390565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a8a90309060040161230d565b60206040518083038186803b158015611aa257600080fd5b505afa158015611ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ada91906121d3565b905080821115611b6e5760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b169086908590600401612321565b602060405180830381600087803b158015611b3057600080fd5b505af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190612104565b50611bf4565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611ba09086908690600401612321565b602060405180830381600087803b158015611bba57600080fd5b505af1158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf29190612104565b505b505050565b60006060846001600160a01b031663a9059cbb60e01b8585604051602401611c22929190612321565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611c6091906122f1565b6000604051808303816000865af19150503d8060008114611c9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ca2565b606091505b5091509150818015611ccc575080511580611ccc575080806020019051810190611ccc9190612104565b611ce85760405162461bcd60e51b815260040161046e906123fc565b5050505050565b6000828201838110156119f65760405162461bcd60e51b815260040161046e906124c3565b803b15155b919050565b60006119f6836001600160a01b038416611f04565b60006119f6836001600160a01b038416611f1c565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009183916001600160a01b03861691611d8f91906122f1565b600060405180830381855afa9150503d8060008114611dca576040519150601f19603f3d011682016040523d82523d6000602084013e611dcf565b606091505b509150915081611dfa57604051806040016040528060038152602001623f3f3f60e81b815250611e03565b611e0381611f66565b949350505050565b60006060856001600160a01b03166323b872dd60e01b868686604051602401611e369392919061233a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611e7491906122f1565b6000604051808303816000865af19150503d8060008114611eb1576040519150601f19603f3d011682016040523d82523d6000602084013e611eb6565b606091505b5091509150818015611ee0575080511580611ee0575080806020019051810190611ee09190612104565b611efc5760405162461bcd60e51b815260040161046e90612863565b505050505050565b60009081526001919091016020526040902054151590565b6000611f288383611f04565b611f5e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556119f9565b5060006119f9565b60606040825110611f8c5781806020019051810190611f859190612120565b9050611d19565b8151602014156120ac5760005b60208160ff16108015611fc85750828160ff1681518110611fb657fe5b01602001516001600160f81b03191615155b15611fd557600101611f99565b60608160ff1667ffffffffffffffff81118015611ff157600080fd5b506040519080825280601f01601f19166020018201604052801561201c576020820181803683370190505b509050600091505b60208260ff161080156120535750838260ff168151811061204157fe5b01602001516001600160f81b03191615155b156120a357838260ff168151811061206757fe5b602001015160f81c60f81b818360ff168151811061208157fe5b60200101906001600160f81b031916908160001a905350600190910190612024565b9150611d199050565b506040805180820190915260038152623f3f3f60e81b6020820152611d19565b6000602082840312156120dd578081fd5b81356119f681612980565b6000602082840312156120f9578081fd5b81516119f681612980565b600060208284031215612115578081fd5b81516119f681612995565b600060208284031215612131578081fd5b815167ffffffffffffffff80821115612148578283fd5b818401915084601f83011261215b578283fd5b815181811115612169578384fd5b604051601f8201601f191681016020018381118282101715612189578586fd5b6040528181528382016020018710156121a0578485fd5b6121b1826020830160208701612954565b9695505050505050565b6000602082840312156121cc578081fd5b5035919050565b6000602082840312156121e4578081fd5b5051919050565b600080604083850312156121fd578081fd5b82359150602083013561220f81612980565b809150509250929050565b60008060006060848603121561222e578081fd5b83359250602084013561224081612980565b9150604084013561225081612980565b809150509250925092565b6000806040838503121561226d578182fd5b50508035926020909101359150565b60008060008060808587031215612291578081fd5b843593506020850135925060408501356122aa81612980565b915060608501356122ba81612995565b939692955090935050565b600081518084526122dd816020860160208601612954565b601f01601f19169290920160200192915050565b60008251612303818460208701612954565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0383168152604060208201819052600090611e03908301846122c5565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6020808252602a908201527f736574547265617375727950657263656e743a20746f74616c2070657263656e6040820152690e840deeccae440dac2f60b31b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b6020808252602a908201527f736574496e766573746f7250657263656e743a20746f74616c2070657263656e6040820152690e840deeccae440dac2f60b31b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526029908201527f736574547265617375727950657263656e743a20696e76616c69642070657263604082015268656e742076616c756560b81b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252600990820152686465763a207775743f60b81b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152741859190e88131408185b1c9958591e481859191959605a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601590820152747365745472656173757279416464723a207775743f60581b604082015260600190565b60208082526025908201527f73657444657650657263656e743a20746f74616c2070657263656e74206f76656040820152640e440dac2f60db1b606082015260800190565b60208082526029908201527f736574496e766573746f7250657263656e743a20696e76616c69642070657263604082015268656e742076616c756560b81b606082015260800190565b60208082526026908201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6040820152651b9d1c9858dd60d21b606082015260800190565b602080825260159082015274736574496e766573746f72416464723a207775743f60581b604082015260600190565b6020808252601290820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604082015260600190565b60208082526026908201527f7365743a207265776172646572206d75737420626520636f6e7472616374206f60408201526572207a65726f60d01b606082015260800190565b60208082526026908201527f6164643a207265776172646572206d75737420626520636f6e7472616374206f60408201526572207a65726f60d01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526024908201527f73657444657650657263656e743a20696e76616c69642070657263656e742076604082015263616c756560e01b606082015260800190565b90815260200190565b8481526001600160a01b038416602082015260806040820181905260009061290f908301856122c5565b905082606083015295945050505050565b9182521515602082015260400190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60005b8381101561296f578181015183820152602001612957565b83811115611bf25750506000910152565b6001600160a01b0381168114610b1357600080fd5b8015158114610b1357600080fdfea2646970667358221220cf62cc73bc314ba8dbae48f1cc860129f15a7196f5321cdecd0688817b22385a64736f6c634300060c00330000000000000000000000006e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd0000000000000000000000005d3e4c0fe11e0ae4c32f0ff74b4544c49538ac61000000000000000000000000125c2ee2d4765891eaeadda8e4f06473282e3060000000000000000000000000d2a71475eca084c14a3f08fa12c98362972e889c000000000000000000000000000000000000000000000001a055690d9db800000000000000000000000000000000000000000000000000000000000060e06d6000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000064
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd0000000000000000000000005d3e4c0fe11e0ae4c32f0ff74b4544c49538ac61000000000000000000000000125c2ee2d4765891eaeadda8e4f06473282e3060000000000000000000000000d2a71475eca084c14a3f08fa12c98362972e889c000000000000000000000000000000000000000000000001a055690d9db800000000000000000000000000000000000000000000000000000000000060e06d6000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _joe (address): 0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd
Arg [1] : _devAddr (address): 0x5d3e4c0fe11e0ae4c32f0ff74b4544c49538ac61
Arg [2] : _treasuryAddr (address): 0x125c2ee2d4765891eaeadda8e4f06473282e3060
Arg [3] : _investorAddr (address): 0xd2a71475eca084c14a3f08fa12c98362972e889c
Arg [4] : _joePerSec (uint256): 30000000000000000000
Arg [5] : _startTimestamp (uint256): 1625320800
Arg [6] : _devPercent (uint256): 200
Arg [7] : _treasuryPercent (uint256): 200
Arg [8] : _investorPercent (uint256): 100
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000006e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd
Arg [1] : 0000000000000000000000005d3e4c0fe11e0ae4c32f0ff74b4544c49538ac61
Arg [2] : 000000000000000000000000125c2ee2d4765891eaeadda8e4f06473282e3060
Arg [3] : 000000000000000000000000d2a71475eca084c14a3f08fa12c98362972e889c
Arg [4] : 000000000000000000000000000000000000000000000001a055690d9db80000
Arg [5] : 0000000000000000000000000000000000000000000000000000000060e06d60
Arg [6] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [7] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Deployed ByteCode Sourcemap
124352:16164:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126217:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;126316;;;:::i;129099:95::-;;;:::i;140321:192::-;;;;;;:::i;:::-;;:::i;:::-;;139552:173;;;;;;:::i;:::-;;:::i;126382:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;126730:30::-;;;:::i;125905:27::-;;;:::i;:::-;;;;;;;:::i;136394:931::-;;;;;;:::i;:::-;;:::i;133927:1328::-;;;;;;:::i;:::-;;:::i;137396:356::-;;;;;;:::i;:::-;;:::i;133671:180::-;;;:::i;138379:408::-;;;;;;:::i;:::-;;:::i;34534:148::-;;;:::i;139733:448::-;;;;;;:::i;:::-;;:::i;130625:785::-;;;;;;:::i;:::-;;:::i;139034:448::-;;;;;;:::i;:::-;;:::i;138191:180::-;;;;;;:::i;:::-;;:::i;33883:87::-;;;:::i;126571:64::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;138853:173::-;;;;;;:::i;:::-;;:::i;129363:1167::-;;;;;;:::i;:::-;;:::i;125964:27::-;;;:::i;125803:19::-;;;:::i;133156:432::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;126037:24::-;;;:::i;125850:22::-;;;:::i;135323:1019::-;;;;;;:::i;:::-;;:::i;126813:29::-;;;:::i;34837:244::-;;;;;;:::i;:::-;;:::i;126123:25::-;;;:::i;131473:1571::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;126217:30::-;;;;:::o;126316:::-;;;;:::o;129099:95::-;129171:8;:15;129099:95;:::o;140321:192::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;;;;;;;;;140397:17:::1;:15;:17::i;:::-;140425:9;:22:::0;;;140463:42:::1;::::0;140482:10:::1;::::0;140463:42:::1;::::0;::::1;::::0;140437:10;;140463:42:::1;:::i;:::-;;;;;;;;140321:192:::0;:::o;139552:173::-;139640:12;;-1:-1:-1;;;;;139640:12:0;139626:10;:26;139618:60;;;;-1:-1:-1;;;139618:60:0;;;;;;;:::i;:::-;139689:12;:28;;-1:-1:-1;;;;;;139689:28:0;-1:-1:-1;;;;;139689:28:0;;;;;;;;;;139552:173::o;126382:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;126382:26:0;;;;-1:-1:-1;126382:26:0;;;;;;;;:::o;126730:30::-;;;;:::o;125905:27::-;;;-1:-1:-1;;;;;125905:27:0;;:::o;136394:931::-;136461:21;136485:8;136494:4;136485:14;;;;;;;;;;;;;;;;136534;;;:8;:14;;;;;;136549:10;136534:26;;;;;;;136579:11;;136485:14;;;;;;;;-1:-1:-1;136579:22:0;-1:-1:-1;136579:22:0;136571:53;;;;-1:-1:-1;;;136571:53:0;;;;;;;:::i;:::-;136637:16;136648:4;136637:10;:16::i;:::-;136690:15;136708:91;136773:4;:15;;;136708:46;136749:4;136708:36;136724:4;:19;;;136708:4;:11;;;:15;;:36;;;;:::i;:::-;:40;;:46::i;:::-;:50;;:91::i;:::-;136690:109;;136810:36;136826:10;136838:7;136810:15;:36::i;:::-;136882:4;136870:10;-1:-1:-1;;;;;136862:34:0;;136888:7;136862:34;;;;;;:::i;:::-;;;;;;;;136923:11;;:24;;136939:7;136923:15;:24::i;:::-;136909:38;;;136992:19;;;;136976:46;;137017:4;;136976:36;;136909:38;136976:15;:36::i;:46::-;136958:4;:15;;:64;;;;137035:18;137056:8;137065:4;137056:14;;;;;;;;;;;;;;;;:23;:14;;;;;:23;;-1:-1:-1;;;;;137056:23:0;;-1:-1:-1;137094:31:0;;137090:109;;137175:11;;137142:45;;-1:-1:-1;;;137142:45:0;;-1:-1:-1;;;;;137142:20:0;;;;;:45;;137163:10;;137142:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137090:109;137211:12;;:55;;-1:-1:-1;;;;;137211:12:0;137245:10;137258:7;137211:25;:55::i;:::-;137303:4;137291:10;-1:-1:-1;;;;;137282:35:0;;137309:7;137282:35;;;;;;:::i;:::-;;;;;;;;136394:931;;;;;;:::o;133927:1328::-;133979:21;134003:8;134012:4;134003:14;;;;;;;;;;;;;;;;;;133979:38;;134051:4;:24;;;134032:15;:43;134028:82;;134092:7;;;134028:82;134139:12;;:37;;-1:-1:-1;;;134139:37:0;;134120:16;;-1:-1:-1;;;;;134139:12:0;;:22;;:37;;134170:4;;134139:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;134120:56;-1:-1:-1;134191:13:0;134187:109;;-1:-1:-1;134248:15:0;134221:24;;;;:42;134278:7;;134187:109;134306:18;134327:45;134347:4;:24;;;134327:15;:19;;:45;;;;:::i;:::-;134306:66;;134383:17;134403:91;134468:15;;134403:46;134433:4;:15;;;134403:25;134418:9;;134403:10;:14;;:25;;;;:::i;:::-;:29;;:46::i;:91::-;134602:15;;134571;;134545:10;;134628:3;;134637:7;;134383:111;;-1:-1:-1;134525:4:0;:30;;;:61;;;;:92;;;;;-1:-1:-1;;;;;134628:3:0;;;;:8;;134637:7;;;134646:35;;134525:4;134646:25;;134383:111;;134646:13;:25::i;:35::-;134628:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;134693:3:0;;134702:12;;134730:15;;-1:-1:-1;;;;;134693:3:0;;;;-1:-1:-1;134693:8:0;;-1:-1:-1;134702:12:0;;;134716:40;;134751:4;;134716:30;;:9;;:13;:30::i;:40::-;134693:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;134768:3:0;;134777:12;;134805:15;;-1:-1:-1;;;;;134768:3:0;;;;-1:-1:-1;134768:8:0;;-1:-1:-1;134777:12:0;;;134791:40;;134826:4;;134791:30;;:9;;:13;:30::i;:40::-;134768:64;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;134843:3:0;;-1:-1:-1;;;;;134843:3:0;;-1:-1:-1;134843:8:0;;-1:-1:-1;134860:4:0;134867:34;134896:4;134867:24;:9;134881;134867:13;:24::i;:34::-;134843:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;134935:107;134973:58;135026:4;134973:48;135011:9;134973:33;134997:8;134973:19;134987:4;134973:9;:13;;:19;;;;:::i;:58::-;134935:19;;;;;:23;:107::i;:::-;134913:19;;;:129;;;135080:15;135053:24;;;:42;;;135111:136;;135136:4;;135111:136;;;;135080:15;;135194:8;;135111:136;:::i;:::-;;;;;;;;133927:1328;;;;;;;:::o;137396:356::-;137455:21;137479:8;137488:4;137479:14;;;;;;;;;;;;;;;;137528;;;:8;:14;;;;;;137543:10;137528:26;;;;;;;;137612:11;;137479:14;;;;;;;137565:12;;137479:14;;-1:-1:-1;137565:59:0;;-1:-1:-1;;;;;137565:12:0;;;;;137543:10;137565:25;:59::i;:::-;137676:11;;137640:48;;137670:4;;137658:10;;137640:48;;;;;:::i;:::-;;;;;;;;137713:1;137699:15;;;137725;;;;:19;-1:-1:-1;;137396:356:0:o;133671:180::-;133733:8;:15;133716:14;133759:85;133787:6;133781:3;:12;133759:85;;;133817:15;133828:3;133817:10;:15::i;:::-;133795:5;;133759:85;;;;133671:180;:::o;138379:408::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;138517:4:::1;138499:14;:22;;138454:131;;;;-1:-1:-1::0;;;138454:131:0::1;;;;;;;:::i;:::-;138672:4;138653:15;;138636:14;138618:15;;:32;:50;:58;;138596:145;;;;-1:-1:-1::0;;;138596:145:0::1;;;;;;;:::i;:::-;138752:10;:27:::0;138379:408::o;34534:148::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;34641:1:::1;34625:6:::0;;34604:40:::1;::::0;-1:-1:-1;;;;;34625:6:0;;::::1;::::0;34604:40:::1;::::0;34641:1;;34604:40:::1;34672:1;34655:19:::0;;-1:-1:-1;;;;;;34655:19:0::1;::::0;;34534:148::o;139733:448::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;139891:4:::1;139868:19;:27;;139818:146;;;;-1:-1:-1::0;;;139818:146:0::1;;;;;;;:::i;:::-;140051:4;140032:15;;140010:19;139997:10;;:32;:50;:58;;139975:150;;;;-1:-1:-1::0;;;139975:150:0::1;;;;;;;:::i;:::-;140136:15;:37:::0;139733:448::o;130625:785::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;130803:38:::1;130830:9;130803:18;:38::i;:::-;:91;;;-1:-1:-1::0;;;;;;130862:32:0;::::1;::::0;130803:91:::1;130781:179;;;;-1:-1:-1::0;;;130781:179:0::1;;;;;;;:::i;:::-;130971:17;:15;:17::i;:::-;131017:87;131082:11;131017:46;131037:8;131046:4;131037:14;;;;;;;;;;;;;;;;;;:25;;;131017:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;130999:15;:105;;;;131143:11;131115:8;131124:4;131115:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;131169:9;131165:77;;;131221:9;131195:8;131204:4;131195:14;;;;;;;;;;;;;;;;;;:23;;;:35;;;;;-1:-1:-1::0;;;;;131195:35:0::1;;;;;-1:-1:-1::0;;;;;131195:35:0::1;;;;;;131165:77;131320:9;:47;;131344:8;131353:4;131344:14;;;;;;;;;::::0;;;::::1;::::0;;;:23:::1;:14;::::0;;::::1;;:23;::::0;-1:-1:-1;;;;;131344:23:0::1;131320:47;;;131332:9;131320:47;-1:-1:-1::0;;;;;131257:145:0::1;131275:4;131257:145;131294:11;131382:9;131257:145;;;;;;;:::i;:::-;;;;;;;;130625:785:::0;;;;:::o;139034:448::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;139192:4:::1;139169:19;:27;;139119:146;;;;-1:-1:-1::0;;;139119:146:0::1;;;;;;;:::i;:::-;139352:4;139333:15;;139311:19;139298:10;;:32;:50;:58;;139276:150;;;;-1:-1:-1::0;;;139276:150:0::1;;;;;;;:::i;:::-;139437:15;:37:::0;139034:448::o;138191:180::-;138262:7;;-1:-1:-1;;;;;138262:7:0;138248:10;:21;138240:43;;;;-1:-1:-1;;;138240:43:0;;;;;;;:::i;:::-;138294:7;:18;;-1:-1:-1;;;;;;138294:18:0;-1:-1:-1;;;;;138294:18:0;;;;;;;;138328:35;;138342:10;;138328:35;;-1:-1:-1;;138328:35:0;138191:180;:::o;33883:87::-;33929:7;33956:6;-1:-1:-1;;;;;33956:6:0;33883:87;:::o;126571:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;138853:173::-;138941:12;;-1:-1:-1;;;;;138941:12:0;138927:10;:26;138919:60;;;;-1:-1:-1;;;138919:60:0;;;;;;;:::i;:::-;138990:12;:28;;-1:-1:-1;;;;;;138990:28:0;-1:-1:-1;;;;;138990:28:0;;;;;;;;;;138853:173::o;129363:1167::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;129519:37:::1;129546:8;129519:18;:37::i;:::-;129497:125;;;;-1:-1:-1::0;;;129497:125:0::1;;;;;;;:::i;:::-;129655:38;129682:9;129655:18;:38::i;:::-;:91;;;-1:-1:-1::0;;;;;;129714:32:0;::::1;::::0;129655:91:::1;129633:179;;;;-1:-1:-1::0;;;129633:179:0::1;;;;;;;:::i;:::-;129832:36;:8;129858::::0;129832:17:::1;:36::i;:::-;129831:37;129823:71;;;;-1:-1:-1::0;;;129823:71:0::1;;;;;;;:::i;:::-;129905:17;:15;:17::i;:::-;129933:27;129981:14;;129963:15;:32;:93;;130042:14;;129963:93;;;130011:15;129963:93;130085:15;::::0;129933:123;;-1:-1:-1;130085:32:0::1;::::0;130105:11;130085:19:::1;:32::i;:::-;130067:15;:50:::0;130156:236:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;130156:236:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;130156:236:0;;;;;;;;::::1;::::0;;;;;;130128:8:::1;:275:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;130128:275:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;::::1;;::::0;;130414:31:::1;:8;130156:236:::0;130414:12:::1;:31::i;:::-;-1:-1:-1::0;130465:8:0::1;:15:::0;-1:-1:-1;;;;;130461:61:0;;::::1;::::0;;;::::1;::::0;130465:22:::1;::::0;130485:1:::1;130465:19;:22::i;:::-;130461:61;130489:11;130461:61;;;;;;:::i;:::-;;;;;;;;34174:1;129363:1167:::0;;;:::o;125964:27::-;;;-1:-1:-1;;;;;125964:27:0;;:::o;125803:19::-;;;-1:-1:-1;;;;;125803:19:0;;:::o;133156:432::-;133250:25;133277:30;133325:21;133349:8;133358:4;133349:14;;;;;;;;;;;;;;;;;;;;;133386:13;;;;133349:14;;-1:-1:-1;;;;;;133386:13:0;133378:36;133374:207;;133459:13;;;;;:27;;;-1:-1:-1;;;133459:27:0;;;;-1:-1:-1;;;;;133459:13:0;;;;:25;;:27;;;;;;;;;;;;:13;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;133431:56;;133521:48;133528:4;:13;;;;;;;;;;-1:-1:-1;;;;;133528:13:0;-1:-1:-1;;;;;133528:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;133521:46:0;;:48::i;:::-;133502:67;;133374:207;133156:432;;;;:::o;126037:24::-;;;;:::o;125850:22::-;;;-1:-1:-1;;;;;125850:22:0;;:::o;135323:1019::-;135389:21;135413:8;135422:4;135413:14;;;;;;;;;;;;;;;;135462;;;:8;:14;;;;;;135477:10;135462:26;;;;;;;135413:14;;;;;;;;-1:-1:-1;135499:16:0;135471:4;135499:10;:16::i;:::-;135530:11;;:15;135526:322;;135590:15;135608:123;135715:4;:15;;;135608:88;135691:4;135608:64;135652:4;:19;;;135608:4;:25;;;:43;;:64;;;;:::i;:123::-;135590:141;;135746:36;135762:10;135774:7;135746:15;:36::i;:::-;135822:4;135810:10;-1:-1:-1;;;;;135802:34:0;;135828:7;135802:34;;;;;;:::i;:::-;;;;;;;;135526:322;;135872:11;;:24;;135888:7;135872:15;:24::i;:::-;135858:38;;;135941:19;;;;135925:46;;135966:4;;135925:36;;135858:38;135925:15;:36::i;:46::-;135907:4;:15;;:64;;;;135984:18;136005:8;136014:4;136005:14;;;;;;;;;;;;;;;;:23;:14;;;;;:23;;-1:-1:-1;;;;;136005:23:0;;-1:-1:-1;136043:31:0;;136039:109;;136124:11;;136091:45;;-1:-1:-1;;;136091:45:0;;-1:-1:-1;;;;;136091:20:0;;;;;:45;;136112:10;;136091:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136039:109;136160:12;;:124;;-1:-1:-1;;;;;136160:12:0;136212:10;136246:4;136266:7;136160:29;:124::i;:::-;136320:4;136308:10;-1:-1:-1;;;;;136300:34:0;;136326:7;136300:34;;;;;;:::i;:::-;;;;;;;;135323:1019;;;;;:::o;126813:29::-;;;;:::o;34837:244::-;34114:12;:10;:12::i;:::-;-1:-1:-1;;;;;34103:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;34103:23:0;;34095:68;;;;-1:-1:-1;;;34095:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34926:22:0;::::1;34918:73;;;;-1:-1:-1::0;;;34918:73:0::1;;;;;;;:::i;:::-;35028:6;::::0;;35007:38:::1;::::0;-1:-1:-1;;;;;35007:38:0;;::::1;::::0;35028:6;::::1;::::0;35007:38:::1;::::0;::::1;35056:6;:17:::0;;-1:-1:-1;;;;;;35056:17:0::1;-1:-1:-1::0;;;;;35056:17:0;;;::::1;::::0;;;::::1;::::0;;34837:244::o;126123:25::-;;;;:::o;131473:1571::-;131589:18;131622:25;131662:30;131707:25;131760:21;131784:8;131793:4;131784:14;;;;;;;;;;;;;;;;131833;;;:8;:14;;;;;;-1:-1:-1;;;;;131833:21:0;;;;;;;;;;131890:19;131784:14;;;;;;;131890:19;;;;131939:12;;:37;;-1:-1:-1;;;131939:37:0;;131784:14;;-1:-1:-1;131833:21:0;;131890:19;;131784:14;;131939:12;;:22;;:37;;131970:4;;131939:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;131920:56;;132009:4;:24;;;131991:15;:42;:59;;;;-1:-1:-1;132037:13:0;;;131991:59;131987:611;;;132067:18;132088:45;132108:4;:24;;;132088:15;:19;;:45;;;;:::i;:::-;132067:66;;132148:17;132257:15;;132222;;132192:10;;132168:4;:34;:69;:104;132148:124;;132287:17;132307:162;132464:4;132307:138;132435:9;132307:109;132400:15;;132307:74;132365:4;:15;;;132307:39;132336:9;;132307:10;:28;;:39;;;;:::i;:162::-;132287:182;-1:-1:-1;132501:85:0;132538:33;132562:8;132538:19;132287:182;132552:4;132538:13;:19::i;:33::-;132501:14;;:18;:85::i;:::-;132484:102;;131987:611;;;;132621:86;132681:4;:15;;;132621:41;132657:4;132621:31;132637:14;132621:4;:11;;;:15;;:31;;;;:::i;:86::-;132811:13;;;;132608:99;;-1:-1:-1;;;;;;132811:13:0;132803:36;132799:238;;132896:60;132937:4;132896:22;:60::i;:::-;132991:13;;;;;:34;;-1:-1:-1;;;132991:34:0;;132856:100;;-1:-1:-1;132856:100:0;;-1:-1:-1;;;;;;132991:13:0;;;;:27;;:34;;133019:5;;132991:34;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;132971:54;;132799:238;131473:1571;;;;;;;;;;;:::o;32420:106::-;32508:10;32420:106;:::o;6516:220::-;6574:7;6598:6;6594:20;;-1:-1:-1;6613:1:0;6606:8;;6594:20;6637:5;;;6641:1;6637;:5;:1;6661:5;;;;;:10;6653:56;;;;-1:-1:-1;;;6653:56:0;;;;;;;:::i;:::-;6727:1;-1:-1:-1;6516:220:0;;;;;:::o;7214:153::-;7272:7;7304:1;7300;:5;7292:44;;;;-1:-1:-1;;;7292:44:0;;;;;;;:::i;:::-;7358:1;7354;:5;;;;;;;7214:153;-1:-1:-1;;;7214:153:0:o;6099:158::-;6157:7;6190:1;6185;:6;;6177:49;;;;-1:-1:-1;;;6177:49:0;;;;;;;:::i;:::-;-1:-1:-1;6244:5:0;;;6099:158::o;137864:271::-;137956:3;;:28;;-1:-1:-1;;;137956:28:0;;137939:14;;-1:-1:-1;;;;;137956:3:0;;:13;;:28;;137978:4;;137956:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;137939:45;;138009:6;137999:7;:16;137995:133;;;138032:3;;:25;;-1:-1:-1;;;138032:25:0;;-1:-1:-1;;;;;138032:3:0;;;;:12;;:25;;138045:3;;138050:6;;138032:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;137995:133;;;138090:3;;:26;;-1:-1:-1;;;138090:26:0;;-1:-1:-1;;;;;138090:3:0;;;;:12;;:26;;138103:3;;138108:7;;138090:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;137995:133;137864:271;;;:::o;58551:401::-;58670:12;58684:17;58713:5;-1:-1:-1;;;;;58705:19:0;56064:10;58762:12;;58776:2;58780:6;58739:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58739:48:0;;;;;;;;;;;;;;-1:-1:-1;;;;;58739:48:0;-1:-1:-1;;;;;;58739:48:0;;;;;;;;;;58705:93;;;;58739:48;58705:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58669:129;;;;58831:7;:57;;;;-1:-1:-1;58843:11:0;;:16;;:44;;;58874:4;58863:24;;;;;;;;;;;;:::i;:::-;58809:135;;;;-1:-1:-1;;;58809:135:0;;;;;;;:::i;:::-;58551:401;;;;;:::o;5637:179::-;5695:7;5727:5;;;5751:6;;;;5743:46;;;;-1:-1:-1;;;5743:46:0;;;;;;;:::i;11076:422::-;11443:20;;11482:8;;11076:422;;;;:::o;29300:167::-;29380:4;29404:55;29414:3;-1:-1:-1;;;;;29434:23:0;;29404:9;:55::i;28728:152::-;28798:4;28822:50;28827:3;-1:-1:-1;;;;;28847:23:0;;28822:4;:50::i;57039:272::-;57198:34;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57198:34:0;-1:-1:-1;;;57198:34:0;;;57158:85;;57096:13;;57123:12;;57096:13;;-1:-1:-1;;;;;57158:25:0;;;:85;;57198:34;57158:85;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57122:121;;;;57261:7;:42;;;;;;;;;;;;;;;-1:-1:-1;;;57261:42:0;;;;;;57271:24;57290:4;57271:18;:24::i;:::-;57254:49;57039:272;-1:-1:-1;;;;57039:272:0:o;59275:443::-;59421:12;59435:17;59464:5;-1:-1:-1;;;;;59456:19:0;56154:10;59513:17;;59532:4;59538:2;59542:6;59490:59;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59490:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;59490:59:0;-1:-1:-1;;;;;;59490:59:0;;;;;;;;;;59456:104;;;;59490:59;59456:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59420:140;;;;59593:7;:57;;;;-1:-1:-1;59605:11:0;;:16;;:44;;;59636:4;59625:24;;;;;;;;;;;;:::i;:::-;59571:139;;;;-1:-1:-1;;;59571:139:0;;;;;;;:::i;:::-;59275:443;;;;;;:::o;26012:129::-;26085:4;26109:19;;;:12;;;;;:19;;;;;;:24;;;26012:129::o;23792:414::-;23855:4;23877:21;23887:3;23892:5;23877:9;:21::i;:::-;23872:327;;-1:-1:-1;23915:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;24098:18;;24076:19;;;:12;;;:19;;;;;;:40;;;;24131:11;;23872:327;-1:-1:-1;24182:5:0;24175:12;;56214:619;56311:13;56361:2;56346:4;:11;:17;56342:484;;56398:4;56387:26;;;;;;;;;;;;:::i;:::-;56380:33;;;;56342:484;56435:4;:11;56450:2;56435:17;56431:395;;;56469:7;56495:69;56506:2;56502:1;:6;;;:22;;;;;56512:4;56517:1;56512:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;56512:7:0;:12;;56502:22;56495:69;;;56545:3;;56495:69;;;56578:23;56614:1;56604:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56604:12:0;;56578:38;;56640:1;56636:5;;56631:99;56647:2;56643:1;:6;;;:22;;;;;56653:4;56658:1;56653:7;;;;;;;;;;;;;;-1:-1:-1;;;;;;56653:7:0;:12;;56643:22;56631:99;;;56707:4;56712:1;56707:7;;;;;;;;;;;;;;;;;;56691:10;56702:1;56691:13;;;;;;;;;;;;;:23;-1:-1:-1;;;;;56691:23:0;;;;;;;;-1:-1:-1;56667:3:0;;;;;56631:99;;;56758:10;-1:-1:-1;56744:25:0;;-1:-1:-1;56744:25:0;56431:395;-1:-1:-1;56802:12:0;;;;;;;;;;;;-1:-1:-1;;;56802:12:0;;;;;;1618:241:-1;;1722:2;1710:9;1701:7;1697:23;1693:32;1690:2;;;-1:-1;;1728:12;1690:2;85:6;72:20;97:33;124:5;97:33;:::i;1866:263::-;;1981:2;1969:9;1960:7;1956:23;1952:32;1949:2;;;-1:-1;;1987:12;1949:2;226:6;220:13;238:33;265:5;238:33;:::i;2136:257::-;;2248:2;2236:9;2227:7;2223:23;2219:32;2216:2;;;-1:-1;;2254:12;2216:2;495:6;489:13;507:30;531:5;507:30;:::i;2400:362::-;;2525:2;2513:9;2504:7;2500:23;2496:32;2493:2;;;-1:-1;;2531:12;2493:2;2582:17;2576:24;2620:18;;2612:6;2609:30;2606:2;;;-1:-1;;2642:12;2606:2;2729:6;2718:9;2714:22;;;1001:3;994:4;986:6;982:17;978:27;968:2;;-1:-1;;1009:12;968:2;1049:6;1043:13;2620:18;29646:6;29643:30;29640:2;;;-1:-1;;29676:12;29640:2;29309;29303:9;29749;29730:17;;-1:-1;;29726:33;29335:17;;2525:2;29335:17;29395:34;;;29431:22;;;29392:62;29389:2;;;-1:-1;;29457:12;29389:2;29309;29476:22;1142:21;;;1242:16;;;2525:2;1242:16;1239:25;-1:-1;1236:2;;;-1:-1;;1267:12;1236:2;1287:39;1319:6;2525:2;1218:5;1214:16;2525:2;1184:6;1180:17;1287:39;:::i;:::-;2662:84;2487:275;-1:-1;;;;;;2487:275::o;2769:241::-;;2873:2;2861:9;2852:7;2848:23;2844:32;2841:2;;;-1:-1;;2879:12;2841:2;-1:-1;1407:20;;2835:175;-1:-1;2835:175::o;3017:263::-;;3132:2;3120:9;3111:7;3107:23;3103:32;3100:2;;;-1:-1;;3138:12;3100:2;-1:-1;1555:13;;3094:186;-1:-1;3094:186::o;3287:366::-;;;3408:2;3396:9;3387:7;3383:23;3379:32;3376:2;;;-1:-1;;3414:12;3376:2;1420:6;1407:20;3466:63;;3566:2;3609:9;3605:22;72:20;97:33;124:5;97:33;:::i;:::-;3574:63;;;;3370:283;;;;;:::o;3660:555::-;;;;3830:2;3818:9;3809:7;3805:23;3801:32;3798:2;;;-1:-1;;3836:12;3798:2;1420:6;1407:20;3888:63;;3988:2;4044:9;4040:22;629:20;654:46;694:5;654:46;:::i;:::-;3996:76;-1:-1;4109:2;4167:22;;798:20;823:52;798:20;823:52;:::i;:::-;4117:82;;;;3792:423;;;;;:::o;4222:366::-;;;4343:2;4331:9;4322:7;4318:23;4314:32;4311:2;;;-1:-1;;4349:12;4311:2;-1:-1;;1407:20;;;4501:2;4540:22;;;1407:20;;-1:-1;4305:283::o;4595:649::-;;;;;4766:3;4754:9;4745:7;4741:23;4737:33;4734:2;;;-1:-1;;4773:12;4734:2;1420:6;1407:20;4825:63;;4925:2;4968:9;4964:22;1407:20;4933:63;;5033:2;5095:9;5091:22;798:20;823:52;869:5;823:52;:::i;:::-;5041:82;-1:-1;5160:2;5196:22;;347:20;372:30;347:20;372:30;:::i;:::-;4728:516;;;;-1:-1;4728:516;;-1:-1;;4728:516::o;6491:347::-;;6636:5;29926:12;30365:6;30360:3;30353:19;6730:52;6775:6;30402:4;30397:3;30393:14;30402:4;6756:5;6752:16;6730:52;:::i;:::-;29749:9;32646:14;-1:-1;;32642:28;6794:39;;;;30402:4;6794:39;;6583:255;-1:-1;;6583:255::o;14858:271::-;;5791:5;29926:12;5902:52;5947:6;5942:3;5935:4;5928:5;5924:16;5902:52;:::i;:::-;5966:16;;;;;14992:137;-1:-1;;14992:137::o;15136:222::-;-1:-1;;;;;30901:54;;;;5471:37;;15263:2;15248:18;;15234:124::o;15365:349::-;-1:-1;;;;;30901:54;;;;5330:58;;15700:2;15685:18;;14809:37;15528:2;15513:18;;15499:215::o;15721:444::-;-1:-1;;;;;30901:54;;;5471:37;;30901:54;;;;16068:2;16053:18;;5471:37;16151:2;16136:18;;14809:37;;;;15904:2;15889:18;;15875:290::o;16172:421::-;-1:-1;;;;;30901:54;;5471:37;;16347:2;16465;16450:18;;16443:48;;;16172:421;;16505:78;;16332:18;;16569:6;16505:78;:::i;16940:732::-;-1:-1;;;;;30901:54;;;6078:63;;17389:2;17374:18;;14809:37;;;;17472:2;17457:18;;14809:37;;;;17555:2;17540:18;;14809:37;30901:54;;;17657:3;17642:19;;6078:63;17211:3;17196:19;;17182:490::o;17942:416::-;18142:2;18156:47;;;7070:2;18127:18;;;30353:19;7106:34;30393:14;;;7086:55;-1:-1;;;7161:12;;;7154:34;7207:12;;;18113:245::o;18365:416::-;18565:2;18579:47;;;7458:2;18550:18;;;30353:19;7494:30;30393:14;;;7474:51;7544:12;;;18536:245::o;18788:416::-;18988:2;19002:47;;;7795:2;18973:18;;;30353:19;7831:34;30393:14;;;7811:55;-1:-1;;;7886:12;;;7879:34;7932:12;;;18959:245::o;19211:416::-;19411:2;19425:47;;;8183:2;19396:18;;;30353:19;8219:34;30393:14;;;8199:55;-1:-1;;;8274:12;;;8267:30;8316:12;;;19382:245::o;19634:416::-;19834:2;19848:47;;;8567:2;19819:18;;;30353:19;8603:29;30393:14;;;8583:50;8652:12;;;19805:245::o;20057:416::-;20257:2;20271:47;;;8903:2;20242:18;;;30353:19;8939:34;30393:14;;;8919:55;-1:-1;;;8994:12;;;8987:33;9039:12;;;20228:245::o;20480:416::-;20680:2;20694:47;;;9290:2;20665:18;;;30353:19;9326:32;30393:14;;;9306:53;9378:12;;;20651:245::o;20903:416::-;21103:2;21117:47;;;9629:2;21088:18;;;30353:19;9665:28;30393:14;;;9645:49;9713:12;;;21074:245::o;21326:416::-;21526:2;21540:47;;;9964:1;21511:18;;;30353:19;-1:-1;;;30393:14;;;9979:32;10030:12;;;21497:245::o;21749:416::-;21949:2;21963:47;;;10281:2;21934:18;;;30353:19;10317:34;30393:14;;;10297:55;-1:-1;;;10372:12;;;10365:25;10409:12;;;21920:245::o;22172:416::-;22372:2;22386:47;;;10660:2;22357:18;;;30353:19;-1:-1;;;30393:14;;;10676:44;10739:12;;;22343:245::o;22595:416::-;22795:2;22809:47;;;22780:18;;;30353:19;11026:34;30393:14;;;11006:55;11080:12;;;22766:245::o;23018:416::-;23218:2;23232:47;;;11331:2;23203:18;;;30353:19;-1:-1;;;30393:14;;;11347:44;11410:12;;;23189:245::o;23441:416::-;23641:2;23655:47;;;11661:2;23626:18;;;30353:19;11697:34;30393:14;;;11677:55;-1:-1;;;11752:12;;;11745:29;11793:12;;;23612:245::o;23864:416::-;24064:2;24078:47;;;12044:2;24049:18;;;30353:19;12080:34;30393:14;;;12060:55;-1:-1;;;12135:12;;;12128:33;12180:12;;;24035:245::o;24287:416::-;24487:2;24501:47;;;12431:2;24472:18;;;30353:19;12467:34;30393:14;;;12447:55;-1:-1;;;12522:12;;;12515:30;12564:12;;;24458:245::o;24710:416::-;24910:2;24924:47;;;12815:2;24895:18;;;30353:19;-1:-1;;;30393:14;;;12831:44;12894:12;;;24881:245::o;25133:416::-;25333:2;25347:47;;;13145:2;25318:18;;;30353:19;-1:-1;;;30393:14;;;13161:41;13221:12;;;25304:245::o;25556:416::-;25756:2;25770:47;;;13472:2;25741:18;;;30353:19;13508:34;30393:14;;;13488:55;-1:-1;;;13563:12;;;13556:30;13605:12;;;25727:245::o;25979:416::-;26179:2;26193:47;;;13856:2;26164:18;;;30353:19;13892:34;30393:14;;;13872:55;-1:-1;;;13947:12;;;13940:30;13989:12;;;26150:245::o;26402:416::-;26602:2;26616:47;;;26587:18;;;30353:19;14276:34;30393:14;;;14256:55;14330:12;;;26573:245::o;26825:416::-;27025:2;27039:47;;;14581:2;27010:18;;;30353:19;14617:34;30393:14;;;14597:55;-1:-1;;;14672:12;;;14665:28;14712:12;;;26996:245::o;27248:222::-;14809:37;;;27375:2;27360:18;;27346:124::o;27477:644::-;14809:37;;;-1:-1;;;;;30901:54;;27873:2;27858:18;;5471:37;27708:3;27910:2;27895:18;;27888:48;;;27477:644;;27950:78;;27693:19;;28014:6;27950:78;:::i;:::-;27942:86;;14839:5;28107:2;28096:9;28092:18;14809:37;27679:442;;;;;;;:::o;28128:321::-;14809:37;;;30585:13;30578:21;28435:2;28420:18;;5585:34;28277:2;28262:18;;28248:201::o;28456:333::-;14809:37;;;28775:2;28760:18;;14809:37;28611:2;28596:18;;28582:207::o;28796:444::-;14809:37;;;29143:2;29128:18;;14809:37;;;;29226:2;29211:18;;14809:37;28979:2;28964:18;;28950:290::o;32302:268::-;32367:1;32374:101;32388:6;32385:1;32382:13;32374:101;;;32455:11;;;32449:18;32436:11;;;32429:39;32410:2;32403:10;32374:101;;;32490:6;32487:1;32484:13;32481:2;;;-1:-1;;32367:1;32537:16;;32530:27;32351:219::o;32683:117::-;-1:-1;;;;;30901:54;;32742:35;;32732:2;;32791:1;;32781:12;32807:111;32888:5;30585:13;30578:21;32866:5;32863:32;32853:2;;32909:1;;32899:12
Swarm Source
ipfs://cf62cc73bc314ba8dbae48f1cc860129f15a7196f5321cdecd0688817b22385a
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.