Skip to main content

SubVaultsRegistry

Git Source ↗

Inherits: Initializable ↗, UUPSUpgradeable ↗, ReentrancyGuardUpgradeable ↗, Multicall, ISubVaultsRegistry

Defines the functionality for managing the Vault sub-vaults. This contract is deployed per MetaVault.

State Variables

_maxSubVaults

uint256 private constant _maxSubVaults = 50

_maxPercent

uint256 private constant _maxPercent = 1e18

_curatorsRegistry

address private immutable _curatorsRegistry

_vaultsRegistry

address private immutable _vaultsRegistry

_keeper

address private immutable _keeper

_osTokenVaultController

IOsTokenVaultController private immutable _osTokenVaultController

_osTokenConfig

IOsTokenConfig private immutable _osTokenConfig

metaVault

The address of the meta vault

address public override metaVault

subVaultsCurator

The address of the sub-vaults curator

address public override subVaultsCurator

pendingMetaSubVault

Pending meta sub-vault waiting for approval

address public override pendingMetaSubVault

subVaultsRewardsNonce

Function to get the rewards nonce of the sub-vaults

uint128 public override subVaultsRewardsNonce

ejectingSubVault

The address of the sub-vault being ejected

address public override ejectingSubVault

ejectingSubVaultShares

The number of shares of the ejecting sub-vault

uint256 public override ejectingSubVaultShares

_subVaults

EnumerableSet.AddressSet private _subVaults

_subVaultsExits

mapping(address vault => DoubleEndedQueue.Bytes32Deque) private _subVaultsExits

_subVaultsStates

mapping(address vault => SubVaultState state) private _subVaultsStates

subVaultsTotalAssets

The total assets deposited to sub-vaults

uint128 public override subVaultsTotalAssets

_totalProcessedExitQueueTickets

uint256 private _totalProcessedExitQueueTickets

_unaccountedExitedAssets

uint256 private _unaccountedExitedAssets

__gap

This empty reserved space is put in place to allow future versions to add new variables without shifting down storage in the inheritance chain. See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps

uint256[50] private __gap

Functions

onlyMetaVaultAdmin

Modifier to check if the caller is the meta vault admin

modifier onlyMetaVaultAdmin() ;

constructor

Constructor

constructor(
address curatorsRegistry,
address vaultsRegistry,
address keeper,
address osTokenVaultController,
address osTokenConfig
) ;

Parameters

NameTypeDescription
curatorsRegistryaddressThe address of the CuratorsRegistry contract
vaultsRegistryaddressThe address of the VaultsRegistry contract
keeperaddressThe address of the Keeper contract
osTokenVaultControlleraddressThe address of the OsTokenVaultController contract
osTokenConfigaddressThe address of the OsTokenConfig contract

_authorizeUpgrade

Function that should revert when msg.sender is not authorized to upgrade the contract. Called by upgradeToAndCall. Normally, this function will use an access control modifier such as Ownable-onlyOwner.

function _authorizeUpgrade(address) internal onlyOwner {}
function _authorizeUpgrade(address) internal view override;

initialize

Initializes the SubVaultsRegistry

function initialize(address _metaVault, address curator) external override initializer;

Parameters

NameTypeDescription
_metaVaultaddress
curatoraddressThe address of initial sub-vaults curator

getSubVaults

Returns the list of sub-vaults

function getSubVaults() public view override returns (address[] memory);

Returns

NameTypeDescription
<none>address[]The array of sub-vault addresses

isSubVault

Checks if the given address is a sub-vault

function isSubVault(address vault) public view override returns (bool);

Parameters

NameTypeDescription
vaultaddressThe address to check

Returns

NameTypeDescription
<none>boolTrue if the address is a sub-vault, false otherwise

setSubVaultsCurator

Function to update the sub-vaults curator. Can only be called by the meta vault admin.

function setSubVaultsCurator(address curator) external override onlyMetaVaultAdmin;

Parameters

NameTypeDescription
curatoraddressThe address of the new sub-vaults curator

addSubVault

Function to add a new sub-vault. Can only be called by the meta vault admin.

function addSubVault(address vault) external override onlyMetaVaultAdmin;

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault to add

