Skip to content

InstitutionalVaultController

Inherits: Initializable, AccessControlledV8

Title: InstitutionalVaultController

Central orchestrator for the Institutional Vault system. Deploys vault clones, maintains the registry, holds the Venus ACM reference, and proxies governance operations to vaults.

Deployed as a transparent proxy (upgradeable via ProxyAdmin).

uint256 public constant MANTISSA_ONE = 1e18

Maximum allowed multiplier for rate parameters (LI, LP). Caps bonus/penalty at 50% above mantissa.

uint256 public constant MANTISSA_ONE_AND_HALF = 1.5e18

Maximum allowed fixed APY in basis points (100% = 10 000 bps). Interest is calculated as: totalRaised * fixedAPY * lockDuration / (BPS * YEAR).

uint256 public constant MAX_APY_BPS = 10_000

InstitutionalLoanVault implementation address for cloning.

address public vaultImplementation

LiquidationAdapter contract address.

address public liquidationAdapter

Venus ResilientOracle address.

address public oracle

Venus ProtocolShareReserve (PSR) address.

address public protocolShareReserve

Comptroller address for PSR integration.

address public comptroller

Treasury address — recipient for swept tokens.

address public treasury

InstitutionPositionToken contract address.

IInstitutionPositionToken public positionToken

Array of all deployed vault addresses.

address[] public allVaults

Whether a vault is registered.

mapping(address => bool) public isRegistered

Per-institution deploy counter (for CREATE2 salt).

mapping(address => uint256) public institutionNonce

Note: oz-upgrades-unsafe-allow: constructor

constructor();

Initializes the controller proxy.

function initialize(
address vaultImplementation_,
address oracle_,
address protocolShareReserve_,
address comptroller_,
address treasury_,
address positionToken_,
address acm_
) external initializer;

Parameters

NameTypeDescription
vaultImplementation_addressInstitutionalLoanVault implementation for cloning.
oracle_addressVenus ResilientOracle address.
protocolShareReserve_addressPSR address.
comptroller_addressComptroller address for PSR.
treasury_addressTreasury address — recipient for swept tokens.
positionToken_addressInstitutionPositionToken address.
acm_addressVenus AccessControlManager address.

Accepts pending ownership of the InstitutionPositionToken. Required because PositionToken uses Ownable2Step. Call after transferOwnership.

function acceptPositionTokenOwnership() external;

Deploys a new vault clone via deterministic CREATE2.

Note: event: VaultCreated

function createVault(
VaultConfig calldata _vaultConfig,
InstitutionalConfig calldata _instConfig,
RiskConfig calldata _riskConfig,
string calldata _name,
string calldata _symbol
) external returns (address vault);

Parameters

NameTypeDescription
_vaultConfigVaultConfigShared vault configuration (asset, rates, caps, timing).
_instConfigInstitutionalConfigInstitutional-specific configuration (collateral, sizing, position identity).
_riskConfigRiskConfigRisk parameters.
_namestringERC-20 share token name for the deployed vault.
_symbolstringERC-20 share token symbol for the deployed vault.

Returns

NameTypeDescription
vaultaddressDeployed vault address.

Transitions MarginDeposited -> Fundraising on a vault.

Note: error: VaultNotRegistered If vault is not in the registry.

function openVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Cancels a pre-launch vault and refunds any deposited collateral to the NFT position holder. Callable only on a vault still in WaitingForMargin or MarginDeposited.

Note: error: VaultNotRegistered If vault is not in the registry.

function cancelVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Partial pause — blocks general operations; repay and liquidation remain available.

Note: error: VaultNotRegistered If vault is not in the registry.

function partialPauseVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Complete pause — blocks all operations including repay and liquidation.

Note: error: VaultNotRegistered If vault is not in the registry.

function completePauseVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Unpause vault — removes all pause restrictions.

Note: error: VaultNotRegistered If vault is not in the registry.

function unpauseVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Transitions vault to Closed state. All operations are blocked after this point.

Note: error: VaultNotRegistered If vault is not in the registry.

