// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./IFixedRateListingController.sol"; import "../../../contract-registry/ContractEntity.sol"; import "../../../contract-registry/Contracts.sol"; import "../../../acl/direct/AccessControlledUpgradeable.sol"; import "./FixedRateListingControllerStorage.sol"; import "../ListingController.sol"; import "../../listing-strategies/ListingStrategies.sol"; import "../../listing-strategy-registry/IListingStrategyRegistry.sol"; import "../../../tax/tax-strategies/ITaxController.sol"; contract FixedRateListingController is IFixedRateListingController, UUPSUpgradeable, ContractEntity, AccessControlledUpgradeable, ListingController, FixedRateListingControllerStorage { /** * @dev FixedRateListingController initialization params. * @param acl ACL contract address. * @param metahub Metahub contract address. */ struct FixedRateListingControllerInitParams { IACL acl; IMetahub metahub; } /** * @custom:oz-upgrades-unsafe-allow constructor */ constructor() initializer { // solhint-disable-previous-line no-empty-blocks } /** * @dev Contract initializer. * @param params Init params. */ function initialize(FixedRateListingControllerInitParams calldata params) external initializer { __UUPSUpgradeable_init(); _aclContract = IACL(params.acl); _metahub = IMetahub(params.metahub); } /** * @inheritdoc IListingController */ function calculateRentalFee( IListingTermsRegistry.Params calldata listingTermsParams, IListingTermsRegistry.ListingTerms calldata listingTerms, Rentings.Params calldata rentingParams ) external view returns ( uint256 totalFee, uint256 listerBaseFee, uint256 universeBaseFee, uint256 protocolBaseFee, ITaxTermsRegistry.TaxTerms memory universeTaxTerms, ITaxTermsRegistry.TaxTerms memory protocolTaxTerms ) { // decoding listing terms data uint256 baseRate = ListingStrategies.decodeFixedRateListingStrategyParams(listingTerms); listerBaseFee = rentingParams.rentalPeriod * baseRate; // compose tax terms IListingStrategyRegistry listingStrategyRegistry = IListingStrategyRegistry( _metahub.getContract(Contracts.LISTING_STRATEGY_REGISTRY) ); address taxControllerAddress = listingStrategyRegistry.listingTaxController(listingTerms.strategyId); bytes4 taxStrategyId = listingStrategyRegistry.listingTaxId(listingTerms.strategyId); ITaxTermsRegistry.Params memory taxTermsParams = ITaxTermsRegistry.Params({ taxStrategyId: taxStrategyId, universeId: listingTermsParams.universeId, warperAddress: listingTermsParams.warperAddress }); // tax calculation (universeBaseFee, protocolBaseFee, universeTaxTerms, protocolTaxTerms) = ITaxController(taxControllerAddress) .calculateRentalTax(taxTermsParams, rentingParams, listerBaseFee); totalFee = listerBaseFee + universeBaseFee + protocolBaseFee; } /** * @inheritdoc IFixedRateListingController */ function decodeStrategyParams(IListingTermsRegistry.ListingTerms memory terms) external pure returns (uint256 baseRate) { return ListingStrategies.decodeFixedRateListingStrategyParams(terms); } /** * @inheritdoc IContractEntity */ function contractKey() external pure override returns (bytes4) { return Contracts.FIXED_RATE_LISTING_CONTROLLER; } /** * @inheritdoc IERC165 */ function supportsInterface(bytes4 interfaceId) public view override(ContractEntity, ListingController, IERC165) returns (bool) { return interfaceId == type(IFixedRateListingController).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IListingController */ function strategyId() public pure override(ListingController, IListingController) returns (bytes4) { return ListingStrategies.FIXED_RATE; } /** * @inheritdoc UUPSUpgradeable */ function _authorizeUpgrade(address newImplementation) internal override onlyAdmin { // solhint-disable-previous-line no-empty-blocks } /** * @inheritdoc AccessControlledUpgradeable */ function _acl() internal view override returns (IACL) { return _aclContract; } }