enzyme.onyx_vault

Documentation for eth_defi.enzyme.onyx_vault Python module.

VaultBase adapter for Enzyme Onyx Shares vaults.

Enzyme’s current Base deployment is the modular Onyx protocol. Its Shares contract is an ERC-20 vault share token, but it deliberately does not implement ERC-4626. Valuation is published by a connected handler as a stored 18-decimal sharePrice() in a named accounting unit such as USD. The scanner normalises the USD reporting unit to native Base USDC for cross-vault metrics; this does not identify the active handler’s deposit asset.

Official Base deployment and ABI source: https://github.com/enzymefinance/onyx-sdk/tree/main/packages/environment

Module Attributes

ONYX_VALUE_ASSET_COMPARABILITY_TOKENS

Onyx Shares.getValueAsset() is a human-readable accounting label, not an ERC-20 deposit-token address.

ONYX_USD_COMPARABILITY_TOKEN

Compatibility alias for callers that need the USD reporting normalisation.

Classes

EnzymeVault

Read an Enzyme Onyx Shares vault directly through VaultBase.

Exceptions

EnzymeVaultUnsupportedError

Raised for an Enzyme Onyx feature that is outside this scan adapter.

ONYX_VALUE_ASSET_COMPARABILITY_TOKENS: dict[str, eth_typing.evm.HexAddress] = {'BTC': '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf', 'EUR': '0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42', 'USD': '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'}

Onyx Shares.getValueAsset() is a human-readable accounting label, not an ERC-20 deposit-token address. Every currently discovered Base label has a canonical ERC-20 used only to export comparable scanner metrics. This mapping must reflect the value shown to an investor, not a protocol-internal handler implementation: a handler can accept USDT, EURC, or another asset while the Shares vehicle reports its NAV in USD, BTC, or EUR.

Never use these addresses to select a subscription or redemption token. The transaction flow must inspect the active handler instead.

ONYX_USD_COMPARABILITY_TOKEN = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'

Compatibility alias for callers that need the USD reporting normalisation.

exception EnzymeVaultUnsupportedError

Bases: RuntimeError

Raised for an Enzyme Onyx feature that is outside this scan adapter.

__init__(*args, **kwargs)
__new__(**kwargs)
add_note(note, /)

Add a note to the exception

with_traceback(tb, /)

Set self.__traceback__ to tb and return self.

class EnzymeVault

Bases: eth_defi.vault.base.VaultBase

Read an Enzyme Onyx Shares vault directly through VaultBase.

The protocol supports both synchronous and queued deposit/redeem handlers. This adapter therefore does not advertise a public transaction manager until handler-specific flows are implemented and tested.

Create an Enzyme Onyx vault adapter.

Parameters
  • web3 – Web3 connection for the vault’s chain.

  • spec – Chain and canonical Onyx Shares contract address.

  • token_cache – Shared ERC-20 token cache.

  • features – Scanner classification flags.

  • default_block_identifier – Block used for ordinary metadata reads.

  • require_denomination_token – Enforce a resolved reporting denomination in operational callers. USD-value Onyx Shares resolve to native Base USDC by the explicit comparability assumption documented in fetch_denomination_token_address(); this does not certify USDC as a handler deposit asset.

  • current_deposit_permission – Fixed-block result from the chain-level active handler index. The Shares contract cannot enumerate this state on its own.

__init__(web3, spec, token_cache=None, features=None, default_block_identifier=None, require_denomination_token=False, current_deposit_permission=None)

Create an Enzyme Onyx vault adapter.

Parameters
  • web3 (web3.main.Web3) – Web3 connection for the vault’s chain.

  • spec (eth_defi.vault.base.VaultSpec) – Chain and canonical Onyx Shares contract address.

  • token_cache (Optional[dict]) – Shared ERC-20 token cache.

  • features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) – Scanner classification flags.

  • default_block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) – Block used for ordinary metadata reads.

  • require_denomination_token (bool) – Enforce a resolved reporting denomination in operational callers. USD-value Onyx Shares resolve to native Base USDC by the explicit comparability assumption documented in fetch_denomination_token_address(); this does not certify USDC as a handler deposit asset.

  • current_deposit_permission (Optional[str]) – Fixed-block result from the chain-level active handler index. The Shares contract cannot enumerate this state on its own.

