OdaFactVault
Documentation for eth_defi.tokenised_fund.kinexys.vault.OdaFactVault Python class.
- class OdaFactVault
Bases:
eth_defi.vault.base.VaultBaseScan-only adapter for ODA-FACT tokenised fund contracts.
The adapter reads ERC-20 supply from the ODA-FACT token itself. For the initial JLTXX integration, share price is an explicitly labelled
1.00USD estimate until an official NAV feed is available.Create an ODA-FACT vault adapter.
- Parameters
web3 – Web3 connection.
spec – Chain and ODA-FACT token address.
token_cache – Token metadata cache used by
fetch_erc20_details().features – Shared pipeline feature flags. Expected to contain
ERC4626Feature.oda_fact_like.default_block_identifier – Default block for metadata reads.
require_denomination_token – Whether missing denomination token should raise through
VaultBase.denomination_token.
Attributes summary
ODA-FACT token and diamond address.
EVM chain id for this ODA-FACT contract.
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.
Issuer or platform display name.
Token name, falling back to static product metadata.
ERC-20 that presents vault shares.
Short product description.
Token symbol.
Compatibility alias for scanner code that expects
vault_address.Methods summary
__init__(web3, spec[, token_cache, ...])Create an ODA-FACT vault adapter.
fetch_available_liquidity([block_identifier])Get the amount of denomination token available for immediate withdrawal.
Fetch ERC-20 denomination token metadata.
Return the ERC-20 denomination token address.
Return the Kinexys public deposit availability status.
Get when deposits will next be open.
Return ODA-FACT metadata for this scan-only adapter.
fetch_nav([block_identifier])Fetch ODA-FACT NAV.
fetch_portfolio(universe[, block_identifier])Return an empty portfolio for the scan-only adapter.
Return the Kinexys public redemption availability status.
Get when withdrawals/redemptions will next be open.
Return ODA-FACT-specific scan-row diagnostics.
fetch_share_price([block_identifier])Fetch ODA-FACT share price when an authorised source is available.
Fetch ERC-20 metadata for the ODA-FACT token.
fetch_share_token_address([block_identifier])Return the ODA-FACT token address.
fetch_total_assets([block_identifier])Fetch ODA-FACT TVL when a share NAV is available.
fetch_total_supply([block_identifier])Fetch total outstanding ODA-FACT token supply.
fetch_utilisation_percent([block_identifier])Get the percentage of assets currently lent out.
get_deposit_fee(block_identifier)Deposit fee is set to zero by default as vaults usually do not have deposit fees.
Get deposit manager.
Return static public transaction-adapter support, if any.
Return unknown lock-up.
Return hardcoded JLTXX prospectus 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 ODA-FACT historical reader.
get_link([referral])Return product/platform link.
get_management_fee(block_identifier)Return JLTXX net annual expense ratio.
Return markdown notes for the known ODA-FACT vault.
get_performance_fee(block_identifier)Return JLTXX performance fee.
Return the name of the vault protocol.
get_risk()Get risk profile of this vault.
get_spec()get_withdraw_fee(block_identifier)Withdraw fee is set to zero by default as vaults usually do not have withdraw fees.
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 an ODA-FACT vault adapter.
- Parameters
web3 (web3.main.Web3) – Web3 connection.
spec (eth_defi.vault.base.VaultSpec) – Chain and ODA-FACT token 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.oda_fact_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 ODA-FACT contract.
- property address: eth_typing.evm.HexAddress
ODA-FACT token and diamond address.
- property vault_address: eth_typing.evm.HexAddress
Compatibility alias for scanner code that expects
vault_address.
- property name: str
Token name, falling back to static product metadata.
- property symbol: str
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 ODA-FACT token address.
- fetch_share_token()
Fetch ERC-20 metadata for the ODA-FACT token.
- Returns
Token details for the ODA-FACT share token.
- Return type
- fetch_denomination_token_address()
Return the ERC-20 denomination token address.
ODA-FACT fund accounting is USD-denominated but does not expose an ERC-4626
asset()token or any other ERC-20 denomination token. Exporting a surrogate token would make the vault appear to accept or redeem that asset, so this adapter reports no denomination token.- Returns
Always
None.- Return type
- fetch_denomination_token()
Fetch ERC-20 denomination token metadata.
- Returns
Always
Nonebecause ODA-FACT instruments do not expose a denomination token.- Return type
- fetch_share_price(block_identifier='latest')
Fetch ODA-FACT share price when an authorised source is available.
- 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. The current implementation does not have block-specific NAV data.
- Returns
Estimated JLTXX NAV per one human-readable share, or
Nonefor MONY because its FACT Diamond has no on-chain price or NAV view.- Return type
- fetch_total_supply(block_identifier='latest')
Fetch total outstanding ODA-FACT token supply.
- fetch_total_assets(block_identifier='latest')
Fetch ODA-FACT TVL when a share NAV is available.
- 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
Estimated total assets in USD-denomination units, or
Nonewhen the product provides no verified NAV.- Return type
- fetch_nav(block_identifier='latest')
Fetch ODA-FACT NAV.
- 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
Estimated total assets in USD-denomination units, or
Nonewhen the product provides no verified NAV.- Return type
- fetch_info()
Return ODA-FACT metadata for this scan-only adapter.
- Returns
Token and NAV-source metadata.
- Return type
- fetch_scan_record_extra_data()
Return ODA-FACT-specific scan-row diagnostics.
- fetch_portfolio(universe, block_identifier=None)
Return an empty portfolio for the scan-only adapter.
ODA-FACT fund assets are not represented as on-chain ERC-20 holdings of the token contract. Portfolio composition requires an off-chain fund accounting feed and is intentionally out of scope.
- 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 ODA-FACT flow accounting is not implemented yet.
- Return type
- get_deposit_manager()
Get deposit manager.
- Raises
NotImplementedError – Always, because active ODA-FACT subscription and redemption are not implemented.
- Return type
- fetch_deposit_closed_reason()
Return the Kinexys public deposit availability status.
Kinexys ODA-FACT contracts are permissioned tokenised fund contracts. On-chain subscriptions are available only to whitelisted parties and are not exposed through a public ERC-4626-style deposit flow.
- fetch_redemption_closed_reason()
Return the Kinexys public redemption availability status.
Kinexys ODA-FACT contracts are permissioned tokenised fund contracts. On-chain redemptions are available only to whitelisted parties and are not exposed through a public ERC-4626-style redemption flow.
- get_historical_reader(stateful)
Get ODA-FACT historical reader.
- Parameters
stateful (bool) – Whether to attach adaptive reader state.
- Returns
Historical reader.
- Return type
- get_fee_data()
Return hardcoded JLTXX prospectus fee data.
ODA-FACT product fees are not available from the on-chain token surface. J.P. Morgan’s JLTXX prospectus advertises
0.71%gross total annual fund operating expenses and0.16%net total annual fund operating expenses after waivers throughJLTXX_PROSPECTUS_FEE_WAIVER_UNTIL. The shared vault fee model has only one annual management-like field, so the current net expense ratio is exposed asmanagement.performance,depositandwithdraware reported as zero because they are not advertised as separate Token Class fees.- Returns
Hardcoded fee data for the known ODA-FACT contract, or broken fee data for unknown ODA-FACT addresses.
- Return type
- get_management_fee(block_identifier)
Return JLTXX net annual expense ratio.
The fee is hardcoded from the JLTXX prospectus, because it is not readable from the ODA-FACT token contract.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Ignored. Prospectus fee disclosure is not block-specific.
- Returns
0.0016for JLTXX, representing0.16%net annual fund operating expenses after waivers.- Return type
- get_performance_fee(block_identifier)
Return JLTXX 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. Prospectus fee disclosure is not block-specific.
- Returns
0because the JLTXX Token Class prospectus does not advertise a separate performance fee.- Return type
- get_notes()
Return markdown notes for the known ODA-FACT vault.
The notes are stored in the shared vault notes matrix so both direct adapter users and downstream vault metric exports see the same vault-specific description.
- get_estimated_lock_up()
Return unknown lock-up.
- Returns
Nonebecause subscription/redemption terms are off-chain.- Return type
- get_link(referral=None)
Return product/platform 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_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_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_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_protocol_name()
Return the name of the vault protocol.
- Return type
- 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_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
- first_seen_at_block: Optional[int]
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.