erc_4626.vault_protocol.hyperdrive_hl.vault
Documentation for eth_defi.erc_4626.vault_protocol.hyperdrive_hl.vault Python module.
Hyperdrive vault support on HyperEVM.
Hyperdrive is the premier stablecoin money market on Hyperliquid and the foundational layer for making everything on HyperCore liquid. It is an all-in-one DeFi hub offering spot lending markets, liquid staking of HYPE, and advanced yield strategies.
Key features:
Supply stablecoins to earn lending APY
Borrow stablecoins against other assets
Liquid stake HYPE to earn staking rewards whilst using it as collateral
Use HLP as collateral or leverage HLP to maximise HLP yield
Automated yield strategies with portfolio-focused approach
Security:
Audited by Enigma Dark, Bail Security, and Obsidian Audits
Backed by Binance Labs, Hack VC, Arrington Capital, and Delphi Ventures
Protocol suffered a $782,000 exploit in 2025 (router contract vulnerability)
Homepage: https://hyperdrive.fi/
Documentation: https://hyperdrive-2.gitbook.io/hyperdrive/
Twitter: https://x.com/hyperdrivedefi
Classes
Hyperdrive vault support on HyperEVM. |
- class HyperdriveVault
Bases:
eth_defi.erc_4626.vault.ERC4626VaultHyperdrive vault support on HyperEVM.
Hyperdrive is Hyperliquid’s yield hub and the premier stablecoin money market on Hyperliquid. It enables users to supply stablecoins to earn lending APY, borrow stablecoins against other assets, and access liquid staking and yield strategies.
The protocol provides automated yield strategies through its “Earn” product, which aggregates deposits into various yield-generating activities on HyperEVM.
Note: The smart contracts are not verified on block explorers.
Homepage: https://hyperdrive.fi/
Documentation: https://hyperdrive-2.gitbook.io/hyperdrive/
Twitter: https://x.com/hyperdrivedefi
- Parameters
web3 – Connection we bind this instance to
spec – Chain, address tuple
token_cache –
Cache used with
fetch_erc20_details()to avoid multiple calls to the same token.Reduces the number of RPC calls when scanning multiple vaults.
features – Pass vault feature flags along, externally detected.
default_block_identifier –
Override block identifier for on-chain metadata reads.
When
None, useget_safe_cached_latest_block_number()(the default, safe for broken RPCs). Set to"latest"for freshly deployed vaults whose contracts do not exist at the safe-cached block.
- has_custom_fees()
Whether this vault has deposit/withdrawal fees.
Fee structure is not publicly documented.
- Return type
- get_management_fee(block_identifier)
Get the current management fee as a percent.
Fee structure is not publicly documented for Hyperdrive vaults.
- get_performance_fee(block_identifier)
Get the current performance fee as a percent.
Fee structure is not publicly documented for Hyperdrive vaults.
- get_estimated_lock_up()
Get estimated lock-up period if any.
Lock-up period is not documented.
- Return type
datetime.timedelta | None
- get_link(referral=None)
Get the vault’s web UI link.
- __init__(web3, spec, token_cache=None, features=None, default_block_identifier=None)
- Parameters
web3 (web3.main.Web3) – Connection we bind this instance to
spec (eth_defi.vault.base.VaultSpec) – Chain, address tuple
token_cache (dict | None) –
Cache used with
fetch_erc20_details()to avoid multiple calls to the same token.Reduces the number of RPC calls when scanning multiple vaults.
features (set[eth_defi.erc_4626.core.ERC4626Feature] | None) – Pass vault feature flags along, externally detected.
default_block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, hexbytes.main.HexBytes, int]]) –
Override block identifier for on-chain metadata reads.
When
None, useget_safe_cached_latest_block_number()(the default, safe for broken RPCs). Set to"latest"for freshly deployed vaults whose contracts do not exist at the safe-cached block.
- property address: eth_typing.evm.HexAddress
Get the vault smart contract address.
- can_check_deposit()
Check if maxDeposit(address(0)) can be used to check global deposit availability.
Most ERC-4626 vaults implement maxDeposit in a way that returns meaningful values when called with address(0):
Returns 0 when deposits are globally closed/capped
Returns a positive value indicating maximum deposit allowed
Override to return False in subclasses where maxDeposit(address(0)) doesn’t provide meaningful global availability information.
- Returns
True if maxDeposit(address(0)) returns meaningful values for global deposit availability checking.
- Return type
- can_check_redeem()
Check if maxRedeem(address(0)) can be used to check global redemption availability.
Most protocols return 0 for maxRedeem(address(0)) because that address has no balance/shares, not because redemptions are closed:
Gearbox: maxRedeem returns min(balanceOf(owner), convertToShares(availableLiquidity))
Most vaults: Return 0 because address(0) has no shares
Some protocols do use maxRedeem(address(0)) meaningfully:
Morpho, IPOR, Plutus: Return 0 when redemptions are globally blocked
Override to return True in subclasses that support address(0) redemption checks.
- Returns
True if maxRedeem(address(0)) returns meaningful values for global redemption availability checking.
- Return type
- property denomination_token: eth_defi.token.TokenDetails | None
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
- property deposit_manager: eth_defi.vault.deposit_redeem.VaultDepositManager
Deposit manager assocaited with this vault
- property erc_7540: bool
Is this ERC-7540 vault with asynchronous deposits.
For example
previewDeposit()function and other functions will revert
- fetch_denomination_token()
Read denomination token from onchain.
Use
denomination_token()for cached access.- Return type
eth_defi.token.TokenDetails | None
- fetch_denomination_token_address()
Get the address for the denomination token.
Triggers RCP call
- Return type
- fetch_deposit_closed_reason()
Check if deposits are closed using maxDeposit(address(0)).
Uses the ERC-4626 standard maxDeposit function to determine if deposits are available. Returns a human-readable reason with the max deposit amount if deposits are restricted.
- Returns
Human-readable string if deposits are closed/restricted, or None if deposits are open (maxDeposit > 0).
- Return type
str | None
- 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
datetime.datetime | None
Fetch the most recent onchain NAV value.
In the case of Lagoon, this is the last value written in the contract with updateNewTotalAssets() and ` settleDeposit()`
TODO: updateNewTotalAssets() there is no way to read pending asset update on chain
- Returns
Vault NAV, denominated in
denomination_token()- Return type
- fetch_portfolio(universe, block_identifier=None, allow_fallback=True)
Read the current token balances of a vault.
SHould be supported by all implementations
- 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, hexbytes.main.HexBytes, int]]) –
allow_fallback (bool) –
- Return type
- fetch_redemption_closed_reason()
Check if redemptions are closed using maxRedeem(address(0)).
Only works for protocols that implement maxRedeem in a way that returns meaningful values for address(0). Most protocols return 0 because address(0) has no shares, not because redemptions are closed.
- Returns
Human-readable string if redemptions are closed, or None if redemptions are open or check is not supported.
- Return type
str | 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
datetime.datetime | None
Get the current share price.
Read share token details onchain.
Use
share_token()for cached access.- Return type
Get share token of this vault.
Vault itself (ERC-4626)
share() accessor (ERc-7575)
- fetch_total_assets(block_identifier)
What is the total NAV of the vault.
Example:
assert vault.denomination_token.symbol == "USDC" assert vault.share_token.symbol == "ipUSDCfusion" assert vault.fetch_total_assets(block_identifier=test_block_number) == Decimal("1437072.77357") assert vault.fetch_total_supply(block_identifier=test_block_number) == Decimal("1390401.22652875")
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, hexbytes.main.HexBytes, int]) –
Block number to read.
Use web3.eth.block_number for the last block.
- Returns
The vault value in underlyinh token
- Return type
decimal.Decimal | None
- fetch_total_supply(block_identifier)
What is the current outstanding shares.
Example:
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, hexbytes.main.HexBytes, int]) –
Block number to read.
Use web3.eth.block_number for the last block.
- Returns
The vault value in underlyinh token
- Return type
- fetch_vault_info()
Get all information we can extract from the vault smart contracts.
- Return type
- property flow_manager: eth_defi.vault.base.VaultFlowManager
Flow manager associated with this vault
- get_deposit_fee(block_identifier)
Deposit fee is set to zero by default as vaults usually do not have deposit fees.
Internal: Use
get_fee_data().
- get_deposit_manager()
Get deposit manager to deposit/redeem from the vault.
- get_fee_data()
Get fee data structure for this vault.
- Raises
ValueError – In the case of broken or unimplemented fee reading methods in the smart contract
- 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
- Returns
Flag set.
Do not modify in place.
- Return type
set[eth_defi.vault.flag.VaultFlag]
- get_flow_manager()
Get flow manager to read indiviaul settle events.
Only supported if
has_block_range_event_support()is True
- Return type
- get_historical_reader(stateful)
Get share price reader to fetch historical returns.
- Parameters
stateful – If True, use a stateful reading strategy.
- Returns
None if unsupported
- Return type
- get_notes()
Get a human readable message if we know somethign special is going on with this vault.
- Return type
str | None
- get_risk()
Get risk profile of this vault.
- Return type
- get_withdraw_fee(block_identifier)
Withdraw fee is set to zero by default as vaults usually do not have withdraw fees.
Internal: Use
get_fee_data().
- has_block_range_event_support()
Does this vault support block range-based event queries for deposits and redemptions.
If not we use chain balance polling-based approach
- has_deposit_distribution_to_all_positions()
Deposits go automatically to all open positions.
Deposits do not land into the vault as cash
Instead, smart contracts automatically increase all open positions
The behaviour of Velvet Capital
- 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_valid()
Check if this vault is valid.
Call a known smart contract function to verify the function exists
- Return type
ERC-20 that presents vault shares.
User gets shares on deposit and burns them on redemption
- property underlying_token: eth_defi.token.TokenDetails
Alias for
denomination_token()
- property vault_contract: web3.contract.contract.Contract
Get vault deployment.