Return type

None

property chain_id: int

Return the vault’s EVM chain id.

property address: eth_typing.evm.HexAddress

Return the canonical Onyx Shares contract address.

property vault_address: eth_typing.evm.HexAddress

Return the scanner-compatible alias for address.

property shares_contract: web3.contract.contract.Contract

Load the Onyx Shares interface at this vault address.

property name: str

Return the cached onchain Shares token name.

property symbol: str

Return the cached onchain Shares token symbol.

property description: Optional[str]

Return the explicit unavailable note for this Onyx vault.

property short_description: Optional[str]

Return no table copy because Onyx has no public description API.

get_strategy_tags()

Return default and documented strategy tags for this Onyx Shares vault.

The shared Enzyme mapping uses the canonical Shares address. Every Enzyme vault receives the default discretionary-trading tag, while researched addresses receive additional strategy tags.

Returns

A mutable set of default and address-specific strategy tags.

Return type

set[eth_defi.vault.strategy_tag.StrategyTag]

property manager_name: Optional[str]

Return no manager name because Onyx has no public metadata API.

fetch_share_token()

Fetch the Shares ERC-20 token metadata.

Return type

eth_defi.token.TokenDetails

fetch_share_token_address(block_identifier='latest')

Return the Shares ERC-20 address for the shared historical scanner.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Accepted for scanner compatibility; a Shares token is the vault contract itself and its address is immutable.

Returns

Shares ERC-20 contract address.

Return type

eth_typing.evm.HexAddress

fetch_denomination_token_address()

Map every supported Onyx value asset to a canonical Base ERC-20.

Onyx Shares records a named value asset rather than an ERC-20 denomination token. The scanner needs an ERC-20 denomination to keep its share prices, TVL and lifetime metrics comparable with other vaults. It deliberately maps each reviewed Base value-asset label to its canonical ERC-20: USD to USDC, BTC to cbBTC, and EUR to EURC. The mapping covers all 16 Onyx Shares discovered from the official Base SharesFactory as of 2026-08-21.

This is not evidence that the canonical token is the active deposit asset. For example, an USD-valued vehicle can use a handler that accepts USDT while continuing to report its NAV in USD. Deposit and redemption code must inspect the active handler instead of relying on this reporting normalisation. An unknown label raises immediately so a historical scan cannot proceed with a missing denomination token and later fail inside the generic reader state.

Returns

Canonical Base ERC-20 used to represent the Shares value asset in scanner metrics.

Raises

EnzymeVaultUnsupportedError – If the vault is not on Base or Enzyme introduces a value-asset label with no reviewed canonical ERC-20 mapping.

Return type

eth_typing.evm.HexAddress

fetch_denomination_token()

Fetch the ERC-20 selected by the Onyx reporting normalisation.

The returned token represents the scanner’s valuation denomination, not a source-proven Onyx handler deposit asset. See fetch_denomination_token_address() for the USD-to-USDC comparability assumption and its transaction-flow limitation.

Returns

Metadata for the canonical Base ERC-20 used by the mapped Onyx value asset.

Return type

eth_defi.token.TokenDetails

fetch_value_asset(block_identifier='latest')

Read the declared Onyx accounting unit, such as USD.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata read.

Returns

Value asset label decoded from the protocol’s bytes32 field.

Return type

str

fetch_share_price(block_identifier='latest')

Read the stored value-asset price per human-readable share.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the valuation read.

Returns

Share price in the named Onyx value asset.

Return type

decimal.Decimal

fetch_total_supply(block_identifier='latest')

Read human-readable ERC-20 share supply.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –

Return type

decimal.Decimal

fetch_total_assets(block_identifier='latest')

Calculate TVL in the vault’s named Onyx value asset.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –

Return type

decimal.Decimal

fetch_nav(block_identifier='latest')

Return TVL in the vault’s named value asset.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Historical block number or block tag.

Returns

TVL expressed in the Onyx value asset.

