tokenised_fund.kinexys.vault
Documentation for eth_defi.tokenised_fund.kinexys.vault Python module.
ODA-FACT tokenised fund vault adapter.
Kinexys Digital Assets Fungible Asset Contract, or ODA-FACT, instruments are
permissioned ERC-20-compatible tokenised fund contracts. They are not ERC-4626
vaults, but the shared vault database and price scanner can track them through
the eth_defi.vault.base.VaultBase interface.
The supported production contracts are JPMorgan’s OnChain Liquidity-Token
Money Market Fund token JLTXX and My OnChain Net Yield Fund token
MONY. Both use a FACT Diamond dispatcher:
Ethereum address:
0x09864f52B035AE22eE739dFa5c748fA080D07bD8Contract architecture: EIP-2535 diamond
Token decimals:
2Verified source package reference:
@odaplatform/da-fact-smartcontracts
The adapter is scan-only. Active subscription, redemption and portfolio execution are intentionally unsupported.
Module Attributes
Human-readable JLTXX product name. |
|
JLTXX fact sheet short product description. |
|
JLTXX issuer/platform display name. |
|
Human-readable MONY product name. |
|
MONY public product description. |
|
MONY issuer/platform display name. |
|
Public Kinexys platform URL. |
|
Diagnostic label for the temporary NAV estimate. |
|
MONY's FACT Diamond has no on-chain NAV or share-price view. |
|
JLTXX prospectus/fact sheet source URL. |
|
JLTXX SEC prospectus source URL. |
|
Public availability reason for Kinexys ODA-FACT fund flows. |
|
Prospectus management fee, |
|
Prospectus service fee, |
|
Prospectus gross total annual fund operating expenses, |
|
Prospectus net total annual fund operating expenses after waivers, |
|
Prospectus fee waiver expiry date. |
|
Hardcoded ODA-FACT fee lookup by lower-case contract address. |
Functions
|
Export synthetic USD accounting denomination metadata. |
|
Check whether an address is the supported MONY FACT Diamond. |
Classes
Scan-only adapter for ODA-FACT tokenised fund contracts. |
|
ODA-FACT token metadata and compatibility settings. |
- class OdaFactVaultInfo
Bases:
eth_defi.vault.base.VaultInfoODA-FACT token metadata and compatibility settings.
- token: eth_typing.evm.HexAddress
ODA-FACT token and diamond address.
- denomination_token: Optional[eth_typing.evm.HexAddress]
ODA-FACT instruments do not expose an ERC-20 denomination token.
- synthetic_usd_denomination: bool
Whether NAV is a USD estimate without an ERC-20 denomination token.
NAV source label.
Whether NAV is estimated.
- __init__(*args, **kwargs)
- __new__(**kwargs)
- clear()
Remove all items from the dict.
- copy()
Return a shallow copy of the dict.
- fromkeys(value=None, /)
Create a new dictionary with keys from iterable and values set to value.
- get(key, default=None, /)
Return the value for key if key is in the dictionary, else default.
- items()
Return a set-like object providing a view on the dict’s items.
- keys()
Return a set-like object providing a view on the dict’s keys.
- pop(k[, d]) v, remove specified key and return the corresponding value.
If the key is not found, return the default if given; otherwise, raise a KeyError.
- popitem()
Remove and return a (key, value) pair as a 2-tuple.
Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.
- setdefault(key, default=None, /)
Insert key with a value of default if key is not in the dictionary.
Return the value for key if key is in the dictionary, else default.
- update([E, ]**F) None. Update D from mapping/iterable E and F.
If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]
- values()
Return an object providing a view on the dict’s values.
- JLTXX_PRODUCT_NAME = 'JPMorgan OnChain Liquidity-Token Money Market Fund'
Human-readable JLTXX product name.
- JLTXX_SHORT_DESCRIPTION = 'Vaulted strategy investing in U.S. Treasury bills, bonds and overnight repurchase agreements'
JLTXX fact sheet short product description.
- JLTXX_MANAGER_NAME = 'J.P. Morgan Kinexys'
JLTXX issuer/platform display name.
- MONY_PRODUCT_NAME = 'My OnChain Net Yield Fund'
Human-readable MONY product name.
- MONY_SHORT_DESCRIPTION = 'Permissioned tokenised money-market fund distributed through Morgan Money'
MONY public product description.
- MONY_MANAGER_NAME = 'J.P. Morgan Kinexys'
MONY issuer/platform display name.
- JLTXX_HOMEPAGE = 'https://www.jpmorgan.com/kinexys'
Public Kinexys platform URL.
- JLTXX_ESTIMATED_NAV_PER_SHARE = Decimal('1')
Temporary JLTXX NAV estimate used until an official historical NAV source is wired in. JLTXX is a tokenised money-market fund share, but the ODA-FACT contract surface does not expose NAV on-chain.
- JLTXX_ESTIMATED_NAV_SOURCE = 'estimated_jltxx_usd_1'
Diagnostic label for the temporary NAV estimate.
- MONY_NAV_SOURCE = 'unavailable_mony_no_onchain_nav'
MONY’s FACT Diamond has no on-chain NAV or share-price view.
- JLTXX_FACT_SHEET_URL = 'https://am.jpmorgan.com/content/dam/jpm-am-aem/americas/us/en/literature/fact-sheet/money-market/fs-ocltmm-t.pdf'
JLTXX prospectus/fact sheet source URL.
- JLTXX_PROSPECTUS_URL = 'https://www.sec.gov/Archives/edgar/data/1659326/000119312526217424/d44657d485bpos.htm'
JLTXX SEC prospectus source URL.
- KINEXYS_WHITELISTED_FLOW_REASON = 'Onchain deposits and redemptions are whitelisted and not available to the general public'
Public availability reason for Kinexys ODA-FACT fund flows.
- JLTXX_PROSPECTUS_MANAGEMENT_FEE: float = 0.0008
Prospectus management fee,
0.08%expressed as a fraction.
- JLTXX_PROSPECTUS_GROSS_EXPENSE_RATIO: float = 0.0071
Prospectus gross total annual fund operating expenses,
0.71%expressed as a fraction.
- JLTXX_PROSPECTUS_NET_EXPENSE_RATIO: float = 0.0016
Prospectus net total annual fund operating expenses after waivers,
0.16%expressed as a fraction.
- JLTXX_PROSPECTUS_FEE_WAIVER_UNTIL = datetime.date(2028, 6, 30)
Prospectus fee waiver expiry date.
- JLTXX_FEE_DATA = FeeData(fee_mode=<VaultFeeMode.internalised_skimming: 'internalised_skimming'>, management=0.0016, performance=0.0, deposit=0.0, withdraw=0.0)
Shared vault fee model for JLTXX.
FeeDatahas only one annual management-like field. Use the prospectus net total annual fund operating expense after waivers because this is the investor-facing cost currently advertised for Token Class shares. Keep the gross expense ratio and prospectus breakdown in scan diagnostics.
- ODA_FACT_FEES_BY_ADDRESS = {'0x09864f52b035ae22ee739dfa5c748fa080d07bd8': FeeData(fee_mode=<VaultFeeMode.internalised_skimming: 'internalised_skimming'>, management=0.0016, performance=0.0, deposit=0.0, withdraw=0.0)}
Hardcoded ODA-FACT fee lookup by lower-case contract address.
- is_mony(address)
Check whether an address is the supported MONY FACT Diamond.
- Parameters
address (Union[eth_typing.evm.HexAddress, str]) – Candidate EVM contract address.
- Returns
Truefor the exact Ethereum MONY token address.- Return type
- export_oda_fact_usd_denomination(chain_id)
Export synthetic USD accounting denomination metadata.
ODA-FACT instruments do not expose an ERC-20 denomination token. The
addressanddecimalsfields stayNoneso downstream consumers do not attempt raw token amount conversions or on-chain transfers.
- 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.
- __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 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.
Return the ODA-FACT token address.
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 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 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_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
ERC-20 that presents vault shares.
User gets shares on deposit and burns them on redemption