Skip to main content

Overview

BasicRedeemHook is a minimal hook implementation for IHook, designed to dynamically fetch liquidity from subvaults during redemption processing in a VaultModule. It ensures that enough assets are available for user redemptions by pulling liquidity from a set of registered subvaults. This hook is typically invoked by a vault’s redemption queue or during redeem() operations when assets must be made liquid.

Purpose

  • Ensures sufficient liquidity in the vault to fulfill asset redemptions.
  • Minimizes idle capital by pulling only when needed.
  • Supports liquidity routing across subvaults.

Key Functions

callHook(address asset, uint256 assets)

Attempts to make assets of asset liquid within the main vault by pulling from subvaults if needed. Execution Flow:
  1. Checks how much of the asset the vault already holds.
  2. If balance is sufficient → no-op.
  3. Otherwise:
    • Iterates over subvaults (via subvaultAt(i))
    • Skips subvaults where the RiskManager does not allow the asset (isAllowedAsset(subvault, asset))
    • For each remaining subvault:
      • Pulls only the required portion via hookPullAssets()
      • Stops when total required assets have been pulled
Guarantees:
  • Only pulls the exact missing amount, no over-pulling
  • Efficient: stops once liquidity need is satisfied
  • Skips subvaults with 0 balance

getLiquidAssets(address asset) → uint256

Returns the total liquid amount of a given asset available across the vault and its subvaults. Unlike callHook, this function is called directly by the vault (ShareModule.getLiquidAssets), not through delegatecall, so it treats msg.sender as the vault.
  • Reads balances:
    • vault.balanceOf(asset)
    • subvault[i].balanceOf(asset) for each subvault where the RiskManager allows the asset
  • Aggregates and returns sum
Only token balances held directly by the vault and subvaults count. Positions in external protocols are not included.

Contract Assumptions

  • The vault invoking this hook implements IVaultModule and supports:
    • subvaults() → total number of subvaults
    • subvaultAt(index) → address of a given subvault
    • hookPullAssets(subvault, asset, amount) → callable method to move funds
    • riskManager() → used to check which subvaults allow the asset

Security Considerations

  • Hook only pulls assets using vault-controlled hookPullAssets(), ensuring controlled asset flow.
  • Assumes vault validates which hook is active — no permissioning within the hook itself.