Return type

decimal.Decimal

fetch_info()

Fetch the vault address, accounting unit and metric denomination.

denomination_assumption records that the named-value-asset mapping is a metrics convention. It must not be interpreted as a handler deposit asset or as evidence that a user can deposit the mapped token.

Returns

Shares address, declared value asset and exported denomination assumption.

Return type

eth_defi.vault.base.VaultInfo

fetch_portfolio(universe, block_identifier=None)

Return an empty portfolio until Onyx position trackers are integrated.

Parameters
Return type

eth_defi.vault.base.VaultPortfolio

has_block_range_event_support()

Return false until handler flow events are mapped to Shares vaults.

Return type

bool

has_deposit_distribution_to_all_positions()

Return false because the protocol does not make that guarantee.

Return type

bool

get_flow_manager()

Return an explicit unsupported flow reader.

Return type

eth_defi.vault.base.VaultFlowManager

get_deposit_manager()

Reject unimplemented handler-specific public transaction flows.

Return type

eth_defi.vault.deposit_redeem.VaultDepositManager

get_historical_reader(stateful)

Return the share-price and TVL historical reader.

Historical deposit and redemption availability remains unsupported; see EnzymeVaultHistoricalReader for the reason.

Parameters

stateful (bool) – Whether the shared reader should retain adaptive scan state between runs.

Returns

Historical share-price and TVL reader.

Return type

eth_defi.vault.base.VaultHistoricalReader

get_protocol_name()

Return the protocol display name.

Return type

str

is_whitelisted_deposit()

Return current account-approval status from the handler index.

An Onyx Shares token exposes isDepositHandler(address) but no enumerable handler list. The chain-level Enzyme discovery pass reconstructs the active set from DepositHandlerAdded and DepositHandlerRemoved events, and a batched current-state reader inspects the standard synchronous, queued and manual-mint handlers. The resulting fixed-block permission is injected into this adapter.

A directly constructed adapter without that chain context remains explicit unknown rather than performing a costly per-vault event scan or assuming the protocol’s permissionless default.

Returns

True when every active route requires prior account approval; False when at least one route is proven public or no deposit handler is active.

Raises

NotImplementedError – If no conclusive chain-level permission snapshot was supplied.

Return type

bool

get_whitelist_notes()

Explain the current Onyx permission classification.

The qualification distinguishes investor identity approval from route availability and other operating conditions that the shared enum does not represent.

Returns

Qualification for a resolved chain-level result, or None when the adapter has no conclusive handler snapshot.

Return type

Optional[str]

fetch_fee_tracker_rate(tracker_getter, block_identifier, fee_handler=None)

Read a current annual fee rate from an optional Onyx fee component.

Onyx attaches fee components per Shares contract. A configured FeeHandler points to the optional management and performance fee trackers, whose rates are stored in basis points. This is intentionally a current-state read only: fee handlers and trackers can be replaced, so historical fee data needs component-change event handling.

Parameters
  • tracker_getter (Literal['getManagementFeeTracker', 'getPerformanceFeeTracker']) – FeeHandler accessor selecting the management or performance tracker.

  • block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the current metadata scan.

  • fee_handler (Optional[web3.contract.contract.Contract]) – Already loaded handler, allowing a single metadata refresh to reuse the Shares getFeeHandler() result.

Returns

Annual fee fraction, such as 0.01 for 1%. Returns zero when the authoritative FeeHandler configuration omits this tracker.

Return type

float

fetch_fee_handler(block_identifier)

Load the optional current FeeHandler component.

Each Onyx Shares token may omit the component entirely. In that case, neither dynamic nor entrance/exit fees are configured. The component can be replaced, so callers must use it only for a point-in-time read.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the component-address read.

Returns

FeeHandler contract, or None when not configured.

Return type

Optional[web3.contract.contract.Contract]

fetch_fee_handler_bps(fee_getter, block_identifier, fee_handler=None)

Read the current entrance or exit fee from the FeeHandler.

Enzyme calculates these fees in shares at the configured basis-point rate, reducing the investor’s net issued or redeemed shares. The rate is a current-state value only; historical values require EntranceFeeSet and ExitFeeSet event processing.

