> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mellow.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Queue

### Overview

The `Queue` contract provides a shared foundation for **time-gated asset processing** in systems like `DepositQueue` and `RedeemQueue`. It tracks user requests via timestamped checkpoints and processes them using oracle-based pricing.

This abstract module is **not directly deployable** but is designed to be extended by concrete implementations, which define the behavior of `_handleReport` and allowed user actions (deposit / redeem functions).

### Purpose

* Serves as a **modular base** for deposit/redeem queues
* Enforces **Vault request processing initially triggered by Oracle**
* Stores **timestamped user action traces** via `Checkpoints.Trace224`
* Ensures **vault-controlled access** and proper **report validation**

### Derived contracts

* `DepositQueue`: handles queued deposits after a delay
* `RedeemQueue`: handles redemption requests similarly

### Use Cases

* Prevents manipulation by requiring **delayed processing** relative to price updates

### Storage Structure

```solidity theme={null}
struct QueueStorage {
  address asset;              // Token/ETH managed by this queue
  address vault;              // Vault that owns this queue
  Checkpoints.Trace224 timestamps; // Timeline of requests
}
```

* **asset**: token used for this queue (ERC20 or native ETH)
* **vault**: only this address can call `handleReport(...)`
* **timestamps**: request history used in the implementations

### Initialization

```solidity theme={null}
function __Queue_init(address asset_, address vault_) internal
```

* Must be called by child contracts
* Initializes asset, vault, and creates a starting checkpoint

### Oracle Integration

```solidity theme={null}
function handleReport(uint224 priceD18, uint32 timestamp) external
```

* Called by the vault when an oracle report is available
* Verifies:
  * Caller is the `vault`
  * Price is non-zero
  * Timestamp is in the past (timestamp \< block.timestamp)
* Internally delegates to `_handleReport(...)` (must be implemented by child)

### Abstract Hook

```solidity theme={null}
function _handleReport(uint224 priceD18, uint32 timestamp) internal virtual
```

Must be implemented by child classes to:

* Read and process requests from `_timestamps()`
* Apply pricing logic to convert shares↔assets
* Mint/burn shares, transfer tokens, etc.

### View Functions

| Function         | Description                                        |
| ---------------- | -------------------------------------------------- |
| `vault()`        | Returns the controlling vault address              |
| `asset()`        | Returns the ERC20/native token used by the queue   |
| `canBeRemoved()` | Not implemented in `Queue` (optional for children) |

### Internal Helpers

| Function            | Description                                           |
| ------------------- | ----------------------------------------------------- |
| `_timestamps()`     | Returns the internal `Checkpoints.Trace224` structure |
| `_queueStorage()`   | Loads queue storage using custom storage slot         |
| `_queueStorageSlot` | Computed using SlotLibrary to prevent conflicts       |

### Events

```solidity theme={null}
event ReportHandled(uint224 priceD18, uint32 timestamp)
```

* Emitted when `handleReport()` completes
* Signals that all eligible requests up to `timestamp` were processed

### Errors

| Error             | Reason                                               |
| ----------------- | ---------------------------------------------------- |
| `ZeroValue()`     | Called with `0` address or value                     |
| `Forbidden()`     | Caller not authorized (e.g., not the vault)          |
| `InvalidReport()` | Oracle report is zero-priced or timestamp is invalid |
| `QueuePaused()`   | Reserved for future ACL/pause integration            |
