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).
Solidity API
Section titled “Solidity API”State Variables
Section titled “State Variables”MANTISSA_ONE
Section titled “MANTISSA_ONE”uint256 public constant MANTISSA_ONE = 1e18MANTISSA_ONE_AND_HALF
Section titled “MANTISSA_ONE_AND_HALF”Maximum allowed multiplier for rate parameters (LI, LP). Caps bonus/penalty at 50% above mantissa.
uint256 public constant MANTISSA_ONE_AND_HALF = 1.5e18MAX_APY_BPS
Section titled “MAX_APY_BPS”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_000vaultImplementation
Section titled “vaultImplementation”InstitutionalLoanVault implementation address for cloning.
address public vaultImplementationliquidationAdapter
Section titled “liquidationAdapter”LiquidationAdapter contract address.
address public liquidationAdapteroracle
Section titled “oracle”Venus ResilientOracle address.
address public oracleprotocolShareReserve
Section titled “protocolShareReserve”Venus ProtocolShareReserve (PSR) address.
address public protocolShareReservecomptroller
Section titled “comptroller”Comptroller address for PSR integration.
address public comptrollertreasury
Section titled “treasury”Treasury address — recipient for swept tokens.
address public treasurypositionToken
Section titled “positionToken”InstitutionPositionToken contract address.
IInstitutionPositionToken public positionTokenallVaults
Section titled “allVaults”Array of all deployed vault addresses.
address[] public allVaultsisRegistered
Section titled “isRegistered”Whether a vault is registered.
mapping(address => bool) public isRegisteredinstitutionNonce
Section titled “institutionNonce”Per-institution deploy counter (for CREATE2 salt).
mapping(address => uint256) public institutionNonceFunctions
Section titled “Functions”constructor
Section titled “constructor”Note: oz-upgrades-unsafe-allow: constructor
constructor();initialize
Section titled “initialize”Initializes the controller proxy.
function initialize( address vaultImplementation_, address oracle_, address protocolShareReserve_, address comptroller_, address treasury_, address positionToken_, address acm_) external initializer;Parameters
| Name | Type | Description |
|---|---|---|
vaultImplementation_ | address | InstitutionalLoanVault implementation for cloning. |
oracle_ | address | Venus ResilientOracle address. |
protocolShareReserve_ | address | PSR address. |
comptroller_ | address | Comptroller address for PSR. |
treasury_ | address | Treasury address — recipient for swept tokens. |
positionToken_ | address | InstitutionPositionToken address. |
acm_ | address | Venus AccessControlManager address. |
acceptPositionTokenOwnership
Section titled “acceptPositionTokenOwnership”Accepts pending ownership of the InstitutionPositionToken. Required because PositionToken uses Ownable2Step. Call after transferOwnership.
function acceptPositionTokenOwnership() external;createVault
Section titled “createVault”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
| Name | Type | Description |
|---|---|---|
_vaultConfig | VaultConfig | Shared vault configuration (asset, rates, caps, timing). |
_instConfig | InstitutionalConfig | Institutional-specific configuration (collateral, sizing, position identity). |
_riskConfig | RiskConfig | Risk parameters. |
_name | string | ERC-20 share token name for the deployed vault. |
_symbol | string | ERC-20 share token symbol for the deployed vault. |
Returns
| Name | Type | Description |
|---|---|---|
vault | address | Deployed vault address. |
openVault
Section titled “openVault”Transitions MarginDeposited -> Fundraising on a vault.
Note: error: VaultNotRegistered If vault is not in the registry.
function openVault(address vault) external;Parameters
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
cancelVault
Section titled “cancelVault”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
partialPauseVault
Section titled “partialPauseVault”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
completePauseVault
Section titled “completePauseVault”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
unpauseVault
Section titled “unpauseVault”Unpause vault — removes all pause restrictions.
Note: error: VaultNotRegistered If vault is not in the registry.
function unpauseVault(address vault) external;Parameters
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
closeVault
Section titled “closeVault”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault 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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
token | address | Token address to sweep. |
approvePositionTransfer
Section titled “approvePositionTransfer”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
recipient | address | The address that must be the destination of the next transfer. |
revokePositionTransfer
Section titled “revokePositionTransfer”Revokes a previously granted approval.
Note: error: VaultNotRegistered If vault is not in the registry.
function revokePositionTransfer(address vault) external;Parameters
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
setLiquidationThreshold
Section titled “setLiquidationThreshold”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
newLT | uint256 | New liquidation threshold (mantissa). |
setLiquidationIncentive
Section titled “setLiquidationIncentive”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
newLI | uint256 | New liquidation incentive (mantissa). Must be in range (MANTISSA_ONE, MANTISSA_ONE_AND_HALF]. |
setLatePenaltyRate
Section titled “setLatePenaltyRate”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
| Name | Type | Description |
|---|---|---|
vault | address | Vault address. |
newRate | uint256 | New late penalty rate (mantissa). Must be in range (MANTISSA_ONE, MANTISSA_ONE_AND_HALF]. |
setVaultImplementation
Section titled “setVaultImplementation”Update clone source. Only affects future vaults.
Notes:
- error: InvalidAddress if zero address.
- event: VaultImplementationUpdated
function setVaultImplementation(address impl) external;Parameters
| Name | Type | Description |
|---|---|---|
impl | address | New implementation address. |
setLiquidationAdapter
Section titled “setLiquidationAdapter”Update LiquidationAdapter address.
Notes:
- error: InvalidAddress if zero address.
- event: LiquidationAdapterUpdated
function setLiquidationAdapter(address adapter) external;Parameters
| Name | Type | Description |
|---|---|---|
adapter | address | New adapter address. |
setOracle
Section titled “setOracle”Update ResilientOracle reference.
Notes:
- error: InvalidAddress if zero address.
- event: OracleUpdated
function setOracle(address oracle_) external;Parameters
| Name | Type | Description |
|---|---|---|
oracle_ | address | New oracle address. |
setProtocolShareReserve
Section titled “setProtocolShareReserve”Update ProtocolShareReserve address.
Notes:
- error: InvalidAddress if zero address.
- event: ProtocolShareReserveUpdated
function setProtocolShareReserve(address psr) external;Parameters
| Name | Type | Description |
|---|---|---|
psr | address | New PSR address. |
setComptroller
Section titled “setComptroller”Update comptroller address for PSR.
Notes:
- error: InvalidAddress if zero address.
- event: ComptrollerUpdated
function setComptroller(address comptroller_) external;Parameters
| Name | Type | Description |
|---|---|---|
comptroller_ | address | New comptroller address. |
setTreasury
Section titled “setTreasury”Update treasury address for swept tokens.
Notes:
- error: InvalidAddress if zero address.
- event: TreasuryUpdated
function setTreasury(address treasury_) external;Parameters
| Name | Type | Description |
|---|---|---|
treasury_ | address | New treasury address. |
predictVaultAddress
Section titled “predictVaultAddress”Predicts the next vault address for a given institution.
function predictVaultAddress(address institution) external view returns (address);Parameters
| Name | Type | Description |
|---|---|---|
institution | address | Institution operator address. |
Returns
| Name | Type | Description |
|---|---|---|
<none> | address | Predicted vault address. |
getAggregatedVaultStates
Section titled “getAggregatedVaultStates”Returns state summary for all registered vaults.
function getAggregatedVaultStates() external view returns (VaultStateInfo[] memory);Returns
| Name | Type | Description |
|---|---|---|
<none> | VaultStateInfo[] | Array of VaultStateInfo structs. |
allVaultsLength
Section titled “allVaultsLength”Returns total number of deployed vaults.
function allVaultsLength() external view returns (uint256);Returns
| Name | Type | Description |
|---|---|---|
<none> | uint256 | Number of vaults in registry. |
renounceOwnership
Section titled “renounceOwnership”Disabled — renouncing ownership would permanently brick ACM-gated vault governance.
Note: error: OwnershipCannotBeRenounced Always reverts.
function renounceOwnership() public pure override;Events
Section titled “Events”VaultCreated
Section titled “VaultCreated”event VaultCreated(address indexed vault, address indexed institution);VaultImplementationUpdated
Section titled “VaultImplementationUpdated”event VaultImplementationUpdated(address indexed oldImpl, address indexed newImpl);LiquidationAdapterUpdated
Section titled “LiquidationAdapterUpdated”event LiquidationAdapterUpdated(address indexed oldAdapter, address indexed newAdapter);OracleUpdated
Section titled “OracleUpdated”event OracleUpdated(address indexed oldOracle, address indexed newOracle);ProtocolShareReserveUpdated
Section titled “ProtocolShareReserveUpdated”event ProtocolShareReserveUpdated(address indexed oldPSR, address indexed newPSR);ComptrollerUpdated
Section titled “ComptrollerUpdated”event ComptrollerUpdated(address indexed oldComptroller, address indexed newComptroller);TreasuryUpdated
Section titled “TreasuryUpdated”event TreasuryUpdated(address indexed oldTreasury, address indexed newTreasury);LiquidationThresholdUpdated
Section titled “LiquidationThresholdUpdated”event LiquidationThresholdUpdated(address indexed vault, uint256 newLT);LiquidationIncentiveUpdated
Section titled “LiquidationIncentiveUpdated”event LiquidationIncentiveUpdated(address indexed vault, uint256 newLI);LatePenaltyRateUpdated
Section titled “LatePenaltyRateUpdated”event LatePenaltyRateUpdated(address indexed vault, uint256 newRate);Errors
Section titled “Errors”VaultNotRegistered
Section titled “VaultNotRegistered”error VaultNotRegistered();InvalidConfig
Section titled “InvalidConfig”error InvalidConfig();InvalidLiquidationThreshold
Section titled “InvalidLiquidationThreshold”error InvalidLiquidationThreshold();InvalidLiquidationIncentive
Section titled “InvalidLiquidationIncentive”error InvalidLiquidationIncentive();InvalidLatePenaltyRate
Section titled “InvalidLatePenaltyRate”error InvalidLatePenaltyRate();InvalidAddress
Section titled “InvalidAddress”error InvalidAddress();OwnershipCannotBeRenounced
Section titled “OwnershipCannotBeRenounced”error OwnershipCannotBeRenounced();