# FreeFee

## Contents

## Globals

| Var             | Type                                          |
| --------------- | --------------------------------------------- |
| userUsage       | mapping(address => struct IFreeFee.UsageInfo) |
| totalUsage      | uint256                                       |
| globalTimestamp | uint256                                       |

## Functions

### constructor

No description

**Declaration:**

```solidity
  function constructor(
  ) public Only
```

**Modifiers:**

| Modifier |
| -------- |
| Only     |

### estimateTotalLeft

Estimate total daily free fee left.

**Declaration:**

```solidity
  function estimateTotalLeft(
    uint256 timestamp
  ) public returns (uint256 totalLeft)
```

**Modifiers:** No modifiers

**Args:**

| Arg         | Type    | Description       |
| ----------- | ------- | ----------------- |
| `timestamp` | uint256 | Current timestamp |

### estimateUsage

Estimate user daily free fee usage.

**Declaration:**

```solidity
  function estimateUsage(
    struct IFreeFee.UsageInfo ui,
    uint256 timestamp
  ) public returns (uint256)
```

**Modifiers:** No modifiers

**Args:**

| Arg         | Type                      | Description            |
| ----------- | ------------------------- | ---------------------- |
| `ui`        | struct IFreeFee.UsageInfo | User usage information |
| `timestamp` | uint256                   | Current timestamp      |

### estimateFreeFee

Estimate user daily free fee left.

**Declaration:**

```solidity
  function estimateFreeFee(
    address user,
    uint256 timestamp
  ) external returns (uint256)
```

**Modifiers:** No modifiers

**Args:**

| Arg         | Type    | Description       |
| ----------- | ------- | ----------------- |
| `user`      | address | User address      |
| `timestamp` | uint256 | Current timestamp |

### consume

Consume user usage, it only can be called by router.

**Declaration:**

```solidity
  function consume(
    address user,
    uint256 usage
  ) external nonReentrant onlyRouter
```

**Modifiers:**

| Modifier     |
| ------------ |
| nonReentrant |
| onlyRouter   |

**Args:**

| Arg     | Type    | Description        |
| ------- | ------- | ------------------ |
| `user`  | address | Transaction sender |
| `usage` | uint256 | Usage amount       |

### onAfterBlock

After block callback, it only can be called by router, it will update `globalTimestamp` if the time interval exceeds `freeFeeRecoverInterval`.

**Declaration:**

```solidity
  function onAfterBlock(
  ) external nonReentrant onlyRouter
```

**Modifiers:**

| Modifier     |
| ------------ |
| nonReentrant |
| onlyRouter   |
