// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "./IFixedRateTaxController.sol"; import "../../../contract-registry/ContractEntity.sol"; import "../../../acl/direct/AccessControlledUpgradeable.sol"; import "../TaxController.sol"; import "../TaxStrategies.sol"; import "./FixedRateTaxControllerStorage.sol"; contract FixedRateTaxController is IFixedRateTaxController, UUPSUpgradeable, ContractEntity, AccessControlledUpgradeable, TaxController, FixedRateTaxControllerStorage { /** * @dev FixedRateListingTaxController initialization params. * @param acl ACL contract address. * @param metahub Metahub contract address. */ struct FixedRateTaxControllerInitParams { 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(FixedRateTaxControllerInitParams calldata params) external initializer { __UUPSUpgradeable_init(); _aclContract = IACL(params.acl); _metahub = IMetahub(params.metahub); } /** * @inheritdoc ITaxController */ function calculateRentalTax( ITaxTermsRegistry.Params calldata taxTermsParams, Rentings.Params calldata, uint256 taxableAmount ) external view returns ( uint256 universeBaseTax, uint256 protocolBaseTax, ITaxTermsRegistry.TaxTerms memory universeTaxTerms, ITaxTermsRegistry.TaxTerms memory protocolTaxTerms ) { // getting tax terms registry instance ITaxTermsRegistry taxTermsRegistry = ITaxTermsRegistry(_metahub.getContract(Contracts.TAX_TERMS_REGISTRY)); // reading universe tax terms universeTaxTerms = taxTermsRegistry.universeTaxTerms(taxTermsParams); // reading protocol tax terms protocolTaxTerms = taxTermsRegistry.protocolTaxTerms(taxTermsParams); // decoding params uint16 baseUniverseTaxRate = TaxStrategies.decodeFixedRateTaxStrategyParams(universeTaxTerms); // decoding params uint16 baseProtocolTaxRate = TaxStrategies.decodeFixedRateTaxStrategyParams(protocolTaxTerms); // calculating tax universeBaseTax = (taxableAmount * baseUniverseTaxRate) / HUNDRED_PERCENT; protocolBaseTax = (taxableAmount * baseProtocolTaxRate) / HUNDRED_PERCENT; } /** * @inheritdoc IContractEntity */ function contractKey() external pure override returns (bytes4) { return Contracts.FIXED_RATE_TAX_CONTROLLER; } /** * @inheritdoc IERC165 */ function supportsInterface(bytes4 interfaceId) public view override(TaxController, ContractEntity, IERC165) returns (bool) { return interfaceId == type(IFixedRateTaxController).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc ITaxController */ function strategyId() public pure override(TaxController, ITaxController) returns (bytes4) { return TaxStrategies.FIXED_RATE_TAX; } /** * @inheritdoc IFixedRateTaxController */ function decodeStrategyParams(ITaxTermsRegistry.TaxTerms memory terms) public pure returns (uint16 baseTaxRate) { return TaxStrategies.decodeFixedRateTaxStrategyParams(terms); } /** * @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; } }