# IMultiDepositorVault

Interface for vaults that can accept deposits from multiple addresses

## Functions

### setBeforeTransferHook

Set the before transfer hooks

```solidity
function setBeforeTransferHook(IBeforeTransferHook hooks) external;
```

**Parameters**

| Name    | Type                  | Description                       |
| ------- | --------------------- | --------------------------------- |
| `hooks` | `IBeforeTransferHook` | The before transfer hooks address |

### enter

Deposit tokens into the vault and mint units

```solidity
function enter(address sender, IERC20 token, uint256 tokenAmount, uint256 unitsAmount, address recipient) external;
```

**Parameters**

| Name          | Type      | Description                    |
| ------------- | --------- | ------------------------------ |
| `sender`      | `address` | The sender of the tokens       |
| `token`       | `IERC20`  | The token to deposit           |
| `tokenAmount` | `uint256` | The amount of token to deposit |
| `unitsAmount` | `uint256` | The amount of units to mint    |
| `recipient`   | `address` | The recipient of the units     |

### exit

Withdraw tokens from the vault and burn units

```solidity
function exit(address sender, IERC20 token, uint256 tokenAmount, uint256 unitsAmount, address recipient) external;
```

**Parameters**

| Name          | Type      | Description                     |
| ------------- | --------- | ------------------------------- |
| `sender`      | `address` | The sender of the units         |
| `token`       | `IERC20`  | The token to withdraw           |
| `tokenAmount` | `uint256` | The amount of token to withdraw |
| `unitsAmount` | `uint256` | The amount of units to burn     |
| `recipient`   | `address` | The recipient of the tokens     |

## Events

### BeforeTransferHookSet

Emitted when the before transfer hook is updated

```solidity
event BeforeTransferHookSet(address indexed beforeTransferHook);
```

**Parameters**

| Name                 | Type      | Description                          |
| -------------------- | --------- | ------------------------------------ |
| `beforeTransferHook` | `address` | The new before transfer hook address |

### ProvisionerSet

Emitted when the provisioner is updated

```solidity
event ProvisionerSet(address indexed provisioner);
```

**Parameters**

| Name          | Type      | Description                 |
| ------------- | --------- | --------------------------- |
| `provisioner` | `address` | The new provisioner address |

### Enter

Emitted when tokens are deposited into the vault

```solidity
event Enter(
    address indexed sender, address indexed recipient, IERC20 indexed token, uint256 tokenAmount, uint256 unitsAmount
);
```

**Parameters**

| Name          | Type      | Description                           |
| ------------- | --------- | ------------------------------------- |
| `sender`      | `address` | The address initiating the deposit    |
| `recipient`   | `address` | The address receiving the vault units |
| `token`       | `IERC20`  | The token being deposited             |
| `tokenAmount` | `uint256` | The amount of tokens deposited        |
| `unitsAmount` | `uint256` | The amount of vault units minted      |

### Exit

Emitted when tokens are withdrawn from the vault

```solidity
event Exit(
    address indexed sender, address indexed recipient, IERC20 indexed token, uint256 tokenAmount, uint256 unitsAmount
);
```

**Parameters**

| Name          | Type      | Description                           |
| ------------- | --------- | ------------------------------------- |
| `sender`      | `address` | The address initiating the withdrawal |
| `recipient`   | `address` | The address receiving the tokens      |
| `token`       | `IERC20`  | The token being withdrawn             |
| `tokenAmount` | `uint256` | The amount of tokens withdrawn        |
| `unitsAmount` | `uint256` | The amount of vault units burned      |

## Errors

### Aera\_\_UnitsLocked

```solidity
error Aera__UnitsLocked();
```

### Aera\_\_ZeroAddressProvisioner

```solidity
error Aera__ZeroAddressProvisioner();
```

### Aera\_\_CallerIsNotProvisioner

```solidity
error Aera__CallerIsNotProvisioner();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aera.finance/the-protocol/core/imultidepositorvault.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
