tokenised_fund.franklin.vault
Documentation for eth_defi.tokenised_fund.franklin.vault Python module.
Franklin Templeton Benji tokenised-fund adapter.
Benji’s Ethereum fund tokens are permissioned ERC-20 share contracts backed by Franklin Templeton’s transfer-agent and recordkeeping platform. They are not ERC-4626 vaults: public subscriptions, redemptions and transfers require issuer authorisation and use protocol-specific servicing flows.
Authoritative contract registry: https://digitalassets.franklintempleton.com/benji/benji-contracts/
Module Attributes
|
|
Benji public lifecycle availability reason. |
Functions
|
Export synthetic USD accounting denomination metadata. |
Classes
Read-only adapter for Franklin Templeton Benji Ethereum fund shares. |
|
Franklin Benji metadata exposed to vault-scan consumers. |
- FRANKLIN_FUND_ABI = [{'inputs': [], 'name': 'lastKnownPrice', 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], 'stateMutability': 'view', 'type': 'function'}]
MoneyMarketFund_V6.lastKnownPrice()view ABI.Verified implementation source: https://etherscan.io/address/0xa74372DFde0dF8a08a3Ac7b60c5379F90AC9C7DD#code
- FRANKLIN_RESTRICTED_FLOW_REASON = 'Franklin Templeton Benji subscriptions, redemptions and transfers require approved investors and transfer-agent compliance checks'
Benji public lifecycle availability reason.
- class FranklinVaultInfo
Bases:
eth_defi.vault.base.VaultInfoFranklin Benji metadata exposed to vault-scan consumers.
- __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.
- export_franklin_usd_denomination(chain_id)
Export synthetic USD accounting denomination metadata.
- class FranklinVault
Bases:
eth_defi.tokenised_fund.vault.TokenisedFundVaultRead-only adapter for Franklin Templeton Benji Ethereum fund shares.
The issuer-managed
lastKnownPriceis a base-18 USD reference price. It is read at the requested archive block together with the ERC-20 supply; callers must still assess its freshness against current issuer materials.Create a Benji fund adapter.
- Parameters
web3 – Web3 connection to the product chain.
spec – Chain and fund-token address.
token_cache – ERC-20 metadata cache.
features – Shared pipeline feature flags.
default_block_identifier – Default metadata block retained for adapter compatibility.
require_denomination_token – Whether a missing ERC-20 denomination token is an error.
- __init__(web3, spec, token_cache=None, features=None, default_block_identifier=None, require_denomination_token=False)
Create a Benji fund adapter.
- Parameters
web3 (web3.main.Web3) – Web3 connection to the product chain.
spec (eth_defi.vault.base.VaultSpec) – Chain and fund-token address.
features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) – Shared pipeline feature 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]]) – Default metadata block retained for adapter compatibility.
require_denomination_token (bool) – Whether a missing ERC-20 denomination token is an error.
- property address: eth_typing.evm.HexAddress
Return the checksum fund-token address.
- Returns
Benji ERC-20 proxy address.
- property vault_address: eth_typing.evm.HexAddress
Return the scanner-compatible fund-token address.
- Returns
Benji ERC-20 proxy address.
- property fund_contract: web3.contract.contract.Contract
Create the token proxy’s stable price-view contract.
- Returns
Contract exposing
lastKnownPrice.
- property name: str
Return the registered product name.
- Returns
On-chain name or reviewed registry fallback.
- property description: Optional[str]
Return the registered fund description.
- Returns
Product description, if the address is reviewed.
- property short_description: Optional[str]
Return the registered compact fund description.
- Returns
Product short description, if available.
- property curator_slug: str
Return the curated manager identifier.
- Returns
Franklin Templeton curator slug.
Return the Benji token address.
Fetch ERC-20 share-token metadata.
- Returns
Benji ERC-20 token details.
- Return type
- fetch_denomination_token_address()
Return no transferable denomination token.
The verified
MoneyMarketFund_V6share-token implementation exposes an issuer-maintained USD price but no ERC-20 asset or settlement-token getter. Benji servicing takes place outside this share-token contract, so the adapter must not substitute a stablecoin address.- Returns
Nonebecause the servicing flow does not expose an ERC-4626 asset.- Return type
- fetch_denomination_token()
Return no transferable denomination token.
- Returns
Nonebecause issuer subscription assets are not adapter inputs.- Return type
Read the issuer-maintained USD reference price.
- 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 Ethereum block identifier.
- Returns
USD reference price per human-readable fund share.
- Return type
- fetch_total_supply(block_identifier='latest')
Read outstanding fund-share supply.
- fetch_total_assets(block_identifier='latest')
Calculate USD TVL from supply and reference price.
- 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 Ethereum block identifier.
- Returns
USD-denominated supply multiplied by the reference price.
- Return type
Return the adapter’s USD TVL estimate.
- 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 Ethereum block identifier.
- Returns
Fund total assets derived from the issuer reference price.
- Return type
- fetch_info()
Export adapter metadata.
- Returns
Token identity and valuation-source metadata.
- Return type
- fetch_scan_record_extra_data()
Export scan diagnostics for the permissioned fund.
- fetch_portfolio(universe, block_identifier=None)
Return no on-chain portfolio.
- Parameters
universe (eth_defi.vault.base.TradingUniverse) – Ignored because fund holdings are not held by the share token.
block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) – Ignored because no on-chain portfolio read is supported.
- Returns
Empty spot portfolio.
- Return type
- has_block_range_event_support()
Return whether flow-event accounting is implemented.
- Returns
Falsebecause issuer servicing events are not modelled.- Return type
- has_deposit_distribution_to_all_positions()
Return whether deposits are distributed to on-chain positions.
- Returns
Falsebecause the adapter has no on-chain portfolio.- Return type
- get_flow_manager()
Reject unsupported flow accounting.
- Returns
Never returns.
- Raises
NotImplementedError – Always, because servicing flows are not implemented.
- Return type
- fetch_deposit_closed_reason()
Explain why the public deposit capability is unavailable.
- fetch_redemption_closed_reason()
Explain why the public redemption capability is unavailable.
- get_historical_reader(stateful)
Return the Benji supply-and-price historical reader.
- Parameters
stateful (bool) – Whether to retain adaptive reader state.
- Returns
Protocol-specific historical reader.
- Return type
- get_fee_data()
Return unavailable product-level fee data.
- Returns
Broken fee data because the token surface has no fund-fee schedule.
- Return type
- get_management_fee(block_identifier)
Return no on-chain management fee.
- get_performance_fee(block_identifier)
Return no on-chain performance fee.
- get_notes()
Return product-specific caveats.
- Returns
Notes explaining the issuer-controlled reference price and flows.
- Return type
- get_link(referral=None)
Return the official Benji 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')
Read the adapter’s available denomination-token liquidity.
Single-market adapters report market liquidity. Multi-market adapters such as Morpho and IPOR currently report idle vault assets, which can understate redeemable liquidity in their underlying markets. A user’s withdrawal can also be limited by share ownership or protocol restrictions. Non-lending adapters should leave this method unimplemented.
maxRedeem(address(0))cannot measure market-wide liquidity because ERC-4626 caps redemptions by the owner’s share balance. The zero address normally holds no shares, so a zero result says nothing about 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_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_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')
Read the adapter’s lending or capital-deployment utilisation.
Single-market adapters measure borrower utilisation. Multi-market adapters such as Morpho and IPOR currently measure allocation outside the vault, rather than aggregate utilisation by underlying borrowers. Non-lending adapters 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()
Return a manager that explicitly refuses public fund operations.
The manager gives runtime callers a typed refusal, while
get_deposit_manager_capability()provides the corresponding report metadata. Concrete issuer integrations must replace both only after implementing their complete permission-aware dealing lifecycle.- Returns
Non-operational tokenised-fund deposit manager.
- Return type
- get_deposit_manager_capability()
Report explicit lack of public deposit and redemption support.
- Returns
A two-direction capability with both operations disabled.
- Return type
- 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()
Return vault flags including the tokenised fund classification.
Preserve address- and protocol-specific flags supplied by the generic vault implementation, then add the descriptive flag used by tokenised fund listings. This base class is reserved for products with a legal fund structure, and must not be used merely because a DeFi vault issues epoch-settled shares.
- Returns
A new set containing all generic flags and
VaultFlag.tokenised_fund.- Return type
- 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_strategy_tags()
Get the known investment strategy classifications for this vault.
Override this method when an adapter or its metadata source can determine the vault’s strategy.
Nonemeans the strategy information is missing or has not yet been classified; it is distinct from an empty set, which would mean the strategy was evaluated but did not match any available tag. Maintained mappings normally omit an unclassified address; useStrategyTag.unknownonly when research establishes that the strategy itself is unknown.- Returns
Strategy tag set, or
Nonewhen the information is missing.- Return type
- get_whitelist_notes()
Return an export caveat for the vault-wide whitelist status.
Adapters may attach a concise, stable explanation when a classification is an explicitly requested operating assumption or excludes an integration-specific permission mechanism. The note describes the policy classification only; it must not be used to report temporary deposit availability.
- 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().
- 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
- is_whitelisted_deposit()
Classify tokenised-fund subscriptions as permissioned.
Tokenised-fund adapters model issuer-operated products whose subscriptions require investor eligibility, issuer approval, or both. This is a vault-wide classification: individual adapters may expose different KYC, allow-list, transfer-agent, or offchain settlement mechanisms, so
is_account_whitelisted()remains protocol-specific.- Returns
Always
Truebecause tokenised-fund deposits are permissioned.- Return type
ERC-20 that presents vault shares.
User gets shares on deposit and burns them on redemption