function closeVault(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Recovers stuck tokens from a vault to treasury.

Note: error: VaultNotRegistered If vault is not in the registry.

function sweep(address vault, address token) external;

Parameters

NameTypeDescription
vaultaddressVault address.
tokenaddressToken address to sweep.

Approves transfer of the vault’s position token to a specific recipient.

Note: error: VaultNotRegistered If vault is not in the registry.

function approvePositionTransfer(address vault, address recipient) external;

Parameters

NameTypeDescription
vaultaddressVault address.
recipientaddressThe address that must be the destination of the next transfer.

Revokes a previously granted approval.

Note: error: VaultNotRegistered If vault is not in the registry.

function revokePositionTransfer(address vault) external;

Parameters

NameTypeDescription
vaultaddressVault address.

Updates liquidation threshold on a vault.

Notes:

  • error: VaultNotRegistered If vault is not in the registry.
  • error: InvalidLiquidationThreshold If newLT == 0 or newLT > MANTISSA_ONE.
  • event: LiquidationThresholdUpdated
function setLiquidationThreshold(address vault, uint256 newLT) external;

Parameters

NameTypeDescription
vaultaddressVault address.
newLTuint256New liquidation threshold (mantissa).

Updates liquidation incentive on a vault.

Notes:

  • error: VaultNotRegistered If vault is not in the registry.
  • error: InvalidLiquidationIncentive If newLI <= MANTISSA_ONE or newLI > MANTISSA_ONE_AND_HALF.
  • event: LiquidationIncentiveUpdated
function setLiquidationIncentive(address vault, uint256 newLI) external;

Parameters

NameTypeDescription
vaultaddressVault address.
newLIuint256New liquidation incentive (mantissa). Must be in range (MANTISSA_ONE, MANTISSA_ONE_AND_HALF].

Updates late penalty rate on a vault.

Notes:

  • error: VaultNotRegistered If vault is not in the registry.
  • error: InvalidLatePenaltyRate If newRate <= MANTISSA_ONE or newRate > MANTISSA_ONE_AND_HALF.
  • event: LatePenaltyRateUpdated
function setLatePenaltyRate(address vault, uint256 newRate) external;

Parameters

NameTypeDescription
vaultaddressVault address.
newRateuint256New late penalty rate (mantissa). Must be in range (MANTISSA_ONE, MANTISSA_ONE_AND_HALF].

Update clone source. Only affects future vaults.

Notes:

  • error: InvalidAddress if zero address.
  • event: VaultImplementationUpdated
function setVaultImplementation(address impl) external;

Parameters

NameTypeDescription
impladdressNew implementation address.

Update LiquidationAdapter address.

Notes:

  • error: InvalidAddress if zero address.
  • event: LiquidationAdapterUpdated
function setLiquidationAdapter(address adapter) external;

Parameters

NameTypeDescription
adapteraddressNew adapter address.

Update ResilientOracle reference.

Notes:

  • error: InvalidAddress if zero address.
  • event: OracleUpdated
function setOracle(address oracle_) external;

Parameters

NameTypeDescription
oracle_addressNew oracle address.

Update ProtocolShareReserve address.

Notes:

  • error: InvalidAddress if zero address.
  • event: ProtocolShareReserveUpdated
function setProtocolShareReserve(address psr) external;

Parameters

NameTypeDescription
psraddressNew PSR address.

Update comptroller address for PSR.

Notes:

  • error: InvalidAddress if zero address.
  • event: ComptrollerUpdated
function setComptroller(address comptroller_) external;

Parameters

NameTypeDescription
comptroller_addressNew comptroller address.

Update treasury address for swept tokens.

Notes:

  • error: InvalidAddress if zero address.
  • event: TreasuryUpdated
function setTreasury(address treasury_) external;

Parameters

NameTypeDescription
treasury_addressNew treasury address.

Predicts the next vault address for a given institution.

function predictVaultAddress(address institution) external view returns (address);

Parameters

NameTypeDescription
institutionaddressInstitution operator address.

Returns

NameTypeDescription
<none>addressPredicted vault address.

Returns state summary for all registered vaults.

function getAggregatedVaultStates() external view returns (VaultStateInfo[] memory);

Returns

NameTypeDescription
<none>VaultStateInfo[]Array of VaultStateInfo structs.

Returns total number of deployed vaults.

function allVaultsLength() external view returns (uint256);

Returns

NameTypeDescription
<none>uint256Number of vaults in registry.

Disabled — renouncing ownership would permanently brick ACM-gated vault governance.

Note: error: OwnershipCannotBeRenounced Always reverts.

function renounceOwnership() public pure override;
event VaultCreated(address indexed vault, address indexed institution);
event VaultImplementationUpdated(address indexed oldImpl, address indexed newImpl);
event LiquidationAdapterUpdated(address indexed oldAdapter, address indexed newAdapter);
event OracleUpdated(address indexed oldOracle, address indexed newOracle);
event ProtocolShareReserveUpdated(address indexed oldPSR, address indexed newPSR);
event ComptrollerUpdated(address indexed oldComptroller, address indexed newComptroller);
event TreasuryUpdated(address indexed oldTreasury, address indexed newTreasury);
event LiquidationThresholdUpdated(address indexed vault, uint256 newLT);
event LiquidationIncentiveUpdated(address indexed vault, uint256 newLI);
event LatePenaltyRateUpdated(address indexed vault, uint256 newRate);
error VaultNotRegistered();
error InvalidConfig();
error InvalidLiquidationThreshold();
error InvalidLiquidationIncentive();
error InvalidLatePenaltyRate();
error InvalidAddress();
error OwnershipCannotBeRenounced();