acceptMetaSubVault

Function to accept a meta sub-vault. Can only be called by the VaultsRegistry owner.

function acceptMetaSubVault(address metaSubVault) external override;

Parameters

NameTypeDescription
metaSubVaultaddressThe address of the meta sub-vault to accept

rejectMetaSubVault

Function to reject a meta sub-vault. Can only be called by the VaultsRegistry owner or meta vault admin.

function rejectMetaSubVault(address metaSubVault) external override;

Parameters

NameTypeDescription
metaSubVaultaddressThe address of the meta sub-vault to reject

ejectSubVault

Function to eject a sub-vault. Can only be called by the meta vault admin. All the sub-vault shares will be added to the exit queue.

function ejectSubVault(address vault) external override onlyMetaVaultAdmin;

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault to eject

subVaultsStates

Returns the state of a sub-vault

function subVaultsStates(address vault) external view override returns (SubVaultState memory);

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault

Returns

NameTypeDescription
<none>SubVaultStateThe state of the sub-vault

subVaultsExits

Returns the exits queue for a sub-vault

function subVaultsExits(address vault) external view override returns (bytes32[] memory);

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault

Returns

NameTypeDescription
<none>bytes32[]The array of packed exit data (positionTicket: uint160, shares: uint96)

canUpdateState

Checks whether the state can be updated

function canUpdateState() external view override returns (bool);

Returns

NameTypeDescription
<none>boolTrue if the state can be updated, false otherwise

isCollateralized

Checks whether the meta vault is collateralized

function isCollateralized() public view override returns (bool);

Returns

NameTypeDescription
<none>boolTrue if the meta vault is collateralized, false otherwise

isStateUpdateRequired

Checks whether the state update is required

function isStateUpdateRequired() public view override returns (bool);

Returns

NameTypeDescription
<none>boolTrue if the state update is required, false otherwise

depositToSubVaults

Deposit available assets to the sub vaults

function depositToSubVaults() external override nonReentrant;

claimSubVaultsExitedAssets

Claims exited assets from sub vaults

function claimSubVaultsExitedAssets(SubVaultExitRequest[] calldata exitRequests) external override nonReentrant;

Parameters

NameTypeDescription
exitRequestsSubVaultExitRequest[]The array of exit requests to claim

harvestSubVaultsAssets

Harvests sub-vaults assets. Can only be called by the meta vault.

function harvestSubVaultsAssets() external override returns (int256 totalAssetsDelta, bool harvested);

Returns

NameTypeDescription
totalAssetsDeltaint256The change in total assets after the harvest
harvestedboolWhether the sub-vaults were harvested

enterSubVaultsExitQueue

Enters the exit queue for sub-vaults. Can only be called by the meta vault.

function enterSubVaultsExitQueue() external override nonReentrant;

calculateSubVaultsRedemptions

Calculates the required sub-vaults exit requests to fulfill the assets to redeem

function calculateSubVaultsRedemptions(uint256 assetsToRedeem)
external
view
override
returns (ISubVaultsCurator.ExitRequest[] memory redeemRequests);

Parameters

NameTypeDescription
assetsToRedeemuint256The amount of assets to redeem

Returns

NameTypeDescription
redeemRequestsISubVaultsCurator.ExitRequest[]The array of sub-vaults exit requests

redeemSubVaultsAssets

Redeems assets from sub-vaults to the meta vault. Can only be called by the redeemer.

function redeemSubVaultsAssets(uint256 assetsToRedeem)
external
override
nonReentrant
returns (uint256 totalRedeemedAssets);

Parameters

NameTypeDescription
assetsToRedeemuint256The amount of assets to redeem to the meta vault

Returns

NameTypeDescription
totalRedeemedAssetsuint256The total amount of assets redeemed from sub-vaults

_calculateSubVaultsRedemptions

Internal function to calculate the required sub-vaults exit requests to fulfill the assets to redeem

function _calculateSubVaultsRedemptions(uint256 assetsToRedeem, bool useEjectingSubVaultShares)
private
view
returns (ISubVaultsCurator.ExitRequest[] memory redeemRequests);

Parameters

