# ShareModule

### Purpose

`ShareModule` is a core module responsible for managing user interactions with a vault through structured deposit and redeem queues. It provides governance over queue creation, hook configurations, oracle-driven settlement, and fee accounting.

### Key Responsibilities

* Tracks and validates all deposit/redeem queue operations.
* Coordinates price reporting with oracle.
* Facilitates dynamic queue configuration and lifecycle.
* Integrates hooks for deposit/redeem processing customization.
* Central hub for protocol and performance fee minting, share claim logic and report handling.

### Roles

* `SET_HOOK_ROLE`: Grants the ability to modify per-queue and default hook addresses.
* `CREATE_QUEUE_ROLE`: Allows creation of new deposit/redeem queues.
* `SET_QUEUE_STATUS_ROLE`: Permits pausing/unpausing individual queues.
* `SET_QUEUE_LIMIT_ROLE`: Enables setting the max number of total queues.
* `REMOVE_QUEUE_ROLE`: Allows safe removal of queues with `canBeRemoved()` check.

### Core Storage Layout (`ShareModuleStorage`)

* `shareManager`: Reference to contract handling share minting/burning.
* `feeManager`: Reference to contract that calculates fees and stores fee-related data.
* `oracle`: Oracle contract providing price data and asset support status.
* `defaultDepositHook` / `defaultRedeemHook`: Global fallback hooks used by default in case custom hooks are not defined.
* `customHooks`: Per-queue override for custom hook logic.
* `queueCount`: Total existing queues.
* `queueLimit`: Global max limit for queues.
* `isDepositQueue`: Distinguishes deposit queues from redeem ones.
* `isPausedQueue`: Tracks paused queues.
* `queues`: Asset → queues mapping.
* `assets`: Registry of all assets with registered queues.

### View Functions

* `shareManager()`: Returns the `IShareManager` instance.
* `feeManager()`: Returns the `IFeeManager` instance.
* `oracle()`: Returns the `IOracle` instance.
* `depositQueueFactory()` / `redeemQueueFactory()`: Queue factory contracts.
* `queueLimit()`: Max allowed queues.
* `claimableSharesOf(account)`: Sum of claimable shares across all deposit queues for the `account`.
* `getLiquidAssets()`: Called by redeem queues to determine liquidity available for handling redemptions.
* `defaultDepositHook()` / `defaultRedeemHook()`: Global default hooks.
* `getHook(queue)`: Resolves hook for queue (custom or default fallback as a fallback).
* Asset/Queue helpers:
  * `getAssetCount()`, `assetAt(index)`, `hasAsset(asset)`
  * `hasQueue(queue)`, `isDepositQueue(queue)`, `isPausedQueue(queue)`
  * `getQueueCount()` / `getQueueCount(asset)`
  * `queueAt(asset, index)`

### Mutable Functions

* `claimShares(account)`: Claims all claimable shares from deposit queues for the specific account.
* `callHook(assets)`: Calls the queue’s associated hook. Transfers assets to the queue if redeem.
* `setCustomHook(queue, hook)`: Assigns per-queue hook.
* `setDefaultDepositHook(hook)` / `setDefaultRedeemHook(hook)`: Sets global hooks.
* `setQueueLimit(limit)`: Updates global queue cap.
* `setQueueStatus(queue, isPaused)`: Pauses/unpauses a queue.
* `createQueue(version, isDeposit, owner, asset, data)`: Deploys new queue for asset.
* `removeQueue(queue)`: Removes a queue that passed `canBeRemoved()`.
* `handleReport(asset, priceD18, depositTimestamp, redeemTimestamp)`:
  * Called by the oracle.
  * Distributes protocol fees.
  * Propagates price report to all queues and calls hooks.

### Events

* `SharesClaimed(account)`
* `CustomHookSet(queue, hook)`
* `QueueCreated(queue, asset, isDepositQueue)`
* `QueueRemoved(queue, asset)`
* `HookCalled(queue, asset, assets, hook)`
* `QueueLimitSet(limit)`
* `SetQueueStatus(queue, isPaused)`
* `DefaultHookSet(hook, isDepositHook)`
* `ReportHandled(asset, priceD18, depositTimestamp, redeemTimestamp, fees)`