Parameters
  • fee_getter (Literal['getEntranceFeeBps', 'getExitFeeBps']) – FeeHandler accessor selecting the entrance or exit rate.

  • block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata scan.

  • fee_handler (Optional[web3.contract.contract.Contract]) – Already loaded handler for a batched metadata read.

Returns

Fee fraction. Returns zero when the authoritative FeeHandler configuration is absent.

Return type

float

get_management_fee(block_identifier)

Read the current annual management fee from the configured tracker.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata scan.

Returns

Annual management-fee fraction, or zero when no tracker is configured.

Return type

float

fetch_protocol_fee(block_identifier)

Return the additional current Onyx protocol fee when configured.

The reviewed standard Onyx FeeHandler exposes management, performance, entrance and exit fee settings, but no distinct protocol-fee rate. The explicit None keeps the shared user-facing aggregation path aligned with Blue without inventing a platform charge from internal fee-recipient details.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Accepted for a consistent point-in-time fee-reader interface.

Returns

None until a reviewed Onyx contract exposes a separate protocol management-fee rate.

Return type

Optional[float]

get_performance_fee(block_identifier)

Read the current performance fee from the configured tracker.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata scan.

Returns

Performance-fee fraction, or zero when no tracker is configured.

Return type

float

get_deposit_fee(block_identifier)

Read the current entrance fee as a fraction of gross issued shares.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata scan.

Returns

Entrance-fee fraction, or zero when no FeeHandler is present.

Return type

float

get_withdraw_fee(block_identifier)

Read the current exit fee as a fraction of gross redeemed shares.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block number or tag for the metadata scan.

Returns

Exit-fee fraction, or zero when no FeeHandler is present.

Return type

float

get_fee_data()

Read all currently configured Enzyme fee classes efficiently.

The four rate reads share the same FeeHandler. Reading it once avoids three redundant Shares calls during scanner metadata refreshes. The standard Onyx FeeHandler has no separate protocol-fee rate, but its management rate still passes through the same user-facing aggregation as Blue. This preserves correct output if a reviewed Onyx protocol fee is added later.

Returns

Current management, performance, entrance and exit fee data.

Return type

eth_defi.vault.fee.FeeData

Return the address-specific Enzyme Onyx application page.

The canonical Shares address identifies the vehicle in the Enzyme application. The network query distinguishes the Base deployment and keeps the URL format aligned with Blue vault detail pages.

Parameters

referral (Optional[str]) – Accepted for the shared vault interface; Enzyme does not expose a reviewed referral query parameter.

Returns

Direct Enzyme application URL for this Onyx Shares vault.

Return type

str

property denomination_token: Optional[eth_defi.token.TokenDetails]

Get the token which denominates the vault valuation

  • Used in deposits and redemptions

  • Used in NAV calculation

  • Used in profit benchmarks

  • Usually USDC

Returns

Token wrapper instance.

Maybe None for broken vaults like https://arbiscan.io/address/0x9d0fbc852deccb7dcdd6cb224fa7561efda74411#code

Note

None results are not cached — the next access will retry the on-chain call. This avoids permanently caching a transient RPC failure.

property deposit_manager: eth_defi.vault.deposit_redeem.VaultDepositManager

Deposit manager assocaited with this vault

fetch_available_liquidity(block_identifier='latest')

Get the amount of denomination token available for immediate withdrawal.

Only applicable to lending protocol vaults (IPOR, Euler, Morpho, Gearbox, etc.). Non-lending protocols should leave this method unimplemented.

Note: maxRedeem(address(0)) does NOT work as a proxy for available liquidity because it requires a specific address that has already deposited shares. For address(0), balanceOf is always 0, so maxRedeem returns 0 regardless of actual liquidity.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block to query. Defaults to “latest”.

Raises

NotImplementedError – For non-lending protocol vaults.

Returns

Amount in denomination token units (human-readable Decimal).

Return type

Optional[decimal.Decimal]

fetch_deposit_closed_reason()

