# FeeController

[Git Source](https://github.com/EntreDevelopers-Lab-Inc/Mezz-Companies/blob/f7a3e84e3dd5bb33c4bd7f77283983f9e8ba20b2/src/FeeController.sol)

**Inherits:** Initializable, ERC165Upgradeable, HubOwnableUUPSUpgradeable, IFeeController

**Author:** Daniel Yamagata & Naveen Ailawadi

A contract to set and manage fees for the Mezzanine Protocol

*All fees are denominated in 100\_000 as 100%. For example, a fee of 1\_000 is equivalent to 1% All fees in Mezzanine are transferred to the fee controller, which then can be collected by the owner of the Mezz Hub. All implementations that charge a fee are responsible for transferring the fees to the fee controller.*

## State Variables

### MAX\_IMPLEMENTATION\_FEE

```solidity
uint256 public constant MAX_IMPLEMENTATION_FEE = Constants.MAX_IMPLEMENTATION_FEE;
```

### FeeControllerStorageLocation

```solidity
bytes32 private constant FeeControllerStorageLocation =
    0x9980cbcd1eea9936b8d3caaf89dd2ea96db52917f1123c39e72b02e9cb513100;
```

## Functions

### \_getFeeControllerStorage

```solidity
function _getFeeControllerStorage() internal pure returns (FeeControllerStorage storage $);
```

### constructor

```solidity
constructor(address _mezzHub) HubOwnableUUPSUpgradeable(_mezzHub);
```

### setImplementationFee

Sets the fee of the 'implementation' to 'newFee'. Only callable by the 'owner' of the MezzHub

```solidity
function setImplementationFee(address implementation, uint256 newFee) external virtual onlyHubOwner;
```

### collectFees

Transfers 'amount' of 'asset' to the owner of the Mezz Hub

```solidity
function collectFees(address asset, uint256 amount) external virtual onlyHubOwner;
```

### calculateFee

Returns the fee for 'amount' based on the 'asset' and 'implementation' Returns zero if 'asset' is not a denomination asset or the implementation does not have a fee

```solidity
function calculateFee(address asset, uint256 amount, address implementation) public view virtual returns (uint256);
```

### getFeeByImplementation

Returns the fee for 'implementation'. Returns zero if there is no fee

```solidity
function getFeeByImplementation(address implementation) public view returns (uint256);
```

### supportsInterface

*ERC165 support*

```solidity
function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165Upgradeable, IERC165)
    returns (bool);
```

## Structs

### FeeControllerStorage

```solidity
struct FeeControllerStorage {
    mapping(address => uint256) _feeByImplementation;
}
```
