//SPDX-License-Identifier: MIT
pragma solidity 0.8.18;

//@notice Minimal Seaport Interface used by NiftyApes Seller Financing Protocol
interface ISeaport {
    enum OrderType {
        // 0: no partial fills, anyone can execute
        // 1: partial fills supported, anyone can execute
        // 2: no partial fills, only offerer or zone can execute
        // 3: partial fills supported, only offerer or zone can execute

    enum ItemType {
        // 0: ETH on mainnet, MATIC on polygon, etc.
        // 1: ERC20 items (ERC777 and ERC20 analogues could also technically work)
        // 2: ERC721 items
        // 3: ERC1155 items
        // 4: ERC721 items where a number of tokenIds are supported
        // 5: ERC1155 items where a number of ids are supported

     * @dev An offer item has five components: an item type (ETH or other native
     *      tokens, ERC20, ERC721, and ERC1155, as well as criteria-based ERC721 and
     *      ERC1155), a token address, a dual-purpose "identifierOrCriteria"
     *      component that will either represent a tokenId or a merkle root
     *      depending on the item type, and a start and end amount that support
     *      increasing or decreasing amounts over the duration of the respective
     *      order.
    struct OfferItem {
        ItemType itemType;
        address token;
        uint256 identifierOrCriteria;
        uint256 startAmount;
        uint256 endAmount;

     * @dev A consideration item has the same five components as an offer item and
     *      an additional sixth component designating the required recipient of the
     *      item.
    struct ConsiderationItem {
        ItemType itemType;
        address token;
        uint256 identifierOrCriteria;
        uint256 startAmount;
        uint256 endAmount;
        address payable recipient;

     * @notice Retrieve the current counter for a given offerer.
     * @param offerer The offerer in question.
     * @return counter The current counter.
    function getCounter(address offerer) external view returns (uint256 counter);

     * @notice Retrieve the status of a given order by hash, including whether
     *         the order has been cancelled or validated and the fraction of the
     *         order that has been filled.
     * @param orderHash The order hash in question.
     * @return isValidated A boolean indicating whether the order in question
     *                     has been validated (i.e. previously approved or
     *                     partially filled).
     * @return isCancelled A boolean indicating whether the order in question
     *                     has been cancelled.
     * @return totalFilled The total portion of the order that has been filled
     *                     (i.e. the "numerator").
     * @return totalSize   The total size of the order that is either filled or
     *                     unfilled (i.e. the "denominator").
    function getOrderStatus(
        bytes32 orderHash
        returns (bool isValidated, bool isCancelled, uint256 totalFilled, uint256 totalSize);

     * @notice Retrieve the order hash for a given order.
     * @param order The components of the order.
     * @return orderHash The order hash.
    function getOrderHash(OrderComponents calldata order) external view returns (bytes32 orderHash);

     * @dev An order contains eleven components: an offerer, a zone (or account that
     *      can cancel the order or restrict who can fulfill the order depending on
     *      the type), the order type (specifying partial fill support as well as
     *      restricted order status), the start and end time, a hash that will be
     *      provided to the zone when validating restricted orders, a salt, a key
     *      corresponding to a given conduit, a counter, and an arbitrary number of
     *      offer items that can be spent along with consideration items that must
     *      be received by their respective recipient.
    struct OrderComponents {
        address offerer;
        address zone;
        OfferItem[] offer;
        ConsiderationItem[] consideration;
        OrderType orderType;
        uint256 startTime;
        uint256 endTime;
        bytes32 zoneHash;
        uint256 salt;
        bytes32 conduitKey;
        uint256 counter;

     * @dev The full set of order components, with the exception of the counter,
     *      must be supplied when fulfilling more sophisticated orders or groups of
     *      orders. The total number of original consideration items must also be
     *      supplied, as the caller may specify additional consideration items.
    struct OrderParameters {
        address offerer; // 0x00
        address zone; // 0x20
        OfferItem[] offer; // 0x40
        ConsiderationItem[] consideration; // 0x60
        OrderType orderType; // 0x80
        uint256 startTime; // 0xa0
        uint256 endTime; // 0xc0
        bytes32 zoneHash; // 0xe0
        uint256 salt; // 0x100
        bytes32 conduitKey; // 0x120
        uint256 totalOriginalConsiderationItems; // 0x140
        // offer.length                          // 0x160

     * @dev Orders require a signature in addition to the other order parameters.
    struct Order {
        OrderParameters parameters;
        bytes signature;

    function fulfillOrder(
        Order calldata order,
        bytes32 fulfillerConduitKey
    ) external payable returns (bool fulfilled);