Get human-readable reason why deposits are closed.

  • Override in protocol-specific subclasses

  • Default behaviour: no closure reason is known (return None)

Returns

Human-readable string explaining why deposits are closed, or None if deposits are open or the adapter cannot determine a closure reason. Use fetch_deposit_open() for explicit tri-state availability metadata.

Example reasons:

  • ”Epoch redemption window closed (opens in 14h)”

  • ”Vault paused by admin”

  • ”Max deposit cap reached”

  • ”Vault utilisation too high”

Return type

Optional[str]

fetch_deposit_next_open()

Get when deposits will next be open.

  • For epoch-based vaults (Ostium, D2), return calculated window open time

  • For non-epoch vaults (Plutus, IPOR, Morpho), return None

  • Override in protocol-specific subclasses

Returns

Naive UTC datetime when deposits will next be available, or None if:

  • Deposits are currently open

  • Timing is unpredictable (manually controlled)

  • Protocol does not support timing information

Return type

Optional[datetime.datetime]

fetch_deposit_open()

Fetch the current protocol-defined deposit availability.

This is deliberately a tri-state value. True and False mean that the adapter read an authoritative vault-wide state; None means that the generic adapter cannot safely determine the state. It is separate from fetch_deposit_closed_reason(), because an absent human-readable reason does not prove that deposits are open.

Returns

True when deposits are open, False when they are closed, or None when the protocol does not expose a reliable global availability read.

Return type

Optional[bool]

fetch_minimum_deposit(block_identifier='latest')

Fetch a source-proven minimum deposit in decimal token units.

A None result means this adapter does not expose a known minimum; it does not prove the protocol accepts arbitrarily small deposits. A zero result means the adapter positively established that the vault has no minimum deposit.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block at which to read the protocol configuration.

Returns

Decimal denomination-token minimum, or None when unknown.

Return type

Optional[decimal.Decimal]

fetch_minimum_redemption(block_identifier='latest')

Fetch a source-proven redemption minimum in decimal share units.

A None result means this adapter does not expose a known minimum; it does not prove the protocol accepts arbitrarily small redemptions. A zero result means the adapter positively established that the vault has no minimum redemption.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block at which to read the protocol configuration.

Returns

Decimal vault-share minimum, or None when unknown.

Return type

Optional[decimal.Decimal]

fetch_redemption_closed_reason()

Get human-readable reason why redemptions are closed.

  • Override in protocol-specific subclasses

  • Default behaviour: assume redemptions are always open (return None)

Returns

Human-readable string explaining why redemptions are closed, or None if redemptions are open.

Example reasons:

  • ”Epoch funding phase in progress (opens in 2d 5h)”

  • ”Vault paused by admin”

  • ”Vault utilisation too high - insufficient liquidity”

Return type

Optional[str]

fetch_redemption_next_open()

Get when withdrawals/redemptions will next be open.

  • For epoch-based vaults (Ostium, D2), return calculated window open time

  • For non-epoch vaults (Plutus, IPOR, Morpho), return None

  • Override in protocol-specific subclasses

Returns

Naive UTC datetime when withdrawals will next be available, or None if:

  • Withdrawals are currently open

  • Timing is unpredictable (manually controlled)

  • Protocol does not support timing information

Return type

Optional[datetime.datetime]

fetch_scan_record_extra_data()

Fetch protocol-specific private scan row columns.

Some vault protocols expose structured metadata that is useful for the raw scanner output but does not fit the shared human-readable columns. Override this hook in protocol-specific subclasses instead of adding a separate branch to eth_defi.erc_4626.scan.create_vault_scan_record().

Returns

Mapping of private scan-row column names, usually prefixed with _. The default implementation returns no extra data.

Return type

dict[str, object]

fetch_utilisation_percent(block_identifier='latest')

Get the percentage of assets currently lent out.

Only applicable to lending protocol vaults (IPOR, Euler, Morpho, Gearbox, etc.). Non-lending protocols should leave this method unimplemented.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block to query. Defaults to “latest”.

Raises

NotImplementedError – For non-lending protocol vaults.

Returns

Utilisation as float between 0.0 and 1.0 (0% to 100%).