NameTypeDescription
assetsToRedeemuint256The amount of assets to redeem
useEjectingSubVaultSharesboolWhether to use ejecting sub-vault shares

Returns

NameTypeDescription
redeemRequestsISubVaultsCurator.ExitRequest[]The array of sub-vaults exit requests

_getSubVaultsBalances

Returns the balances of the given sub-vaults

function _getSubVaultsBalances(address[] memory vaults, bool calcNewTotalAssets)
private
view
returns (uint256[] memory balances, uint256 newTotalAssets, uint256 totalStakedAssets);

Parameters

NameTypeDescription
vaultsaddress[]The addresses of the sub-vaults
calcNewTotalAssetsboolWhether to calculate the new total assets across all sub-vaults

Returns

NameTypeDescription
balancesuint256[]The balances of the sub-vaults
newTotalAssetsuint256The new total assets across all sub-vaults
totalStakedAssetsuint256The sum of the staked balances across all sub-vaults

_checkHarvested

Internal function to check whether the sub-vaults are harvested

function _checkHarvested() private view;

_checkSubVaultsExitClaims

Internal function to check whether the sub vaults have claimed processed exit queue tickets

function _checkSubVaultsExitClaims(address[] memory vaults) private view;

Parameters

NameTypeDescription
vaultsaddress[]The addresses of the sub vaults

_syncRewardsNonce

Internal function to check whether the vaults are harvested

function _syncRewardsNonce(address[] memory vaults) private returns (bool);

Parameters

NameTypeDescription
vaultsaddress[]The addresses of the vaults

Returns

NameTypeDescription
<none>boolWhether the nonce has been updated

_consumeEjectingSubVaultAssets

Internal function to consume ejecting sub-vault assets

function _consumeEjectingSubVaultAssets(uint256 unprocessedAssets) private returns (uint256 processedAssets);

Parameters

NameTypeDescription
unprocessedAssetsuint256The amount of unprocessed assets

Returns

NameTypeDescription
processedAssetsuint256The amount of processed assets

_setSubVaultsCurator

Internal function to set the sub-vaults curator

function _setSubVaultsCurator(address curator) private;

Parameters

NameTypeDescription
curatoraddressThe address of the sub-vaults curator

_validateSubVault

Internal function to validate the addition of a sub-vault

function _validateSubVault(address vault) private view;

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault to be added

_addSubVault

Internal function to add a sub-vault

function _addSubVault(address vault) private;

Parameters

NameTypeDescription
vaultaddressThe address of the sub-vault to add

_isMetaVault

Internal function to check whether the vault is a meta vault

function _isMetaVault(address vault) private view returns (bool);

Parameters

NameTypeDescription
vaultaddressThe address of the vault

Returns

NameTypeDescription
<none>boolTrue if the vault is a meta vault, false otherwise

_isSubVaultCollateralized

Internal function to check whether the sub-vault is collateralized

function _isSubVaultCollateralized(address subVault) private view returns (bool);

Parameters

NameTypeDescription
subVaultaddressThe address of the sub-vault

Returns

NameTypeDescription
<none>boolTrue if the sub-vault is collateralized, false otherwise

_getSubVaultRewardsNonce

Internal function to get the rewards nonce of a sub-vault

function _getSubVaultRewardsNonce(address subVault) private view returns (uint256);

Parameters

NameTypeDescription
subVaultaddressThe address of the sub-vault

Returns

NameTypeDescription
<none>uint256The rewards nonce of the sub-vault

_getCurrentRewardsNonce

Internal function to get the current rewards nonce from the Keeper contract

function _getCurrentRewardsNonce() private view returns (uint256);

Returns

NameTypeDescription
<none>uint256The current rewards nonce

_processRedeemRequests

Processes the given redeem requests

function _processRedeemRequests(address redeemer, ISubVaultsCurator.ExitRequest[] memory redeemRequests)
private
returns (uint256 totalRedeemedAssets);

Parameters

NameTypeDescription
redeemeraddressThe address of the redeemer
redeemRequestsISubVaultsCurator.ExitRequest[]The redeem requests to process

Returns

NameTypeDescription
totalRedeemedAssetsuint256The total amount of redeemed assets