MidasVault
Documentation for eth_defi.midas.vault.MidasVault Python class.
- class MidasVault
Bases:
eth_defi.vault.base.VaultBaseScan-only adapter for Midas
mTokeninvestment products.Midas product architecture differs materially from ERC-4626. The mToken is the share token, while separate issuance and redemption vault contracts perform deposits and withdrawals. NAV/share is published by Midas’
IDataFeedand is independent of any ERC-20 used to pay for an issuance. Consequently this adapter must not call ERC-4626asset()or imply that a payment token controls the mToken’s NAV denomination.Instead, an issuance vault inherits Midas’ ManageableVault implementation. It maintains a mutable
_paymentTokensset and exposes it throughgetPaymentTokens(); Midas administrators can add or remove accepted payment tokens.fetch_payment_tokens()reads this authoritative live list. Since the shared vault schema presently has one ERC-20 denomination field, the adapter exports the first returned payment token as a compatibility choice. That order is not an assertion that Midas regards it as a canonical or preferred settlement currency.If an issuance vault is absent, returns no ERC-20 payment tokens, or only returns the zero-address
MANUAL_FULLFILMENT_TOKENsentinel, the adapter exports synthetic off-chain USD. This preserves the USD accounting label without inventing an ERC-20 address. Active issuance and redemption remain intentionally unsupported because Midas does not implement ERC-4626/ERC-7540 flows.Create a Midas vault adapter.
- Parameters
web3 – Web3 connection.
spec – Chain and mToken address.
token_cache – Token metadata cache used by
fetch_erc20_details().features – Shared pipeline feature flags. Expected to contain
ERC4626Feature.midas_like.default_block_identifier – Default block for metadata reads.
require_denomination_token – Whether missing denomination token should raise through
VaultBase.denomination_token.
Attributes summary
Midas mToken and primary vault id.
EVM chain id for this Midas product.
Chainlink-compatible public oracle contract for this product.
Midas
IDataFeedcontract for this product.Get the token which denominates the vault valuation
Deposit manager assocaited with this vault
Human-readable product description.
Flow manager associated with this vault
Get info dictionary related to this vault deployment.
Midas issuance vault contract for this product.
Issuer or platform display name.
Token name, falling back to static product metadata.
Midas redemption vault contract for this product.
ERC-20 that presents vault shares.
Short product description.
Vault share token symbol.
Compatibility alias for scanner code that expects
vault_address.Methods summary
__init__(web3, spec[, token_cache, ...])Create a Midas vault adapter.
fetch_available_liquidity([block_identifier])Get the amount of denomination token available for immediate withdrawal.
Expose the primary Midas payment token through
VaultBase.Return the primary Midas payment-token address.
Return the public integration deposit availability status.
Get when deposits will next be open.
Return Midas metadata for this scan-only adapter.
fetch_nav([block_identifier])Fetch Midas product NAV.
Fetch ERC-20 payment tokens accepted by the Midas issuance vault.
fetch_portfolio(universe[, block_identifier])Return an empty portfolio for the scan-only adapter.
Fetch the primary Midas payment token for schema compatibility.
Return the public integration redemption availability status.
Get when withdrawals/redemptions will next be open.
Return Midas-specific scan-row diagnostics.
fetch_share_price([block_identifier])Fetch Midas NAV per mToken.
Fetch ERC-20 metadata for the mToken.
fetch_share_token_address([block_identifier])Return the mToken address.
fetch_total_assets([block_identifier])Fetch Midas product TVL from supply and NAV/share.
fetch_total_supply([block_identifier])Fetch total outstanding mToken supply.
fetch_utilisation_percent([block_identifier])Get the percentage of assets currently lent out.
get_deposit_fee(block_identifier)Return instant issuance fee.
Get deposit manager.
Return static public transaction-adapter support, if any.
What is the estimated lock-up period for this vault.
Return Midas fee data.
Get how this vault accounts its fees.
Get various vault state flags from the smart contract.
Get flow manager.
get_historical_reader(stateful)Get Midas historical reader.
get_link([referral])Get Midas product page link.
get_management_fee(block_identifier)Return Midas management fee.
Get a human readable message if we know somethign special is going on with this vault.
get_performance_fee(block_identifier)Return Midas performance fee.
Return the name of the vault protocol.
get_risk()Get risk profile of this vault.
get_spec()get_withdraw_fee(block_identifier)Return instant redemption fee.
Whether event-based deposit/redemption flow accounting is implemented.
Does this vault have fees outside the shared fee model.
Whether deposits are automatically distributed to positions.
- __init__(web3, spec, token_cache=None, features=None, default_block_identifier=None, require_denomination_token=False)
Create a Midas vault adapter.
- Parameters
web3 (web3.main.Web3) – Web3 connection.
spec (eth_defi.vault.base.VaultSpec) – Chain and mToken address.
token_cache (Optional[dict]) – Token metadata cache used by
fetch_erc20_details().features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) – Shared pipeline feature flags. Expected to contain
ERC4626Feature.midas_like.default_block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) – Default block for metadata reads.
require_denomination_token (bool) – Whether missing denomination token should raise through
VaultBase.denomination_token.
- property chain_id: int
EVM chain id for this Midas product.
- property address: eth_typing.evm.HexAddress
Midas mToken and primary vault id.
- property vault_address: eth_typing.evm.HexAddress
Compatibility alias for scanner code that expects
vault_address.
- property data_feed_contract: web3.contract.contract.Contract
Midas
IDataFeedcontract for this product.
- property custom_feed_contract: Optional[web3.contract.contract.Contract]
Chainlink-compatible public oracle contract for this product.
- property issuance_vault_contract: Optional[web3.contract.contract.Contract]
Midas issuance vault contract for this product.
- property redemption_vault_contract: Optional[web3.contract.contract.Contract]
Midas redemption vault contract for this product.
- property name: str
Token name, falling back to static product metadata.
- property symbol: str
Vault share token symbol.
- property description: Optional[str]
Human-readable product description.
- property short_description: Optional[str]
Short product description.
- property manager_name: Optional[str]
Issuer or platform display name.
- fetch_share_token_address(block_identifier='latest')
Return the mToken address.
- fetch_share_token()
Fetch ERC-20 metadata for the mToken.
- Returns
Token details for the Midas share token.
- Return type
- fetch_payment_tokens()
Fetch ERC-20 payment tokens accepted by the Midas issuance vault.
Midas products have no ERC-4626
asset()method. Their separate issuance contracts inherit ManageableVault, whosegetPaymentTokens()method returns its internal_paymentTokensset. This is the authoritative on-chain list of ERC-20 tokens accepted to pay for a deposit. The companion DepositVault implementation converts the suppliedtokenInamount to USD before calculating the mToken mint amount. Therefore a returned payment token is a settlement route, not necessarily the currency used by the product’s NAV feed.The set is mutable: Midas vault administrators may add and remove payment tokens, so this method intentionally performs a live read and does not cache the returned list. The contract uses OpenZeppelin’s enumerable set, whose returned order is an implementation order rather than an explicit Midas preference. We preserve it exactly because
fetch_primary_payment_token()must choose one token for the shared single-denomination schema; it selects the first item solely as that compatibility rule.Midas also defines
MANUAL_FULLFILMENT_TOKENas the zero address for an off-chain USD bank-transfer route. Current supported products return ERC-20 addresses, but this method filters a zero-address entry so it cannot be mistaken for a transferable ERC-20. When there is no issuance vault, there are no ERC-20 entries, or the returned list only has the manual-fulfilment sentinel, this method returns an empty list. The scan export then falls back to synthetic off-chain USD instead of inventing a token address.- Returns
Payment-token details in the contract-returned order, or an empty list when the product has no issuance vault or configured ERC-20 payment tokens.
- Return type
- fetch_primary_payment_token()
Fetch the primary Midas payment token for schema compatibility.
Midas exposes a set of accepted payment tokens, rather than an ERC-4626
asset()token. The sharedVaultBaseAPI has one denomination-token slot, however, so Midas adapters define the first ERC-20 returned by ManageableVault.getPaymentTokens() as the primary payment token. This is a compatibility convention, not a claim that the token denominates the USD NAV calculated by Midas’ DepositVault.- Returns
The first non-zero payment token in contract-returned order, or
Nonewhen the scanner must use its off-chain USD fallback.- Return type
- fetch_denomination_token_address()
Return the primary Midas payment-token address.
Midas issuance vaults may accept several payment tokens. The common
VaultBaseschema has one denomination-token field, so this method returns the address offetch_primary_payment_token(). If the contract returns no ERC-20 payment tokens, the scan export uses synthetic off-chain USD.- Returns
Primary payment-token address, or
Nonewhen no token is configured.- Return type
- fetch_denomination_token()
Expose the primary Midas payment token through
VaultBase.This override fulfils the
VaultBasedenomination-token API for a non-ERC-4626 Midas product. It deliberately returnsfetch_primary_payment_token(), allowing the shared scanner to cache and export the primary accepted payment token inVaultBase.denomination_token.- Returns
Primary payment token, or
Nonewhen the scanner must use the off-chain USD fallback.- Return type
- fetch_share_price(block_identifier='latest')
Fetch Midas NAV per mToken.
The primary source is Midas
IDataFeed.getDataInBase18(). Some registry products expose a datafeed that currently reverts as unhealthy or deprecated, while the paired publiccustomFeedstill exposes a positive Chainlink-style round answer. In that case the adapter falls back tolatestRoundData()so historical TVL scans can still cover the registry-supported product.
- fetch_total_supply(block_identifier='latest')
Fetch total outstanding mToken supply.
- fetch_total_assets(block_identifier='latest')
Fetch Midas product TVL from supply and NAV/share.
- fetch_nav(block_identifier='latest')
Fetch Midas product NAV.
- fetch_info()
Return Midas metadata for this scan-only adapter.
- Returns
Token and NAV-source metadata.
- Return type
- fetch_scan_record_extra_data()
Return Midas-specific scan-row diagnostics.
- fetch_portfolio(universe, block_identifier=None)
Return an empty portfolio for the scan-only adapter.
Midas product collateral is not held as ERC-20 balances on the mToken contract. Portfolio composition requires Midas transparency data and is out of scope for this adapter.
- Parameters
universe (eth_defi.vault.base.TradingUniverse) – Ignored.
block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) – Ignored.
- Returns
Empty spot portfolio.
- Return type
- has_block_range_event_support()
Whether event-based deposit/redemption flow accounting is implemented.
- Return type
- has_deposit_distribution_to_all_positions()
Whether deposits are automatically distributed to positions.
- Return type
- get_flow_manager()
Get flow manager.
- Raises
NotImplementedError – Always, because Midas flow accounting is not implemented yet.
- Return type
- get_deposit_manager()
Get deposit manager.
- Raises
NotImplementedError – Always, because active Midas issuance and redemption are not implemented.
- Return type
- fetch_deposit_closed_reason()
Return the public integration deposit availability status.
- fetch_redemption_closed_reason()
Return the public integration redemption availability status.
- get_historical_reader(stateful)
Get Midas historical reader.
- Parameters
stateful (bool) – Whether to attach adaptive reader state.
- Returns
Historical reader.
- Return type
- get_fee_data()
Return Midas fee data.
The Midas NAV process deducts product fees before publishing NAV/share. The exact management and performance fee split is product-specific and not exposed through the mToken surface, so those fields are left unknown. Instant issuance/redemption fees are read from the respective Midas vault contracts at the adapter’s default block.
- Returns
Fee data for this Midas product.
- Return type
- get_management_fee(block_identifier)
Return Midas management fee.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Ignored. Product-level annual fee split is not exposed on-chain.
- Returns
Nonebecause the fee split is not available from the mToken.- Return type
- get_performance_fee(block_identifier)
Return Midas performance fee.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Ignored. Product-level annual fee split is not exposed on-chain.
- Returns
Nonebecause the fee split is not available from the mToken.- Return type
- get_deposit_fee(block_identifier)
Return instant issuance fee.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Historical or latest block identifier.
- Returns
Instant issuance fee as a fraction, if exposed by the registry issuance vault.
- Return type
- get_withdraw_fee(block_identifier)
Return instant redemption fee.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Historical or latest block identifier.
- Returns
Instant redemption fee as a fraction, if exposed by the registry redemption vault.
- Return type
- get_link(referral=None)
Get Midas product page link.
- 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_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_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_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
- 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_protocol_name()
Return the name of the vault protocol.
- Return type
- get_risk()
Get risk profile of this vault.
- 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
- property share_token: eth_defi.token.TokenDetails
ERC-20 that presents vault shares.
User gets shares on deposit and burns them on redemption