Return type

Optional[float]

property flow_manager: eth_defi.vault.base.VaultFlowManager

Flow manager associated with this vault

get_deposit_manager_capability()

Return static public transaction-adapter support, if any.

This method deliberately does not attempt to construct a manager or query live pause, cap, epoch, balance, allow-list, or liquidity state. Adapters opt in only after their complete deposit and redemption lifecycles have focused coverage. None is therefore the safe default for unknown and protocol-specific vaults.

Returns

Adapter-specific capability object, or None when unsupported.

Return type

Optional[eth_defi.vault.deposit_redeem.VaultDepositManagerCapability]

get_estimated_lock_up()

What is the estimated lock-up period for this vault.

Returns

None if not know

Return type

Optional[datetime.timedelta]

get_fee_mode()

Get how this vault accounts its fees.

Return type

Optional[eth_defi.vault.fee.VaultFeeMode]

get_flags()

Get various vault state flags from the smart contract.

The vault metadata scan stores this result as _flags in vault-metadata-db.pickle. top_vaults_by_chain.json is generated from those stored values through scripts/erc-4626/vault-analysis-json.py / eth_defi.vault.top_vaults_json.

After editing manual flags in eth_defi.vault.flag, rerun the vault metadata scan and top-vault JSON post-processing. Regenerating the JSON from an old metadata database will not pick up new manual flags.

Returns

Flag set.

Do not modify in place.

Return type

set[eth_defi.vault.flag.VaultFlag]

get_notes()

Get a human readable message if we know somethign special is going on with this vault.

Return type

Optional[str]

get_risk()

Get risk profile of this vault.

Return type

Optional[eth_defi.vault.risk.VaultTechnicalRisk]

get_share_price_source()

Return the source used for share-price observations.

Vault integrations override this method when they expose a share price. Returning None distinguishes unsupported or unknown pricing from a known source classification.

Returns

Share-price source, or None when the adapter does not provide one.

Return type

Optional[eth_defi.vault.price_source.PriceSource]

get_withdrawal_period()

Return binding withdrawal timing and optional settlement estimates.

Unlike get_estimated_lock_up(), this reports the redemption lifecycle after a user submits a valid withdrawal request. Adapters use min_period and max_period only for a binding smart-contract timing rule. An adapter may instead return a non-binding estimated_settlement for backtesting an offchain operating cadence or redemption wait; that estimate never establishes claimability and does not require a synthetic timing bound.

Returns

Withdrawal period details, or None when unavailable.

Return type

Optional[eth_defi.vault.base.WithdrawalPeriod]

has_custom_fees()

Does this vault have fees outside the shared fee model.

Custom fees cause risk in vault comparison because the shared management/performance/deposit/withdraw fee fields cannot describe the full fee structure.

Do not return True merely because a vault implements custom accessors for ordinary management, performance, deposit, or withdraw fees. Return True only when some vault fee cannot be reflected in those standard fields as a fee-like value.

Returns

True if the vault has fees outside the shared fee model.

Return type

bool

property info: eth_defi.vault.base.VaultInfo

Get info dictionary related to this vault deployment.

  • Get cached data on the various vault parameters

Returns

Vault protocol specific information dictionary

is_account_whitelisted(address)

Determine whether an account has completed the vault’s KYC policy.

The result concerns KYC, manual identity approval, or recipient allowlist membership only. A protocol may still require scheduling, a token balance, an allowance, available capacity, or an open epoch before a deposit can be submitted. Callers must use the relevant deposit manager pre-flight before broadcasting a transaction.

Parameters

address (eth_typing.evm.HexAddress) – Account whose deposit-policy membership is queried.

Returns

True when the account has the required pre-approval.

Raises

NotImplementedError – If the adapter cannot safely query account membership.

Return type

bool

property share_token: eth_defi.token.TokenDetails

ERC-20 that presents vault shares.

  • User gets shares on deposit and burns them on redemption

first_seen_at_block: int | None

Block number hint when this vault was deployed.

Must be set externally, as because of shitty Ethereum RPC we cannot query this. Allows us to avoid unnecessary work when scanning historical price data.