Smart Contract Reference
Every external/public entry point on the vault implementation, grouped by caller, with the v0.5.x differences.
Full ABI reference for the v0.6.0 vault implementation, grouped by who can call each function. Entries marked (New in v0.6.0.) do not exist on v0.5.x; where a function exists in both versions but behaves differently, a tab shows both. Inherited OpenZeppelin ERC20 functions (balanceOf, totalSupply, approve, allowance, name, symbol) are not repeated unless the vault overrides their behaviour. transfer and transferFrom are listed because v0.6.0 adds access checks on both sides in blacklist mode.
The raw ABI JSON for every implementation version is on the Vault ABIs page.
Jump to a role
Anyone (user-facing) — deposit / redeem / sync flows, operators, views, ERC20 overrides.
Curator — settlement, claim-on-behalf, sync mode, HWM, close.
Valuation Manager — propose new total assets (gated by guardrails).
Security Council — emergency valuation, guardrails policy.
Access Manager — whitelist / blacklist / external sanctions list.
Owner (Admin) — lifecycle, roles, access mode, fees, metadata.
Super Operator — global operator that bypasses whitelist / blacklist.
GuardRailsManager — compliance check used by the vault.
Silo — pending-funds helper contract.
Anyone (user-facing)
Deposit flow (async)
requestDeposit
Submit assets to the pending silo, queued for the next settlement. Auto-claims any previously claimable amount for controller. The caller must be the owner or an approved operator of owner.
Same, but only while the valuation is expired: while isTotalAssetsValid() is true it reverts with OnlySyncDepositAllowed and deposits must use syncDeposit. There is no deposit cap.
Parameters:
assets
uint256
Amount of underlying assets to deposit.
controller
address
Address that will own the request and claim the resulting shares.
owner
address
Address whose assets are pulled. Must equal msg.sender or have approved the caller as operator.
Return values:
requestId
uint256
Epoch-based request identifier.
requestDeposit (with referral)
Same as requestDeposit above, but emits a Referral event tagging referral (on v0.6.0, only when referral is not address(0)).
Parameters:
assets
uint256
Amount of underlying assets to deposit.
controller
address
Address that will own the request and claim the resulting shares.
owner
address
Address whose assets are pulled.
referral
address
Address logged as the referrer.
Return values:
requestId
uint256
Epoch-based request identifier.
cancelRequestDeposit
Pull pending assets back from the silo. Only valid in the same epoch as the request. Cancels the caller's own pending deposit.
cancelRequestDeposit (on behalf)
Cancel a pending deposit on behalf of another controller. The caller must be an operator or super operator of controller. (New in v0.6.0.)
Parameters:
controller
address
Controller whose pending deposit is being cancelled.
deposit
Claim shares after settlement. Uses msg.sender as the request controller.
Parameters:
assets
uint256
Amount of assets to claim shares against.
receiver
address
Address receiving the shares.
Return values:
shares
uint256
Shares minted to receiver.
deposit (with controller)
Claim shares from a settled request owned by controller. The caller must be an operator or super operator of controller.
Parameters:
assets
uint256
Amount of assets to claim shares against.
receiver
address
Address receiving the shares.
controller
address
Controller that owns the deposit request.
Return values:
shares
uint256
Shares minted to receiver.
mint
Same as deposit but the caller specifies the share amount instead of the asset amount.
Parameters:
shares
uint256
Shares to claim.
receiver
address
Address receiving the shares.
Return values:
assets
uint256
Assets consumed from the claimable balance.
mint (with controller)
Same as mint above, on behalf of controller. The caller must be an operator or super operator of controller.
Parameters:
shares
uint256
Shares to claim.
receiver
address
Address receiving the shares.
controller
address
Controller that owns the deposit request.
Return values:
assets
uint256
Assets consumed from the claimable balance.
Deposit flow (sync, when SyncMode allows)
syncDeposit
Atomic deposit — mints shares immediately at the current price per share. Reverts with SyncOperationNotAllowed if the current SyncMode disables sync deposits (always the case on an async-only vault), with TotalAssetsExpired once the valuation has expired, and with NotOpen unless the vault is open.
Atomic deposit — mints shares immediately at the current price per share. Available while isTotalAssetsValid() is true, otherwise reverts with OnlyAsyncDepositAllowed. There is no sync mode and no entry fee.
Parameters:
assets
uint256
Amount of underlying assets to deposit.
receiver
address
Address receiving the shares.
referral
address
Address logged as the referrer (use address(0) for none).
Return values:
shares
uint256
Shares minted at the current valuation, net of the entry fee on v0.6.0.
Redeem flow (async)
requestRedeem
Transfer shares to the pending silo, queued for the next redeem settlement.
Parameters:
shares
uint256
Number of shares to redeem.
controller
address
Address that will own the request and claim the resulting assets.
owner
address
Address whose shares are pulled. Must equal msg.sender or have approved the caller as operator.
Return values:
requestId
uint256
Epoch-based request identifier.
cancelRequestRedeem
Pull pending shares back from the silo to controller. The caller must be controller itself or an operator or super operator of controller. (New in v0.6.0.)
Parameters:
controller
address
Controller whose pending redeem is being cancelled.
claimSharesAndRequestRedeem
UX bundle: claim any claimable (settled) deposit first, then request a redeem of sharesToRedeem. If there is nothing claimable, behaves like requestRedeem(sharesToRedeem, msg.sender, msg.sender).
Parameters:
sharesToRedeem
uint256
Number of shares to redeem after claiming.
Return values:
requestId
uint40
Epoch-based request identifier of the new redeem request.
redeem
Claim assets after redeem settlement (or in sync if the vault is closed). When called by an operator or super operator of controller, the operator check is bypassed appropriately.
Parameters:
shares
uint256
Shares to convert into assets.
receiver
address
Address receiving the assets.
controller
address
Controller that owns the redeem request (or share balance, if vault is closed).
Return values:
assets
uint256
Assets transferred to receiver.
withdraw
Same as redeem but specified by asset amount.
Parameters:
assets
uint256
Amount of assets to withdraw.
receiver
address
Address receiving the assets.
controller
address
Controller that owns the redeem request (or share balance, if vault is closed).
Return values:
shares
uint256
Shares burned.
Redeem flow (sync, when SyncMode allows)
syncRedeem
Atomic redeem with slippage protection. Burns shares immediately and pays assets directly from the Curator address. (New in v0.6.0.)
Parameters:
shares
uint256
Shares to redeem.
receiver
address
Address receiving the assets.
minimumAssets
uint256
Minimum assets expected after exit fee and haircut. Reverts if the actual output is lower.
Return values:
assets
uint256
Assets transferred to receiver, net of exit fee and haircut.
Operators
setOperator
Authorize or revoke an operator that can request and claim on the caller's behalf.
Parameters:
operator
address
Operator address.
approved
bool
true to approve, false to revoke.
Return values:
success
bool
Always true.
ERC20 (with extra access checks)
In blacklist mode, the vault overrides transfer and transferFrom to require isAllowed on the sender, the recipient and the caller (the Super Operator skips these checks and the allowance on transferFrom). In whitelist mode, share transfers have no access check, as on v0.5.x.
Shares are a standard ERC20: transfer and transferFrom have no access check, and only revert while the vault is paused.
transfer
Standard ERC20 transfer. In blacklist mode, also requires isAllowed(msg.sender) and isAllowed(to).
Parameters:
to
address
Recipient. Must pass isAllowed in blacklist mode.
value
uint256
Amount of shares to transfer.
Return values:
(unnamed)
bool
Always true on success.
transferFrom
Standard ERC20 transferFrom. In blacklist mode, also requires isAllowed on from, to and msg.sender, unless the Super Operator calls.
Parameters:
from
address
Sender. Must pass isAllowed in blacklist mode.
to
address
Recipient. Must pass isAllowed in blacklist mode.
value
uint256
Amount of shares to transfer.
Return values:
(unnamed)
bool
Always true on success.
Views
totalAssets
Total assets currently managed by the vault, as last committed by the Curator at settlement.
Return values:
(unnamed)
uint256
Total assets in underlying units.
decimals
ERC20 decimals — matches the underlying asset's decimals plus the vault's decimal offset.
Return values:
(unnamed)
uint8
Decimals of the vault share token.
version
Implementation version string.
Return values:
(unnamed)
string
"v0.6.0". Older implementations return their own tag, such as "v0.5.1", "v0.5.0" or "v0.4.0".
safe
Address bound to the Curator role — vault assets flow into this address at settlement, and out of it on redeems. Named safe in the source code by convention; can be any address.
Return values:
(unnamed)
address
The Curator address.
share
ERC-7575 share token address — always returns address(this) for this vault.
Return values:
(unnamed)
address
The share token (the vault itself).
supportsInterface
ERC-165 interface support check.
Parameters:
interfaceId
bytes4
Interface identifier.
Return values:
(unnamed)
bool
true if the interface is supported.
maxDeposit
Maximum assets controller can claim through deposit. Zero when paused.
Parameters:
controller
address
Controller to check.
Return values:
(unnamed)
uint256
Maximum claimable assets.
maxMint
Maximum shares controller can mint by claiming a settled deposit request.
Parameters:
controller
address
Controller to check.
Return values:
(unnamed)
uint256
Maximum claimable shares.
maxRedeem
Maximum redeemable shares for controller. When the vault is closed and nothing is claimable, returns the share balance instead (sync redeem path).
Parameters:
controller
address
Controller to check.
Return values:
shares
uint256
Maximum redeemable shares.
maxWithdraw
Asset-denominated counterpart of maxRedeem.
Parameters:
controller
address
Controller to check.
Return values:
assets
uint256
Maximum withdrawable assets.
previewSyncDeposit
Shares a depositor would receive for assets via syncDeposit, net of entry fee. (New in v0.6.0.)
Parameters:
assets
uint256
Assets to deposit.
Return values:
shares
uint256
Shares the caller would mint.
previewSyncRedeem
Assets a redeemer would receive for shares via syncRedeem, net of exit fee and haircut. (New in v0.6.0.)
Parameters:
shares
uint256
Shares to redeem.
Return values:
assets
uint256
Assets the caller would receive.
previewDeposit / previewMint / previewRedeem / previewWithdraw
All four revert. ERC-7540 mandates that synchronous previews are disabled for asynchronous flows. Use convertToShares / convertToAssets with a specific requestId for settled epochs, or previewSyncDeposit / previewSyncRedeem for the sync flow.
convertToShares
Assets → shares conversion at the settlement price of requestId's epoch.
Parameters:
assets
uint256
Assets to convert.
requestId
uint256
Request / epoch ID whose settlement price to use.
Return values:
(unnamed)
uint256
Equivalent shares at that epoch's price.
convertToAssets
Shares → assets conversion at the settlement price of requestId's epoch.
Parameters:
shares
uint256
Shares to convert.
requestId
uint256
Request / epoch ID whose settlement price to use.
Return values:
(unnamed)
uint256
Equivalent assets at that epoch's price.
pendingDepositRequest
Assets currently waiting to be settled for controller at requestId.
Parameters:
requestId
uint256
Request / epoch ID.
controller
address
Controller to check.
Return values:
assets
uint256
Pending assets.
claimableDepositRequest
Assets at requestId that have been settled and are now claimable by controller.
Parameters:
requestId
uint256
Request / epoch ID.
controller
address
Controller to check.
Return values:
assets
uint256
Claimable assets.
pendingRedeemRequest
Shares currently waiting to be settled for controller at requestId.
Parameters:
requestId
uint256
Request / epoch ID.
controller
address
Controller to check.
Return values:
shares
uint256
Pending shares.
claimableRedeemRequest
Shares at requestId that have been settled and whose assets are now claimable.
Parameters:
requestId
uint256
Request / epoch ID.
controller
address
Controller to check.
Return values:
shares
uint256
Claimable shares.
isOperator
Returns true if operator is approved by controller via setOperator.
Parameters:
controller
address
Controller.
operator
address
Operator to check.
Return values:
(unnamed)
bool
true if approved.
isAllowed
Composite access check — passes the current access mode (whitelist or blacklist) and the external sanctions list, if configured. (New in v0.6.0.)
isAllowed does not exist. isWhitelisted returns true if account is whitelisted, for any address while the whitelist is disabled, and always for the FeeRegistry's protocol fee receiver (and, on v0.5.1, for address(0)).
Parameters:
account
address
Address to check.
Return values:
(unnamed)
bool
true if the account can interact with the vault.
isTotalAssetsValid
Returns true while the currently posted valuation is still within its totalAssetsLifespan. Sync operations require this to be true.
Return values:
(unnamed)
bool
true if the valuation is still valid.
syncMode
Returns the current sync configuration. (New in v0.6.0.)
Return values:
(unnamed)
SyncMode
Current mode.
isAsyncOnly
Returns true if activateAsyncOnly has been called — the vault has irreversibly given up sync capability. When true, totalAssets is always treated as invalid. (New in v0.6.0.)
Return values:
(unnamed)
bool
true if the vault is permanently async-only.
maxCap
Returns the per-vault total-assets cap. (New in v0.6.0.)
Return values:
(unnamed)
uint256
Max cap in underlying asset units.
feeRates
Returns the current fee rates struct.
There are no entry, exit or haircut fees.
All rates are in basis points. The protocol cut is read separately from the FeeRegistry.
Return values:
(unnamed)
Rates
Current fee rates: management / performance, plus entry / exit / haircut on v0.6.0.
Curator
The Curator role is bound to a single on-chain address — referred to as the safe in the source code (hence the onlySafe modifier and the safe() view function). The name reflects the common deployment pattern of using a Gnosis-Safe multi-sig, but no Safe-specific behaviour is enforced: any address can hold the role, including an EOA, an MPC wallet, or a custom contract. The Curator manages strategy allocation, executes settlements, and toggles operational parameters like the sync mode and the max cap.
settleDeposit
Commit a valuation, take fees, mint the new shares to the vault (where they wait to be claimed), and pull the silo's assets into the Curator address. Opportunistically also calls settleRedeem when possible.
Parameters:
_newTotalAssets
uint256
Confirmed total assets at the moment of settlement. Must equal the value previously posted by the valuation manager or security council.
settleRedeem
Commit a valuation, take fees, burn pending shares from the silo, and pull assets from the Curator address to the vault for claim.
Parameters:
_newTotalAssets
uint256
Confirmed total assets at the moment of settlement.
claimSharesOnBehalf
UX helper — push claimable deposit shares to a list of controllers.
Parameters:
controllers
address[]
Controllers to claim for. Controllers with nothing claimable are skipped.
claimAssetsOnBehalf
UX helper — push claimable redeem assets to a list of controllers. (New in v0.6.0.)
Parameters:
controllers
address[]
Controllers to claim for. Controllers with nothing claimable are skipped.
updateTotalAssetsLifespan
Set how long a posted valuation stays valid for sync operations.
Parameters:
lifespan
uint128
Lifespan in seconds.
expireTotalAssets
Invalidate the currently posted valuation immediately. After this call, sync operations revert until a new valuation is posted and confirmed.
updateMaxCap
Set the deposit cap (in underlying assets). (New in v0.6.0.)
Parameters:
_maxCap
uint256
New max cap. Use type(uint256).max to effectively disable.
setSyncMode
Switch between async-only, sync-deposit-only, sync-redeem-only, or both. Reverts if the vault is in async-only mode. (New in v0.6.0.)
Parameters:
_mode
SyncMode
Both, SyncDeposit, SyncRedeem, or None.
resetHighWaterMark
Reset the high-water mark to the current price per share — used after a known-loss event so the performance fee re-engages from a fresh baseline. Reverts unless allowHighWaterMarkReset was set to true at vault initialization. (New in v0.6.0.)
close
Finalize closing the vault. The Owner (Admin) must first call initiateClosing. After close, only redemption / withdrawal paths remain available.
Parameters:
_newTotalAssets
uint256
Final total assets at close.
Valuation Manager
updateNewTotalAssets
Propose a new vault valuation. Must satisfy GuardRailsManager.isCompliant if guardrails are active.
Parameters:
_newTotalAssets
uint256
Proposed total assets.
Security Council
securityCouncilUpdateTotalAssets
Same as updateNewTotalAssets but bypasses guardrails. Used to recover from valuation events that legitimately exceed the configured bounds. (New in v0.6.0.)
Parameters:
_newTotalAssets
uint256
Proposed total assets.
updateGuardrails
Update the price-per-share bounds policy. (New in v0.6.0.)
Parameters:
guardrails_
Guardrails
New upper / lower annual bounds in basis points.
updateActivated
Enable or disable guardrail enforcement. (New in v0.6.0.)
Parameters:
activated_
bool
true to enforce, false to disable.
Access Manager (former Whitelist Manager)
addToWhitelist
Add accounts to the whitelist.
Parameters:
accounts
address[]
Accounts to whitelist.
revokeFromWhitelist
Remove accounts from the whitelist.
Parameters:
accounts
address[]
Accounts to remove.
addToBlacklist
Add accounts to the blacklist. (New in v0.6.0.)
Parameters:
accounts
address[]
Accounts to blacklist.
revokeFromBlacklist
Remove accounts from the blacklist. (New in v0.6.0.)
Parameters:
accounts
address[]
Accounts to remove from the blacklist.
setExternalSanctionsList
Wire an external sanctions oracle that the vault will query on every isAllowed check — i.e. on every deposit, redeem, request, share transfer, and operator-triggered claim. If the oracle returns true for the address, the call reverts. The hook is intended for the Chainalysis Sanctions Oracle, a free on-chain registry of OFAC-sanctioned addresses, but any contract that implements the one-method interface below works. Pass address(0) to disable the check entirely. (New in v0.6.0.)
The sanctions check stacks on top of the active access mode (whitelist or blacklist) — an address must pass both to interact with the vault.
Parameters:
sanctionsList
SanctionsList
Oracle address. Use the Chainalysis-deployed contract for the target chain (see their docs for per-network addresses), a custom oracle implementing isSanctioned, or address(0) to disable.
Owner (Admin)
The Owner (Admin) is the governance role — it does not run the strategy, but it controls vault configuration, critical safety switches, and role assignments. Enforced on-chain by the standard onlyOwner modifier (Ownable2StepUpgradeable).
Lifecycle & emergency
initialize
Proxy-time initializer. data is an ABI-encoded InitStruct containing the vault's full configuration.
Parameters:
data
bytes
ABI-encoded InitStruct (underlying, name, symbol, roles, rates, sync mode, etc.).
feeRegistry
address
Protocol fee registry address.
wrappedNativeToken
address
Wrapped native token (e.g. WETH) — used by Silo.depositEth.
pause
Halt all core user operations (deposit, redeem, withdraw, requests, settlements, valuation updates).
unpause
Resume operations after a pause.
initiateClosing
Start the vault wind-down. After this, the Curator finalises via close(_newTotalAssets).
activateAsyncOnly
Irreversible. Permanently disable sync deposits and sync redeems. After this call, isAsyncOnly() returns true and totalAssets is always treated as invalid. (New in v0.6.0.)
Roles
updateWhitelistManager
Replace the Access Manager address (the role formerly known as Whitelist Manager — kept under its original name in the source for storage-layout compatibility).
Parameters:
_whitelistManager
address
New Access Manager address.
updateValuationManager
Replace the Valuation Manager address (the role authorised to call updateNewTotalAssets).
Parameters:
_valuationManager
address
New Valuation Manager address.
updateFeeReceiver
Replace the address that receives the share-denominated fees minted at settlement.
Parameters:
_feeReceiver
address
New fee receiver address.
updateSafe
Replace the address bound to the Curator role (called safe in the source for historical reasons — see the Curator section). (New in v0.6.0.) Reverts if lockUpdateSafe has been called.
Parameters:
_safe
address
New address for the Curator role. Can be any address (multi-sig, EOA, MPC wallet, custom contract).
updateSecurityCouncil
Replace the Security Council address (the role that manages guardrails and can bypass them via securityCouncilUpdateTotalAssets). (New in v0.6.0.)
Parameters:
_securityCouncil
address
New Security Council address.
updateSuperOperator
Replace the Super Operator address (the global operator that can act on behalf of any controller and bypasses whitelist / blacklist checks — see Super Operator for the full scope). (New in v0.6.0.) Reverts if lockSuperOperator has been called.
Parameters:
_superOperator
address
New Super Operator address. Use address(0) to remove.
lockUpdateSafe
Irreversible. Permanently disable updateSafe. (New in v0.6.0.)
lockSuperOperator
Irreversible. Permanently disable updateSuperOperator. (New in v0.6.0.)
transferOwnership / acceptOwnership
Two-step transfer of the Owner (Admin) role (Ownable2StepUpgradeable). newOwner must call acceptOwnership for the transfer to take effect.
Access control
switchAccessMode
Switch between whitelist and blacklist mode. (New in v0.6.0.)
Parameters:
newMode
AccessMode
Whitelist or Blacklist.
There is no blacklist mode. The Owner can only disable the whitelist, after which every address passes isWhitelisted; it cannot be re-enabled. No parameters.
Fees & metadata
updateRates
Update fee rates, applied immediately. Max bounds are enforced on-chain (AboveMaxRate): management ≤ 10%, performance ≤ 50%, entry/exit ≤ 2%, haircut ≤ 20%. After initialization, entry and exit rates can only decrease (RateCanOnlyDecrease). Reverts with Closed on a closed vault. The protocol cut is not part of this struct — it is read from the FeeRegistry.
Update the management and performance rates. Max bounds are enforced on-chain and exposed as constants: MAX_MANAGEMENT_RATE() (10%) and MAX_PERFORMANCE_RATE() (50%). New rates apply after the cooldown set at initialization. The protocol cut is not part of this struct — it is read from the FeeRegistry.
Parameters:
newRates
Rates
New fee rates, all in basis points: management / performance, plus entry / exit / haircut on v0.6.0.
updateName
Update the ERC20 name. (New in v0.6.0.)
Parameters:
newName
string
New name.
updateSymbol
Update the ERC20 symbol. (New in v0.6.0.)
Parameters:
newSymbol
string
New symbol.
Super Operator
The Super Operator is a single global address that satisfies the operator check for any controller on every user op except requestDeposit and syncDeposit, and additionally bypasses whitelist / blacklist checks. (New in v0.6.0.) There is no dedicated function — it works by passing the isOperatorOrSuperOperator check in deposit, mint, redeem, withdraw, cancelRequestDeposit(address), and cancelRequestRedeem.
The address is set by the Owner (Admin) via updateSuperOperator(address) and can be permanently locked via lockSuperOperator(). Use address(0) to disable.
GuardRailsManager (read)
isCompliant
Pure check used by the vault on every updateNewTotalAssets call. Returns true if the proposed PPS change stays within the configured upper/lower annual bounds for the elapsed time. (New in v0.6.0.)
Parameters:
currentPps
uint256
Current price per share.
nextPps
uint256
Proposed new price per share.
timePast
uint256
Seconds elapsed since the last update.
Return values:
(unnamed)
bool
true if compliant.
Silo (separate contract)
The Silo is a minimal helper contract paired with each vault. It holds pending assets (during async deposits) and pending shares (during async redeems). The vault's constructor configures IERC20(underlying).forceApprove(vault, max) so the vault can pull from the silo; no other entry points exist beyond the one below.
depositEth
Wrap received ETH into WETH. Called by the vault when a user sends native ETH to requestDeposit or syncDeposit and the underlying is WETH.
Last updated