SlotLibrary

This library generates unique and collision-resistant storage slots for use in upgradeable Solidity contracts. It ensures that different modules or instances do not unintentionally overwrite each other’s storage, even when used via proxy or delegate calls.

Storage Slot Strategy

  • Based on EIP-7201

  • Inputs include:

    • Contract name (contractName)

    • Human-readable name (name)

    • Version number (version)

  • Final slot:

    keccak256(
    	abi.encode(
    		uint256(
    			keccak256(
    				abi.encodePacked(
    					"mellow.flexible-vaults.storage.",
    					contractName,
    					name, version
    				)
    			)
    		) - 1
    	)
    ) & ~bytes32(uint256(0xff));

This structure ensures:

  • Namespacing: Prevents overlap between different modules (ShareModule, FeeManager, etc.)

  • Instance separation: Multiple deployments with different names produce distinct slots

  • Versioning: Upgrades can cleanly migrate to new versions without collision

Function

getSlot(string contractName, string name, uint256 version) → bytes32

Description:

Computes a deterministic, collision-resistant storage slot for a contract module.

Parameters:

  • contractName: Logical name of the module (e.g., "ShareModule")

  • name: Instance identifier or label (e.g., "Mellow")

  • version: Numeric version for versioned slot separation

Returns:

  • A bytes32 value representing the computed storage slot

Example:

bytes32 slot = SlotLibrary.getSlot("FeeManager", "Mellow", 1);