// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import { OrderStatus } from "./ConsiderationStructs.sol"; import { Assertions } from "./Assertions.sol"; import { SignatureVerification } from "./SignatureVerification.sol"; /** * @title Verifiers * @author 0age * @notice Verifiers contains functions for performing verifications. */ contract Verifiers is Assertions, SignatureVerification { /** * @dev Derive and set hashes, reference chainId, and associated domain * separator during deployment. * * @param conduitController A contract that deploys conduits, or proxies * that may optionally be used to transfer approved * ERC20/721/1155 tokens. */ constructor(address conduitController) Assertions(conduitController) {} /** * @dev Internal view function to ensure that the current time falls within * an order's valid timespan. * * @param startTime The time at which the order becomes active. * @param endTime The time at which the order becomes inactive. * @param revertOnInvalid A boolean indicating whether to revert if the * order is not active. * * @return valid A boolean indicating whether the order is active. */ function _verifyTime( uint256 startTime, uint256 endTime, bool revertOnInvalid ) internal view returns (bool valid) { // Revert if order's timespan hasn't started yet or has already ended. if (startTime > block.timestamp || endTime <= block.timestamp) { // Only revert if revertOnInvalid has been supplied as true. if (revertOnInvalid) { revert InvalidTime(); } // Return false as the order is invalid. return false; } // Return true as the order time is valid. valid = true; } /** * @dev Internal view function to verify the signature of an order. An * ERC-1271 fallback will be attempted if either the signature length * is not 64 or 65 bytes or if the recovered signer does not match the * supplied offerer. Note that in cases where a 64 or 65 byte signature * is supplied, only standard ECDSA signatures that recover to a * non-zero address are supported. * * @param offerer The offerer for the order. * @param orderHash The order hash. * @param signature A signature from the offerer indicating that the order * has been approved. */ function _verifySignature( address offerer, bytes32 orderHash, bytes memory signature ) internal view { // Skip signature verification if the offerer is the caller. if (offerer == msg.sender) { return; } // Derive EIP-712 digest using the domain separator and the order hash. bytes32 digest = _deriveEIP712Digest(_domainSeparator(), orderHash); // Ensure that the signature for the digest is valid for the offerer. _assertValidSignature(offerer, digest, signature); } function _verifyOrderStatus( bytes32 orderHash, OrderStatus storage orderStatus, bool firstPay, bool revertOnInvalid ) internal view returns (bool valid) { if (orderStatus.isCancelled) { if (revertOnInvalid) { revert OrderIsCancelled(orderHash); } return false; } if (orderStatus.isFinalized) { if (revertOnInvalid) { revert OrderAlreadyFinalized(orderHash); } return false; } if (firstPay) { if (orderStatus.paidTimes > 0) { if (revertOnInvalid) { revert OrderAlreadyStarted(orderHash); } return false; } } else { if (orderStatus.paidTimes == 0) { if (revertOnInvalid) { revert OrderNotStarted(orderHash); } return false; } } valid = true; } }