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 |
|
Compatibility alias for callers that need the USD reporting normalisation. |
Classes
Read an Enzyme Onyx Shares vault directly through |
Exceptions
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:
RuntimeErrorRaised 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.VaultBaseRead 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.
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 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.
Load the Onyx Shares interface at this vault address.
- 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
- property manager_name: Optional[str]
Return no manager name because Onyx has no public metadata API.
Fetch the Shares ERC-20 token metadata.
- Return type
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
- fetch_denomination_token_address()
Map every supported Onyx value asset to a canonical Base ERC-20.
Onyx
Sharesrecords 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:USDto USDC,BTCto cbBTC, andEURto 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
- 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
- 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
Read the stored value-asset price per human-readable share.
- fetch_total_supply(block_identifier='latest')
Read human-readable ERC-20 share supply.
- fetch_total_assets(block_identifier='latest')
Calculate TVL in the vault’s named Onyx value asset.
Return TVL in the vault’s named value asset.
- fetch_info()
Fetch the vault address, accounting unit and metric denomination.
denomination_assumptionrecords 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
- fetch_portfolio(universe, block_identifier=None)
Return an empty portfolio until Onyx position trackers are integrated.
- Parameters
universe (eth_defi.vault.base.TradingUniverse) –
block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) –
- Return type
- has_block_range_event_support()
Return false until handler flow events are mapped to Shares vaults.
- Return type
- has_deposit_distribution_to_all_positions()
Return false because the protocol does not make that guarantee.
- Return type
- get_flow_manager()
Return an explicit unsupported flow reader.
- Return type
- get_deposit_manager()
Reject unimplemented handler-specific public transaction flows.
- get_historical_reader(stateful)
Return the share-price and TVL historical reader.
Historical deposit and redemption availability remains unsupported; see
EnzymeVaultHistoricalReaderfor 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
- 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 fromDepositHandlerAddedandDepositHandlerRemovedevents, 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
unknownrather than performing a costly per-vault event scan or assuming the protocol’s permissionless default.- Returns
Truewhen every active route requires prior account approval;Falsewhen 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
- 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.
- 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
FeeHandlerpoints 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.01for 1%. Returns zero when the authoritative FeeHandler configuration omits this tracker.- Return type
- 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
Nonewhen 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
EntranceFeeSetandExitFeeSetevent 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
- 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
- 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
Nonekeeps 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
Noneuntil a reviewed Onyx contract exposes a separate protocol management-fee rate.- Return type
- 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
- 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
- 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
- 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
- get_link(referral=None)
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.
- 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
Noneresults 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
- 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
- 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
- fetch_deposit_open()
Fetch the current protocol-defined deposit availability.
This is deliberately a tri-state value.
TrueandFalsemean that the adapter read an authoritative vault-wide state;Nonemeans that the generic adapter cannot safely determine the state. It is separate fromfetch_deposit_closed_reason(), because an absent human-readable reason does not prove that deposits are open.
- fetch_minimum_deposit(block_identifier='latest')
Fetch a source-proven minimum deposit in decimal token units.
A
Noneresult 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
Nonewhen unknown.- Return type
- fetch_minimum_redemption(block_identifier='latest')
Fetch a source-proven redemption minimum in decimal share units.
A
Noneresult 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
Nonewhen unknown.- Return type
- 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)
- 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
- 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().
- 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
- 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.
Noneis therefore the safe default for unknown and protocol-specific vaults.- Returns
Adapter-specific capability object, or
Nonewhen 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
- get_fee_mode()
Get how this vault accounts its fees.
- Return type
- get_flags()
Get various vault state flags from the smart contract.
Override to add status flags
Also add flags from our manual flag list in
eth_defi.vault.flag
The vault metadata scan stores this result as
_flagsinvault-metadata-db.pickle.top_vaults_by_chain.jsonis generated from those stored values throughscripts/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
- get_notes()
Get a human readable message if we know somethign special is going on with this vault.
- get_risk()
Get risk profile of this vault.
- Return type
Return the source used for share-price observations.
Vault integrations override this method when they expose a share price. Returning
Nonedistinguishes unsupported or unknown pricing from a known source classification.- Returns
Share-price source, or
Nonewhen the adapter does not provide one.- Return type
- 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 usemin_periodandmax_periodonly for a binding smart-contract timing rule. An adapter may instead return a non-bindingestimated_settlementfor 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
Nonewhen unavailable.- Return type
- 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
Truemerely because a vault implements custom accessors for ordinary management, performance, deposit, or withdraw fees. ReturnTrueonly when some vault fee cannot be reflected in those standard fields as a fee-like value.- Returns
Trueif the vault has fees outside the shared fee model.- Return type
- 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
Truewhen the account has the required pre-approval.- Raises
NotImplementedError – If the adapter cannot safely query account membership.
- Return type
ERC-20 that presents vault shares.
User gets shares on deposit and burns them on redemption