Subvault

Overview

The Subvault contract represents a modular, permissioned vault component designed to manage delegated asset strategies within a parent Vault. It enables curated logic for permissioned calls and asset management without exposing external deposit or redemption interfaces.

This contract combines callable and verifiable logic to serve as a secure, controlled execution unit within a system.

Inheritance Structure

contract Subvault is IFactoryEntity, CallModule, SubvaultModule

The Subvault inherits:

  • CallModule: Enables arbitrary low-level calls to external contracts (used by curator of the vault), and verification through a verifier module.

  • SubvaultModule: Handles vault linkage and liquidity handling.

  • IFactoryEntity: Standard initialization interface for factory deployment compatibility.

The constructor explicitly calls:

VerifierModule(name_, version_)
SubvaultModule(name_, version_)

This indicates that both modules rely on deterministic storage and versioned deployment identifiers via SlotLibrary.

Constructor

constructor(string memory name_, uint256 version_)

Parameters:

  • name_: A unique string identifier for the deployment (e.g., “Mellow”).

  • version_: A version number used to derive storage slots and allow upgradeable logic.

Behavior:

Passes the name_ and version_ arguments into the constructors of VerifierModule and SubvaultModule.

External Functions

initialize

Initializes the subvault contract. This function can only be called once due to the initializer modifier.

Parameters:

  • initParams: ABI-encoded as (address verifier_, address vault_)

Initialization Steps:

  1. Decodes verifier_ and vault_ from the calldata.

  2. Calls __VerifierModule_init(verifier_) to link the external verifier (used for strategy proof or access control).

  3. Calls __SubvaultModule_init(vault_) to register this subvault with the parent vault.

  4. Emits the Initialized(initParams) event for transparency.

Design Notes

  • Modular Strategy Execution: The CallModule enables arbitrary external calls, useful for delegating assets into other protocols or yield strategies.

  • Trust-Minimized Calls: External strategy actions are gated via a VerifierModule, which can enforce logic like off-chain signatures or time-based constraints.

  • Parent Vault Registration: Initialization ensures the vault address is securely set once and governs access and lifecycle.

  • Upgradeable Architecture: Follows the shared pattern of using deterministic storage slots (via SlotLibrary) to remain safely upgradeable and composable.

Events

Initialized(bytes data)

Emitted once after a successful initialize call. Contains the raw ABI-encoded input for auditing or debugging.