Skip to main content

SubvaultModule

Purpose

The SubvaultModule represents an isolated child vault within a modular vault system. It is tightly controlled by its parent vault (typically a VaultModule) and is responsible for securely holding and releasing assets upon authenticated requests.

Responsibilities

  • Store and isolate a portion of vault assets.
  • Allow trusted actor (curator) to delegate liquidity from the subvault to external protocols based on the Verifier setup for this specific subvault.
  • Respond to pullAssets calls from the parent vault only.

Storage Layout (SubvaultModuleStorage)

struct SubvaultModuleStorage {
address vault;
}
  • vault: Address of the root vault that controls this subvault. Only this address can request asset withdrawals.

The layout is stored in a deterministic custom slot derived using:

SlotLibrary.getSlot("SubvaultModule", name_, version_)

View Functions

vault() -> address

Returns the address of the parent vault that instantiated this subvault.

Mutable Functions

pullAssets(asset: address, value: uint256)

Allows the parent vault to withdraw a specified amount of an asset.

  • Access control: Can only be called by the vault() address.
  • Reverts with NotVault() if the caller is not the vault.
  • Transfer behavior: Uses TransferLibrary.sendAssets() to forward tokens or native ETH to the Vault.sol address.
  • Emits AssetsPulled(asset, vault, value).

Internal Initialization

__SubvaultModule_init(address vault_)

Internal setup method to be called during construction or proxy initialization.

Events

event AssetsPulled(address indexed asset, address indexed to, uint256 value)

Triggered when assets are withdrawn by the parent vault.

  • asset: Address of the ERC20 token or native ETH.
  • to: Always equals the vault() address.
  • value: Amount of the asset transferred.

Error Handling

  • NotVault(): Raised when a non-vault caller attempts to call pullAssets().