// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "../../contract-registry/IContractEntity.sol"; interface IListingStrategyRegistry is IContractEntity { /** * @dev Thrown when the listing strategy is not registered or deprecated. * @param listingStrategyId Unsupported listing strategy ID. */ error UnsupportedListingStrategy(bytes4 listingStrategyId); /** * @dev Thrown when listing controller does not implement the required interface. */ error InvalidListingControllerInterface(); /** * @dev Thrown when the listing cannot be processed by the specific controller due to the listing strategy ID * mismatch. * @param provided Provided listing strategy ID. * @param required Required listing strategy ID. */ error ListingStrategyMismatch(bytes4 provided, bytes4 required); /** * @dev Thrown upon attempting to register a listing strategy twice. * @param listingStrategyId Duplicate listing strategy ID. */ error ListingStrategyIsAlreadyRegistered(bytes4 listingStrategyId); /** * @dev Thrown upon attempting to work with unregistered listing strategy. * @param listingStrategyId Listing strategy ID. */ error UnregisteredListingStrategy(bytes4 listingStrategyId); /** * @dev Emitted when the new listing strategy is registered. * @param listingStrategyId Listing strategy ID. * @param listingTaxStrategyId Taxation strategy ID. * @param controller Controller address. */ event ListingStrategyRegistered( bytes4 indexed listingStrategyId, bytes4 indexed listingTaxStrategyId, address indexed controller ); /** * @dev Emitted when the listing strategy controller is changed. * @param listingStrategyId Listing strategy ID. * @param newController Controller address. */ event ListingStrategyControllerChanged(bytes4 indexed listingStrategyId, address indexed newController); /** * @dev Listing strategy information. * @param controller Listing controller address. */ struct ListingStrategyConfig { address controller; bytes4 taxStrategyId; } /** * @dev Registers new listing strategy. * @param listingStrategyId Listing strategy ID. * @param config Listing strategy configuration. */ function registerListingStrategy(bytes4 listingStrategyId, ListingStrategyConfig calldata config) external; /** * @dev Sets listing strategy controller. * @param listingStrategyId Listing strategy ID. * @param controller Listing controller address. */ function setListingController(bytes4 listingStrategyId, address controller) external; /** * @dev Returns listing strategy controller. * @param listingStrategyId Listing strategy ID. * @return Listing controller address. */ function listingController(bytes4 listingStrategyId) external view returns (address); /** * @dev Returns tax strategy ID for listing strategy. * @param listingStrategyId Listing strategy ID. * @return Tax strategy ID. */ function listingTaxId(bytes4 listingStrategyId) external view returns (bytes4); /** * @dev Returns listing strategy configuration. * @param listingStrategyId Listing strategy ID. * @return Listing strategy information. */ function listingStrategy(bytes4 listingStrategyId) external view returns (ListingStrategyConfig memory); /** * @dev Returns tax strategy controller for listing strategy. * @param listingStrategyId Listing strategy ID. * @return Tax strategy controller address. */ function listingTaxController(bytes4 listingStrategyId) external view returns (address); /** * @dev Checks listing strategy registration. * @param listingStrategyId Listing strategy ID. */ function isRegisteredListingStrategy(bytes4 listingStrategyId) external view returns (bool); /** * @dev Reverts if listing strategy is not registered. * @param listingStrategyId Listing strategy ID. */ function checkRegisteredListingStrategy(bytes4 listingStrategyId) external view; }