// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "../listing-terms-registry/IListingTermsRegistry.sol"; library ListingStrategies { bytes4 public constant FIXED_RATE = bytes4(keccak256("FIXED_RATE")); bytes4 public constant FIXED_RATE_WITH_REWARD = bytes4(keccak256("FIXED_RATE_WITH_REWARD")); /** * @dev Thrown when the listing strategy ID does not match the required one. * @param provided Provided listing strategy ID. * @param required Required listing strategy ID. */ error ListingStrategyMismatch(bytes4 provided, bytes4 required); /** * @dev Modifier to check strategy compatibility. */ modifier compatibleStrategy(bytes4 checkedStrategyId, bytes4 expectedStrategyId) { if (checkedStrategyId != expectedStrategyId) revert ListingStrategyMismatch(checkedStrategyId, expectedStrategyId); _; } function getSupportedListingStrategyIDs() internal pure returns (bytes4[] memory supportedListingStrategyIDs) { bytes4[] memory supportedListingStrategies = new bytes4[](2); supportedListingStrategies[0] = FIXED_RATE; supportedListingStrategies[1] = FIXED_RATE_WITH_REWARD; return supportedListingStrategies; } function isValidListingStrategy(bytes4 listingStrategyId) internal pure returns (bool) { return listingStrategyId == FIXED_RATE || listingStrategyId == FIXED_RATE_WITH_REWARD; } function decodeFixedRateListingStrategyParams(IListingTermsRegistry.ListingTerms memory terms) internal pure compatibleStrategy(terms.strategyId, FIXED_RATE) returns (uint256 baseRate) { return abi.decode(terms.strategyData, (uint256)); } function decodeFixedRateWithRewardListingStrategyParams(IListingTermsRegistry.ListingTerms memory terms) internal pure compatibleStrategy(terms.strategyId, FIXED_RATE_WITH_REWARD) returns (uint256 baseRate, uint16 rewardPercentage) { return abi.decode(terms.strategyData, (uint256, uint16)); } }