contract BoringOwnable is BoringOwnableData {
	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	/// @notice `owner` defaults to msg.sender on construction.
	constructor() public {
		owner = msg.sender;
		emit OwnershipTransferred(address(0), msg.sender);
	}

	/// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
	/// Can only be invoked by the current `owner`.
	/// @param newOwner Address of the new owner.
	/// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
	/// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
	function transferOwnership(
		address newOwner,
		bool direct,
		bool renounce
	) public onlyOwner {
		if (direct) {
			// Checks
			require(newOwner != address(0) || renounce, "BoringOwnable::transferOwnership: zero address");

			// Effects
			emit OwnershipTransferred(owner, newOwner);
			owner = newOwner;
			pendingOwner = address(0);
		} else {
			// Effects
			pendingOwner = newOwner;
		}
	}

	/// @notice Needs to be called by `pendingOwner` to claim ownership.
	function claimOwnership() public {
		address _pendingOwner = pendingOwner;

		// Checks
		require(msg.sender == _pendingOwner, "BoringOwnable::claimOwnership: caller != pending owner");

		// Effects
		emit OwnershipTransferred(owner, _pendingOwner);
		owner = _pendingOwner;
		pendingOwner = address(0);
	}

	/// @notice Only allows the `owner` to execute the function.
	modifier onlyOwner() {
		require(msg.sender == owner, "BoringOwnable::onlyOwner: caller is not the owner");
		_;
	}
}
function claimOwnership() public {
	address _pendingOwner = pendingOwner;

	// Checks
	require(msg.sender == _pendingOwner, "BoringOwnable::claimOwnership: caller != pending owner");

	// Effects
	emit OwnershipTransferred(owner, _pendingOwner);
	owner = _pendingOwner;
	pendingOwner = address(0);
}

/// @notice Needs to be called by `pendingOwner` to claim ownership.