# Smart Contract Reference

Full ABI reference for the v0.6.0 vault implementation, grouped by who can call each function. Inherited OpenZeppelin ERC20 functions (`balanceOf`, `totalSupply`, `approve`, `allowance`, `name`, `symbol`) are not repeated unless the vault overrides their behaviour. `transfer` and `transferFrom` are listed because v0.6.0 adds extra access checks on both sides.

## Jump to a role

* [Anyone (user-facing)](#anyone-user-facing) — deposit / redeem / sync flows, operators, views, ERC20 overrides.
* [Curator](#curator) — settlement, claim-on-behalf, sync mode, HWM, close.
* [Valuation Manager](#valuation-manager) — propose new total assets (gated by guardrails).
* [Security Council](#security-council) — emergency valuation, guardrails policy.
* [Access Manager](#access-manager-former-whitelist-manager) — whitelist / blacklist / external sanctions list.
* [Owner (Admin)](#owner-admin) — lifecycle, roles, access mode, fees, metadata.
* [Super Operator](#super-operator) — global operator that bypasses whitelist / blacklist.
* [GuardRailsManager](#guardrailsmanager-read) — compliance check used by the vault.
* [Silo](#silo-separate-contract) — pending-funds helper contract.

***

## Anyone (user-facing)

### Deposit flow (async)

#### requestDeposit

```solidity
function requestDeposit(
    uint256 assets,
    address controller,
    address owner
) public payable returns (uint256 requestId);
```

Submit assets to the pending silo, queued for the next settlement. Auto-claims any previously claimable amount for `controller`. The caller must be the `owner` or an approved operator of `owner`.

**Parameters:**

| Name         | Type      | Description                                                                                       |
| ------------ | --------- | ------------------------------------------------------------------------------------------------- |
| `assets`     | `uint256` | Amount of underlying assets to deposit.                                                           |
| `controller` | `address` | Address that will own the request and claim the resulting shares.                                 |
| `owner`      | `address` | Address whose assets are pulled. Must equal `msg.sender` or have approved the caller as operator. |

**Return values:**

| Name        | Type      | Description                     |
| ----------- | --------- | ------------------------------- |
| `requestId` | `uint256` | Epoch-based request identifier. |

***

#### requestDeposit (with referral)

```solidity
function requestDeposit(
    uint256 assets,
    address controller,
    address owner,
    address referral
) public payable returns (uint256 requestId);
```

Same as `requestDeposit` above, but emits a `Referral` event tagging `referral`.

**Parameters:**

| Name         | Type      | Description                                                       |
| ------------ | --------- | ----------------------------------------------------------------- |
| `assets`     | `uint256` | Amount of underlying assets to deposit.                           |
| `controller` | `address` | Address that will own the request and claim the resulting shares. |
| `owner`      | `address` | Address whose assets are pulled.                                  |
| `referral`   | `address` | Address logged as the referrer.                                   |

**Return values:**

| Name        | Type      | Description                     |
| ----------- | --------- | ------------------------------- |
| `requestId` | `uint256` | Epoch-based request identifier. |

***

#### cancelRequestDeposit

```solidity
function cancelRequestDeposit() external;
```

Pull pending assets back from the silo. Only valid in the same epoch as the request. Cancels the caller's own pending deposit.

***

#### cancelRequestDeposit (on behalf)

```solidity
function cancelRequestDeposit(address controller) external;
```

Cancel a pending deposit on behalf of another controller. The caller must be an operator or super operator of `controller`. *(Operator variant new in v0.6.0.)*

**Parameters:**

| Name         | Type      | Description                                          |
| ------------ | --------- | ---------------------------------------------------- |
| `controller` | `address` | Controller whose pending deposit is being cancelled. |

***

#### deposit

```solidity
function deposit(
    uint256 assets,
    address receiver
) public returns (uint256 shares);
```

Claim shares after settlement. Uses `msg.sender` as the request controller.

**Parameters:**

| Name       | Type      | Description                               |
| ---------- | --------- | ----------------------------------------- |
| `assets`   | `uint256` | Amount of assets to claim shares against. |
| `receiver` | `address` | Address receiving the shares.             |

**Return values:**

| Name     | Type      | Description                  |
| -------- | --------- | ---------------------------- |
| `shares` | `uint256` | Shares minted to `receiver`. |

***

#### deposit (with controller)

```solidity
function deposit(
    uint256 assets,
    address receiver,
    address controller
) external returns (uint256 shares);
```

Claim shares from a settled request owned by `controller`. The caller must be an operator or super operator of `controller`.

**Parameters:**

| Name         | Type      | Description                               |
| ------------ | --------- | ----------------------------------------- |
| `assets`     | `uint256` | Amount of assets to claim shares against. |
| `receiver`   | `address` | Address receiving the shares.             |
| `controller` | `address` | Controller that owns the deposit request. |

**Return values:**

| Name     | Type      | Description                  |
| -------- | --------- | ---------------------------- |
| `shares` | `uint256` | Shares minted to `receiver`. |

***

#### mint

```solidity
function mint(
    uint256 shares,
    address receiver
) public returns (uint256 assets);
```

Same as `deposit` but the caller specifies the share amount instead of the asset amount.

**Parameters:**

| Name       | Type      | Description                   |
| ---------- | --------- | ----------------------------- |
| `shares`   | `uint256` | Shares to claim.              |
| `receiver` | `address` | Address receiving the shares. |

**Return values:**

| Name     | Type      | Description                                 |
| -------- | --------- | ------------------------------------------- |
| `assets` | `uint256` | Assets consumed from the claimable balance. |

***

#### mint (with controller)

```solidity
function mint(
    uint256 shares,
    address receiver,
    address controller
) external returns (uint256 assets);
```

Same as `mint` above, on behalf of `controller`. The caller must be an operator or super operator of `controller`.

**Parameters:**

| Name         | Type      | Description                               |
| ------------ | --------- | ----------------------------------------- |
| `shares`     | `uint256` | Shares to claim.                          |
| `receiver`   | `address` | Address receiving the shares.             |
| `controller` | `address` | Controller that owns the deposit request. |

**Return values:**

| Name     | Type      | Description                                 |
| -------- | --------- | ------------------------------------------- |
| `assets` | `uint256` | Assets consumed from the claimable balance. |

***

### Deposit flow (sync, when `SyncMode` allows)

#### syncDeposit

```solidity
function syncDeposit(
    uint256 assets,
    address receiver,
    address referral
) public payable returns (uint256 shares);
```

Atomic deposit — mints shares immediately at the current price per share. Reverts if the vault is async-only or if sync deposits are disabled by the current `SyncMode`.

**Parameters:**

| Name       | Type      | Description                                                 |
| ---------- | --------- | ----------------------------------------------------------- |
| `assets`   | `uint256` | Amount of underlying assets to deposit.                     |
| `receiver` | `address` | Address receiving the shares.                               |
| `referral` | `address` | Address logged as the referrer (use `address(0)` for none). |

**Return values:**

| Name     | Type      | Description                                                |
| -------- | --------- | ---------------------------------------------------------- |
| `shares` | `uint256` | Shares minted at the current valuation, net of entry fees. |

***

### Redeem flow (async)

#### requestRedeem

```solidity
function requestRedeem(
    uint256 shares,
    address controller,
    address owner
) public returns (uint256 requestId);
```

Transfer shares to the pending silo, queued for the next redeem settlement.

**Parameters:**

| Name         | Type      | Description                                                                                       |
| ------------ | --------- | ------------------------------------------------------------------------------------------------- |
| `shares`     | `uint256` | Number of shares to redeem.                                                                       |
| `controller` | `address` | Address that will own the request and claim the resulting assets.                                 |
| `owner`      | `address` | Address whose shares are pulled. Must equal `msg.sender` or have approved the caller as operator. |

**Return values:**

| Name        | Type      | Description                     |
| ----------- | --------- | ------------------------------- |
| `requestId` | `uint256` | Epoch-based request identifier. |

***

#### cancelRequestRedeem

```solidity
function cancelRequestRedeem(address controller) external;
```

Pull pending shares back from the silo. The caller must be an operator or super operator of `controller`. *(New in v0.6.0.)*

**Parameters:**

| Name         | Type      | Description                                         |
| ------------ | --------- | --------------------------------------------------- |
| `controller` | `address` | Controller whose pending redeem is being cancelled. |

***

#### claimSharesAndRequestRedeem

```solidity
function claimSharesAndRequestRedeem(
    uint256 sharesToRedeem
) public returns (uint40 requestId);
```

UX bundle: claim any pending deposit shares first, then immediately request a redeem for them. If there is nothing claimable, behaves like `requestRedeem`.

**Parameters:**

| Name             | Type      | Description                                |
| ---------------- | --------- | ------------------------------------------ |
| `sharesToRedeem` | `uint256` | Number of shares to redeem after claiming. |

**Return values:**

| Name        | Type     | Description                                               |
| ----------- | -------- | --------------------------------------------------------- |
| `requestId` | `uint40` | Epoch-based request identifier of the new redeem request. |

***

#### redeem

```solidity
function redeem(
    uint256 shares,
    address receiver,
    address controller
) public returns (uint256 assets);
```

Claim assets after redeem settlement (or in sync if the vault is closed). When called by an operator or super operator of `controller`, the operator check is bypassed appropriately.

**Parameters:**

| Name         | Type      | Description                                                                     |
| ------------ | --------- | ------------------------------------------------------------------------------- |
| `shares`     | `uint256` | Shares to convert into assets.                                                  |
| `receiver`   | `address` | Address receiving the assets.                                                   |
| `controller` | `address` | Controller that owns the redeem request (or share balance, if vault is closed). |

**Return values:**

| Name     | Type      | Description                       |
| -------- | --------- | --------------------------------- |
| `assets` | `uint256` | Assets transferred to `receiver`. |

***

#### withdraw

```solidity
function withdraw(
    uint256 assets,
    address receiver,
    address controller
) public returns (uint256 shares);
```

Same as `redeem` but specified by asset amount.

**Parameters:**

| Name         | Type      | Description                                                                     |
| ------------ | --------- | ------------------------------------------------------------------------------- |
| `assets`     | `uint256` | Amount of assets to withdraw.                                                   |
| `receiver`   | `address` | Address receiving the assets.                                                   |
| `controller` | `address` | Controller that owns the redeem request (or share balance, if vault is closed). |

**Return values:**

| Name     | Type      | Description    |
| -------- | --------- | -------------- |
| `shares` | `uint256` | Shares burned. |

***

### Redeem flow (sync, when `SyncMode` allows)

#### syncRedeem

```solidity
function syncRedeem(
    uint256 shares,
    address receiver,
    uint256 minimumAssets
) public returns (uint256 assets);
```

Atomic redeem with slippage protection. Burns shares immediately and pays assets directly from the Curator address.

**Parameters:**

| Name            | Type      | Description                                                                                |
| --------------- | --------- | ------------------------------------------------------------------------------------------ |
| `shares`        | `uint256` | Shares to redeem.                                                                          |
| `receiver`      | `address` | Address receiving the assets.                                                              |
| `minimumAssets` | `uint256` | Minimum assets expected after exit fee and haircut. Reverts if the actual output is lower. |

**Return values:**

| Name     | Type      | Description                                                    |
| -------- | --------- | -------------------------------------------------------------- |
| `assets` | `uint256` | Assets transferred to `receiver`, net of exit fee and haircut. |

***

### Operators

#### setOperator

```solidity
function setOperator(
    address operator,
    bool approved
) external returns (bool success);
```

Authorize or revoke an operator that can request and claim on the caller's behalf.

**Parameters:**

| Name       | Type      | Description                           |
| ---------- | --------- | ------------------------------------- |
| `operator` | `address` | Operator address.                     |
| `approved` | `bool`    | `true` to approve, `false` to revoke. |

**Return values:**

| Name      | Type   | Description    |
| --------- | ------ | -------------- |
| `success` | `bool` | Always `true`. |

***

### ERC20 (with extra access checks)

In v0.6.0 the vault overrides `transfer` and `transferFrom` to enforce the `isAllowed` check on both sender and recipient.

#### transfer

```solidity
function transfer(
    address to,
    uint256 value
) public returns (bool);
```

Standard ERC20 transfer, plus an `isAllowed(msg.sender)` and `isAllowed(to)` check.

**Parameters:**

| Name    | Type      | Description                       |
| ------- | --------- | --------------------------------- |
| `to`    | `address` | Recipient. Must pass `isAllowed`. |
| `value` | `uint256` | Amount of shares to transfer.     |

**Return values:**

| Name      | Type   | Description               |
| --------- | ------ | ------------------------- |
| (unnamed) | `bool` | Always `true` on success. |

***

#### transferFrom

```solidity
function transferFrom(
    address from,
    address to,
    uint256 value
) public returns (bool);
```

Standard ERC20 `transferFrom`, plus an `isAllowed(from)` and `isAllowed(to)` check.

**Parameters:**

| Name    | Type      | Description                       |
| ------- | --------- | --------------------------------- |
| `from`  | `address` | Sender. Must pass `isAllowed`.    |
| `to`    | `address` | Recipient. Must pass `isAllowed`. |
| `value` | `uint256` | Amount of shares to transfer.     |

**Return values:**

| Name      | Type   | Description               |
| --------- | ------ | ------------------------- |
| (unnamed) | `bool` | Always `true` on success. |

***

### Views

#### totalAssets

```solidity
function totalAssets() public view returns (uint256);
```

Total assets currently managed by the vault, as last committed by the Curator at settlement.

**Return values:**

| Name      | Type      | Description                       |
| --------- | --------- | --------------------------------- |
| (unnamed) | `uint256` | Total assets in underlying units. |

***

#### decimals

```solidity
function decimals() public view returns (uint8);
```

ERC20 decimals — matches the underlying asset's decimals plus the vault's decimal offset.

**Return values:**

| Name      | Type    | Description                        |
| --------- | ------- | ---------------------------------- |
| (unnamed) | `uint8` | Decimals of the vault share token. |

***

#### version

```solidity
function version() public pure returns (string memory);
```

Implementation version string.

**Return values:**

| Name      | Type     | Description |
| --------- | -------- | ----------- |
| (unnamed) | `string` | `"v0.6.0"`. |

***

#### safe

```solidity
function safe() public view returns (address);
```

Address bound to the Curator role — vault assets flow into this address at settlement, and out of it on redeems. Named `safe` in the source code by convention; can be any address.

**Return values:**

| Name      | Type      | Description          |
| --------- | --------- | -------------------- |
| (unnamed) | `address` | The Curator address. |

***

#### share

```solidity
function share() external view returns (address);
```

ERC-7575 share token address — always returns `address(this)` for this vault.

**Return values:**

| Name      | Type      | Description                         |
| --------- | --------- | ----------------------------------- |
| (unnamed) | `address` | The share token (the vault itself). |

***

#### supportsInterface

```solidity
function supportsInterface(bytes4 interfaceId) public view returns (bool);
```

ERC-165 interface support check.

**Parameters:**

| Name          | Type     | Description           |
| ------------- | -------- | --------------------- |
| `interfaceId` | `bytes4` | Interface identifier. |

**Return values:**

| Name      | Type   | Description                           |
| --------- | ------ | ------------------------------------- |
| (unnamed) | `bool` | `true` if the interface is supported. |

***

#### maxDeposit

```solidity
function maxDeposit(address controller) public view returns (uint256);
```

Maximum assets `controller` can claim through `deposit`. Zero when paused.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name      | Type      | Description               |
| --------- | --------- | ------------------------- |
| (unnamed) | `uint256` | Maximum claimable assets. |

***

#### maxMint

```solidity
function maxMint(address controller) public view returns (uint256);
```

Maximum shares `controller` can mint by claiming a settled deposit request.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name      | Type      | Description               |
| --------- | --------- | ------------------------- |
| (unnamed) | `uint256` | Maximum claimable shares. |

***

#### maxRedeem

```solidity
function maxRedeem(address controller) public view returns (uint256);
```

Maximum redeemable shares for `controller`. When the vault is closed and nothing is claimable, returns the share balance instead (sync redeem path).

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description                |
| -------- | --------- | -------------------------- |
| `shares` | `uint256` | Maximum redeemable shares. |

***

#### maxWithdraw

```solidity
function maxWithdraw(address controller) public view returns (uint256 assets);
```

Asset-denominated counterpart of `maxRedeem`.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description                  |
| -------- | --------- | ---------------------------- |
| `assets` | `uint256` | Maximum withdrawable assets. |

***

#### previewSyncDeposit

```solidity
function previewSyncDeposit(uint256 assets) public view returns (uint256 shares);
```

Shares a depositor would receive for `assets` via `syncDeposit`, net of entry fee.

**Parameters:**

| Name     | Type      | Description        |
| -------- | --------- | ------------------ |
| `assets` | `uint256` | Assets to deposit. |

**Return values:**

| Name     | Type      | Description                   |
| -------- | --------- | ----------------------------- |
| `shares` | `uint256` | Shares the caller would mint. |

***

#### previewSyncRedeem

```solidity
function previewSyncRedeem(uint256 shares) public view returns (uint256 assets);
```

Assets a redeemer would receive for `shares` via `syncRedeem`, net of exit fee and haircut.

**Parameters:**

| Name     | Type      | Description       |
| -------- | --------- | ----------------- |
| `shares` | `uint256` | Shares to redeem. |

**Return values:**

| Name     | Type      | Description                      |
| -------- | --------- | -------------------------------- |
| `assets` | `uint256` | Assets the caller would receive. |

***

#### previewDeposit / previewMint / previewRedeem / previewWithdraw

```solidity
function previewDeposit(uint256) public pure returns (uint256);
function previewMint(uint256) public pure returns (uint256);
function previewRedeem(uint256) public pure returns (uint256);
function previewWithdraw(uint256) public pure returns (uint256);
```

**All four revert.** ERC-7540 mandates that synchronous previews are disabled for asynchronous flows. Use `convertToShares` / `convertToAssets` with a specific `requestId` for settled epochs, or `previewSyncDeposit` / `previewSyncRedeem` for the sync flow.

***

#### convertToShares

```solidity
function convertToShares(
    uint256 assets,
    uint256 requestId
) public view returns (uint256);
```

Assets → shares conversion at the settlement price of `requestId`'s epoch.

**Parameters:**

| Name        | Type      | Description                                       |
| ----------- | --------- | ------------------------------------------------- |
| `assets`    | `uint256` | Assets to convert.                                |
| `requestId` | `uint256` | Request / epoch ID whose settlement price to use. |

**Return values:**

| Name      | Type      | Description                              |
| --------- | --------- | ---------------------------------------- |
| (unnamed) | `uint256` | Equivalent shares at that epoch's price. |

***

#### convertToAssets

```solidity
function convertToAssets(
    uint256 shares,
    uint256 requestId
) public view returns (uint256);
```

Shares → assets conversion at the settlement price of `requestId`'s epoch.

**Parameters:**

| Name        | Type      | Description                                       |
| ----------- | --------- | ------------------------------------------------- |
| `shares`    | `uint256` | Shares to convert.                                |
| `requestId` | `uint256` | Request / epoch ID whose settlement price to use. |

**Return values:**

| Name      | Type      | Description                              |
| --------- | --------- | ---------------------------------------- |
| (unnamed) | `uint256` | Equivalent assets at that epoch's price. |

***

#### pendingDepositRequest

```solidity
function pendingDepositRequest(
    uint256 requestId,
    address controller
) public view returns (uint256 assets);
```

Assets currently waiting to be settled for `controller` at `requestId`.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `requestId`  | `uint256` | Request / epoch ID.  |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description     |
| -------- | --------- | --------------- |
| `assets` | `uint256` | Pending assets. |

***

#### claimableDepositRequest

```solidity
function claimableDepositRequest(
    uint256 requestId,
    address controller
) public view returns (uint256 assets);
```

Assets at `requestId` that have been settled and are now claimable by `controller`.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `requestId`  | `uint256` | Request / epoch ID.  |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description       |
| -------- | --------- | ----------------- |
| `assets` | `uint256` | Claimable assets. |

***

#### pendingRedeemRequest

```solidity
function pendingRedeemRequest(
    uint256 requestId,
    address controller
) public view returns (uint256 shares);
```

Shares currently waiting to be settled for `controller` at `requestId`.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `requestId`  | `uint256` | Request / epoch ID.  |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description     |
| -------- | --------- | --------------- |
| `shares` | `uint256` | Pending shares. |

***

#### claimableRedeemRequest

```solidity
function claimableRedeemRequest(
    uint256 requestId,
    address controller
) public view returns (uint256 shares);
```

Shares at `requestId` that have been settled and whose assets are now claimable.

**Parameters:**

| Name         | Type      | Description          |
| ------------ | --------- | -------------------- |
| `requestId`  | `uint256` | Request / epoch ID.  |
| `controller` | `address` | Controller to check. |

**Return values:**

| Name     | Type      | Description       |
| -------- | --------- | ----------------- |
| `shares` | `uint256` | Claimable shares. |

***

#### isOperator

```solidity
function isOperator(
    address controller,
    address operator
) public view returns (bool);
```

Returns `true` if `operator` is approved by `controller` via `setOperator`.

**Parameters:**

| Name         | Type      | Description        |
| ------------ | --------- | ------------------ |
| `controller` | `address` | Controller.        |
| `operator`   | `address` | Operator to check. |

**Return values:**

| Name      | Type   | Description         |
| --------- | ------ | ------------------- |
| (unnamed) | `bool` | `true` if approved. |

***

#### isAllowed

```solidity
function isAllowed(address account) public view returns (bool);
```

Composite access check — passes the current access mode (whitelist or blacklist) and the external sanctions list, if configured.

**Parameters:**

| Name      | Type      | Description       |
| --------- | --------- | ----------------- |
| `account` | `address` | Address to check. |

**Return values:**

| Name      | Type   | Description                                        |
| --------- | ------ | -------------------------------------------------- |
| (unnamed) | `bool` | `true` if the account can interact with the vault. |

***

#### isTotalAssetsValid

```solidity
function isTotalAssetsValid() public view returns (bool);
```

Returns `true` while the currently posted valuation is still within its `totalAssetsLifespan`. Sync operations require this to be `true`.

**Return values:**

| Name      | Type   | Description                             |
| --------- | ------ | --------------------------------------- |
| (unnamed) | `bool` | `true` if the valuation is still valid. |

***

#### syncMode

```solidity
function syncMode() public view returns (SyncMode);
```

Returns the current sync configuration.

```solidity
enum SyncMode { Both, SyncDeposit, SyncRedeem, None }
```

**Return values:**

| Name      | Type       | Description   |
| --------- | ---------- | ------------- |
| (unnamed) | `SyncMode` | Current mode. |

***

#### isAsyncOnly

```solidity
function isAsyncOnly() public view returns (bool);
```

Returns `true` if `activateAsyncOnly` has been called — the vault has irreversibly given up sync capability. When `true`, `totalAssets` is always treated as invalid.

**Return values:**

| Name      | Type   | Description                                    |
| --------- | ------ | ---------------------------------------------- |
| (unnamed) | `bool` | `true` if the vault is permanently async-only. |

***

#### maxCap

```solidity
function maxCap() external view returns (uint256);
```

Returns the per-vault total-assets cap.

**Return values:**

| Name      | Type      | Description                        |
| --------- | --------- | ---------------------------------- |
| (unnamed) | `uint256` | Max cap in underlying asset units. |

***

#### feeRates

```solidity
function feeRates() public view returns (Rates memory);
```

Returns the current fee rates struct.

```solidity
struct Rates {
    uint16 managementRate;
    uint16 performanceRate;
    uint16 entryRate;     // new in v0.6.0
    uint16 exitRate;      // new in v0.6.0
    uint16 haircutRate;   // new in v0.6.0
}
```

All rates are in basis points. The protocol cut is read separately from the `FeeRegistry`.

**Return values:**

| Name      | Type    | Description                                                      |
| --------- | ------- | ---------------------------------------------------------------- |
| (unnamed) | `Rates` | Current management / performance / entry / exit / haircut rates. |

***

## Curator

The Curator role is bound to a single on-chain address — referred to as the `safe` in the source code (hence the `onlySafe` modifier and the `safe()` view function). The name reflects the common deployment pattern of using a Gnosis-Safe multi-sig, but **no Safe-specific behaviour is enforced**: any address can hold the role, including an EOA, an MPC wallet, or a custom contract. The Curator manages strategy allocation, executes settlements, and toggles operational parameters like the sync mode and the max cap.

#### settleDeposit

```solidity
function settleDeposit(uint256 _newTotalAssets) public;
```

Commit a valuation, take fees, mint shares to the silo, and pull silo assets into the Curator address. Opportunistically also calls `settleRedeem` when possible.

**Parameters:**

| Name              | Type      | Description                                                                                                                              |
| ----------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `_newTotalAssets` | `uint256` | Confirmed total assets at the moment of settlement. Must equal the value previously posted by the valuation manager or security council. |

***

#### settleRedeem

```solidity
function settleRedeem(uint256 _newTotalAssets) public;
```

Commit a valuation, take fees, burn pending shares from the silo, and pull assets from the Curator address to the vault for claim.

**Parameters:**

| Name              | Type      | Description                                         |
| ----------------- | --------- | --------------------------------------------------- |
| `_newTotalAssets` | `uint256` | Confirmed total assets at the moment of settlement. |

***

#### claimSharesOnBehalf

```solidity
function claimSharesOnBehalf(address[] memory controllers) external;
```

UX helper — push claimable deposit shares to a list of controllers.

**Parameters:**

| Name          | Type        | Description                                                               |
| ------------- | ----------- | ------------------------------------------------------------------------- |
| `controllers` | `address[]` | Controllers to claim for. Controllers with nothing claimable are skipped. |

***

#### claimAssetsOnBehalf

```solidity
function claimAssetsOnBehalf(address[] memory controllers) external;
```

UX helper — push claimable redeem assets to a list of controllers. *(New in v0.6.0.)*

**Parameters:**

| Name          | Type        | Description                                                               |
| ------------- | ----------- | ------------------------------------------------------------------------- |
| `controllers` | `address[]` | Controllers to claim for. Controllers with nothing claimable are skipped. |

***

#### updateTotalAssetsLifespan

```solidity
function updateTotalAssetsLifespan(uint128 lifespan) external;
```

Set how long a posted valuation stays valid for sync operations.

**Parameters:**

| Name       | Type      | Description          |
| ---------- | --------- | -------------------- |
| `lifespan` | `uint128` | Lifespan in seconds. |

***

#### expireTotalAssets

```solidity
function expireTotalAssets() public;
```

Invalidate the currently posted valuation immediately. After this call, sync operations revert until a new valuation is posted and confirmed.

***

#### updateMaxCap

```solidity
function updateMaxCap(uint256 _maxCap) external;
```

Set the deposit cap (in underlying assets).

**Parameters:**

| Name      | Type      | Description                                                  |
| --------- | --------- | ------------------------------------------------------------ |
| `_maxCap` | `uint256` | New max cap. Use `type(uint256).max` to effectively disable. |

***

#### setSyncMode

```solidity
function setSyncMode(SyncMode _mode) external;
```

Switch between async-only, sync-deposit-only, sync-redeem-only, or both. Reverts if the vault is in async-only mode. *(New in v0.6.0.)*

**Parameters:**

| Name    | Type       | Description                                     |
| ------- | ---------- | ----------------------------------------------- |
| `_mode` | `SyncMode` | `Both`, `SyncDeposit`, `SyncRedeem`, or `None`. |

***

#### resetHighWaterMark

```solidity
function resetHighWaterMark() external;
```

Reset the high-water mark to the current price per share — used after a known-loss event so the performance fee re-engages from a fresh baseline. Reverts unless `allowHighWaterMarkReset` was set to `true` at vault initialization. *(New in v0.6.0.)*

***

#### close

```solidity
function close(uint256 _newTotalAssets) external;
```

Finalize closing the vault. The Owner (Admin) must first call `initiateClosing`. After `close`, only redemption / withdrawal paths remain available.

**Parameters:**

| Name              | Type      | Description                  |
| ----------------- | --------- | ---------------------------- |
| `_newTotalAssets` | `uint256` | Final total assets at close. |

***

## Valuation Manager

#### updateNewTotalAssets

```solidity
function updateNewTotalAssets(uint256 _newTotalAssets) public;
```

Propose a new vault valuation. Must satisfy `GuardRailsManager.isCompliant` if guardrails are active.

**Parameters:**

| Name              | Type      | Description            |
| ----------------- | --------- | ---------------------- |
| `_newTotalAssets` | `uint256` | Proposed total assets. |

***

## Security Council

#### securityCouncilUpdateTotalAssets

```solidity
function securityCouncilUpdateTotalAssets(uint256 _newTotalAssets) public;
```

Same as `updateNewTotalAssets` but **bypasses guardrails**. Used to recover from valuation events that legitimately exceed the configured bounds. *(New in v0.6.0.)*

**Parameters:**

| Name              | Type      | Description            |
| ----------------- | --------- | ---------------------- |
| `_newTotalAssets` | `uint256` | Proposed total assets. |

***

#### updateGuardrails

```solidity
function updateGuardrails(Guardrails calldata guardrails_) external;
```

Update the price-per-share bounds policy.

```solidity
struct Guardrails {
    uint256 upperRate;  // maximum annualised PPS increase in bps
    int256  lowerRate;  // minimum annualised PPS change in bps (signed: can be negative)
}
```

**Parameters:**

| Name          | Type         | Description                                      |
| ------------- | ------------ | ------------------------------------------------ |
| `guardrails_` | `Guardrails` | New upper / lower annual bounds in basis points. |

***

#### updateActivated

```solidity
function updateActivated(bool activated_) external;
```

Enable or disable guardrail enforcement.

**Parameters:**

| Name         | Type   | Description                            |
| ------------ | ------ | -------------------------------------- |
| `activated_` | `bool` | `true` to enforce, `false` to disable. |

***

## Access Manager (former Whitelist Manager)

#### addToWhitelist

```solidity
function addToWhitelist(address[] memory accounts) external;
```

Add accounts to the whitelist.

**Parameters:**

| Name       | Type        | Description            |
| ---------- | ----------- | ---------------------- |
| `accounts` | `address[]` | Accounts to whitelist. |

***

#### revokeFromWhitelist

```solidity
function revokeFromWhitelist(address[] memory accounts) external;
```

Remove accounts from the whitelist.

**Parameters:**

| Name       | Type        | Description         |
| ---------- | ----------- | ------------------- |
| `accounts` | `address[]` | Accounts to remove. |

***

#### addToBlacklist

```solidity
function addToBlacklist(address[] memory accounts) external;
```

Add accounts to the blacklist. *(New in v0.6.0.)*

**Parameters:**

| Name       | Type        | Description            |
| ---------- | ----------- | ---------------------- |
| `accounts` | `address[]` | Accounts to blacklist. |

***

#### revokeFromBlacklist

```solidity
function revokeFromBlacklist(address[] memory accounts) external;
```

Remove accounts from the blacklist. *(New in v0.6.0.)*

**Parameters:**

| Name       | Type        | Description                            |
| ---------- | ----------- | -------------------------------------- |
| `accounts` | `address[]` | Accounts to remove from the blacklist. |

***

#### setExternalSanctionsList

```solidity
function setExternalSanctionsList(SanctionsList sanctionsList) external;
```

Wire an external sanctions oracle that the vault will query on **every** `isAllowed` check — i.e. on every deposit, redeem, request, share transfer, and operator-triggered claim. If the oracle returns `true` for the address, the call reverts. The hook is intended for the [Chainalysis Sanctions Oracle](https://go.chainalysis.com/chainalysis-oracle-docs.html), a free on-chain registry of OFAC-sanctioned addresses, but any contract that implements the one-method interface below works. Pass `address(0)` to disable the check entirely. *(New in v0.6.0.)*

```solidity
interface SanctionsList {
    function isSanctioned(address addr) external view returns (bool);
}
```

The sanctions check stacks on top of the active access mode (whitelist or blacklist) — an address must pass both to interact with the vault.

**Parameters:**

| Name            | Type            | Description                                                                                                                                                                                                                                                |
| --------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `sanctionsList` | `SanctionsList` | Oracle address. Use the Chainalysis-deployed contract for the target chain (see [their docs](https://go.chainalysis.com/chainalysis-oracle-docs.html) for per-network addresses), a custom oracle implementing `isSanctioned`, or `address(0)` to disable. |

***

## Owner (Admin)

The Owner (Admin) is the governance role — it does not run the strategy, but it controls vault configuration, critical safety switches, and role assignments. Enforced on-chain by the standard `onlyOwner` modifier (`Ownable2StepUpgradeable`).

### Lifecycle & emergency

#### initialize

```solidity
function initialize(
    bytes memory data,
    address feeRegistry,
    address wrappedNativeToken
) public;
```

Proxy-time initializer. `data` is an ABI-encoded `InitStruct` containing the vault's full configuration.

**Parameters:**

| Name                 | Type      | Description                                                                         |
| -------------------- | --------- | ----------------------------------------------------------------------------------- |
| `data`               | `bytes`   | ABI-encoded `InitStruct` (underlying, name, symbol, roles, rates, sync mode, etc.). |
| `feeRegistry`        | `address` | Protocol fee registry address.                                                      |
| `wrappedNativeToken` | `address` | Wrapped native token (e.g. WETH) — used by `Silo.depositEth`.                       |

***

#### pause

```solidity
function pause() public;
```

Halt all core user operations (deposit, redeem, withdraw, requests, settlements, valuation updates).

***

#### unpause

```solidity
function unpause() public;
```

Resume operations after a pause.

***

#### initiateClosing

```solidity
function initiateClosing() external;
```

Start the vault wind-down. After this, the Curator finalises via `close(_newTotalAssets)`.

***

#### activateAsyncOnly

```solidity
function activateAsyncOnly() external;
```

**Irreversible.** Permanently disable sync deposits and sync redeems. After this call, `isAsyncOnly()` returns `true` and `totalAssets` is always treated as invalid. *(New in v0.6.0.)*

***

### Roles

#### updateWhitelistManager

```solidity
function updateWhitelistManager(address _whitelistManager) external;
```

Replace the Access Manager address (the role formerly known as Whitelist Manager — kept under its original name in the source for storage-layout compatibility).

**Parameters:**

| Name                | Type      | Description                 |
| ------------------- | --------- | --------------------------- |
| `_whitelistManager` | `address` | New Access Manager address. |

***

#### updateValuationManager

```solidity
function updateValuationManager(address _valuationManager) external;
```

Replace the Valuation Manager address (the role authorised to call `updateNewTotalAssets`).

**Parameters:**

| Name                | Type      | Description                    |
| ------------------- | --------- | ------------------------------ |
| `_valuationManager` | `address` | New Valuation Manager address. |

***

#### updateFeeReceiver

```solidity
function updateFeeReceiver(address _feeReceiver) external;
```

Replace the address that receives the share-denominated fees minted at settlement.

**Parameters:**

| Name           | Type      | Description               |
| -------------- | --------- | ------------------------- |
| `_feeReceiver` | `address` | New fee receiver address. |

***

#### updateSafe

```solidity
function updateSafe(address _safe) external;
```

Replace the address bound to the Curator role (called `safe` in the source for historical reasons — see the [Curator](#curator) section). *(New in v0.6.0.)* Reverts if `lockUpdateSafe` has been called.

**Parameters:**

| Name    | Type      | Description                                                                                         |
| ------- | --------- | --------------------------------------------------------------------------------------------------- |
| `_safe` | `address` | New address for the Curator role. Can be any address (multi-sig, EOA, MPC wallet, custom contract). |

***

#### updateSecurityCouncil

```solidity
function updateSecurityCouncil(address _securityCouncil) external;
```

Replace the Security Council address (the role that manages guardrails and can bypass them via `securityCouncilUpdateTotalAssets`). *(New in v0.6.0.)*

**Parameters:**

| Name               | Type      | Description                   |
| ------------------ | --------- | ----------------------------- |
| `_securityCouncil` | `address` | New Security Council address. |

***

#### updateSuperOperator

```solidity
function updateSuperOperator(address _superOperator) external;
```

Replace the Super Operator address (the global operator that can act on behalf of any controller and bypasses whitelist / blacklist checks — see [Super Operator](#super-operator) for the full scope). *(New in v0.6.0.)* Reverts if `lockSuperOperator` has been called.

**Parameters:**

| Name             | Type      | Description                                             |
| ---------------- | --------- | ------------------------------------------------------- |
| `_superOperator` | `address` | New Super Operator address. Use `address(0)` to remove. |

***

#### lockUpdateSafe

```solidity
function lockUpdateSafe() external;
```

**Irreversible.** Permanently disable `updateSafe`. *(New in v0.6.0.)*

***

#### lockSuperOperator

```solidity
function lockSuperOperator() external;
```

**Irreversible.** Permanently disable `updateSuperOperator`. *(New in v0.6.0.)*

***

#### transferOwnership / acceptOwnership

```solidity
function transferOwnership(address newOwner) public;
function acceptOwnership() public;
```

Two-step transfer of the Owner (Admin) role (`Ownable2StepUpgradeable`). `newOwner` must call `acceptOwnership` for the transfer to take effect.

***

### Access control

#### switchAccessMode

```solidity
function switchAccessMode(AccessMode newMode) public;
```

Switch between whitelist and blacklist mode. *(New in v0.6.0.)*

```solidity
enum AccessMode { Blacklist, Whitelist }
```

**Parameters:**

| Name      | Type         | Description                 |
| --------- | ------------ | --------------------------- |
| `newMode` | `AccessMode` | `Whitelist` or `Blacklist`. |

***

### Fees & metadata

#### updateRates

```solidity
function updateRates(Rates memory newRates) external;
```

Update fee rates. Max bounds are enforced on-chain (entry/exit ≤ 2%, haircut ≤ 20%, management/performance per protocol policy). The protocol cut is not part of this struct — it is read from the `FeeRegistry`.

**Parameters:**

| Name       | Type    | Description                                                                       |
| ---------- | ------- | --------------------------------------------------------------------------------- |
| `newRates` | `Rates` | New management / performance / entry / exit / haircut rates, all in basis points. |

***

#### updateName

```solidity
function updateName(string memory newName) external;
```

Update the ERC20 `name`. *(New in v0.6.0.)*

**Parameters:**

| Name      | Type     | Description |
| --------- | -------- | ----------- |
| `newName` | `string` | New name.   |

***

#### updateSymbol

```solidity
function updateSymbol(string memory newSymbol) external;
```

Update the ERC20 `symbol`. *(New in v0.6.0.)*

**Parameters:**

| Name        | Type     | Description |
| ----------- | -------- | ----------- |
| `newSymbol` | `string` | New symbol. |

***

## Super Operator

The Super Operator is a single global address that satisfies the operator check for any controller on **every user op except `requestDeposit` and `syncDeposit`**, and additionally **bypasses whitelist / blacklist checks**. There is no dedicated function — it works by passing the `isOperatorOrSuperOperator` check in `deposit`, `mint`, `redeem`, `withdraw`, `cancelRequestDeposit(address)`, and `cancelRequestRedeem`.

The address is set by the Owner (Admin) via `updateSuperOperator(address)` and can be permanently locked via `lockSuperOperator()`. Use `address(0)` to disable.

***

## GuardRailsManager (read)

#### isCompliant

```solidity
function isCompliant(
    uint256 currentPps,
    uint256 nextPps,
    uint256 timePast
) public view returns (bool);
```

Pure check used by the vault on every `updateNewTotalAssets` call. Returns `true` if the proposed PPS change stays within the configured upper/lower annual bounds for the elapsed time.

**Parameters:**

| Name         | Type      | Description                            |
| ------------ | --------- | -------------------------------------- |
| `currentPps` | `uint256` | Current price per share.               |
| `nextPps`    | `uint256` | Proposed new price per share.          |
| `timePast`   | `uint256` | Seconds elapsed since the last update. |

**Return values:**

| Name      | Type   | Description          |
| --------- | ------ | -------------------- |
| (unnamed) | `bool` | `true` if compliant. |

***

## Silo (separate contract)

The Silo is a minimal helper contract paired with each vault. It holds pending assets (during async deposits) and pending shares (during async redeems). The vault's constructor configures `IERC20(underlying).forceApprove(vault, max)` so the vault can pull from the silo; no other entry points exist beyond the one below.

#### depositEth

```solidity
function depositEth() external payable;
```

Wrap received ETH into WETH. Called by the vault when a user `requestDeposit`s native ETH and the underlying is WETH.


---

# 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.lagoon.finance/developer-hub/smart-contract-reference.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.
