tokenised_fund.centrifuge.vault

Documentation for eth_defi.tokenised_fund.centrifuge.vault Python module.

Read-only Centrifuge Tranche tokenised-fund adapter.

This adapter intentionally does not use ERC4626Vault: a Centrifuge Tranche is a permissioned ERC-20 share token, not the linked vault used for subscriptions and redemptions. See Tranche.sol and the Centrifuge share-token documentation.

Module Attributes

TRANCHE_READ_ABI

Minimal read ABI from Centrifuge's verified Tranche.sol source.

CENTRIFUGE_TRANCHE_BLOCKED_FLOW_REASON

Never advertise token-level operations as public fund dealing.

CENTRIFUGE_TRANCHE_NAV_UNAVAILABLE

Explicit unavailable-price reason exposed in scanner metadata and history.

Classes

CentrifugeTrancheVault

Read-only adapter for direct Centrifuge permissioned share tokens.

CentrifugeTrancheVaultInfo

Centrifuge Tranche scan metadata.

TRANCHE_READ_ABI = [{'inputs': [], 'name': 'hook', 'outputs': [{'internalType': 'contract IHook', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}, {'inputs': [{'internalType': 'address', 'name': 'asset', 'type': 'address'}], 'name': 'vault', 'outputs': [{'internalType': 'contract IAsyncVault', 'name': '', 'type': 'address'}], 'stateMutability': 'view', 'type': 'function'}]

Minimal read ABI from Centrifuge’s verified Tranche.sol source.

CENTRIFUGE_TRANCHE_BLOCKED_FLOW_REASON = 'Centrifuge Tranche token is not the subscription/redemption vault; public dealing requires the linked permissioned pool route'

Never advertise token-level operations as public fund dealing.

CENTRIFUGE_TRANCHE_NAV_UNAVAILABLE = 'Centrifuge Tranche token does not expose NAV/share; linked pool valuation is not configured'

Explicit unavailable-price reason exposed in scanner metadata and history.

class CentrifugeTrancheVaultInfo

Bases: eth_defi.vault.base.VaultInfo

Centrifuge Tranche scan metadata.

__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.

class CentrifugeTrancheVault

Bases: eth_defi.vault.base.VaultBase

Read-only adapter for direct Centrifuge permissioned share tokens.

It reads ERC-20 metadata and the live compliance hook address. It neither infers NAV from supply nor exposes a deposit manager, because mint/burn are authorised accounting operations and vault(asset) points elsewhere.

Create an address-scoped Tranche token adapter.

Parameters
  • web3 – Web3 connection for the token’s chain.

  • spec – Chain and direct Tranche token address.

  • token_cache – Shared ERC-20 metadata cache.

  • features – Classification features, expected to contain ERC4626Feature.centrifuge_tranche_like.

  • default_block_identifier – Optional default block for reads.

  • require_denomination_token – Retained for the shared adapter signature; no denomination token is exposed by the Tranche token.

__init__(web3, spec, token_cache=None, features=None, default_block_identifier=None, require_denomination_token=False)

Create an address-scoped Tranche token adapter.

Parameters
  • web3 (web3.main.Web3) – Web3 connection for the token’s chain.

  • spec (eth_defi.vault.base.VaultSpec) – Chain and direct Tranche token address.

  • token_cache (Optional[dict]) – Shared ERC-20 metadata cache.

  • features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) – Classification features, expected to contain ERC4626Feature.centrifuge_tranche_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]]) – Optional default block for reads.

  • require_denomination_token (bool) – Retained for the shared adapter signature; no denomination token is exposed by the Tranche token.

property chain_id: int

Return the product’s EVM chain id.

property address: eth_typing.evm.HexAddress

Return the direct Tranche ERC-20 token address.

property vault_address: eth_typing.evm.HexAddress

Return the scanner-compatible identifier for this share token.

property name: str

Return on-chain name with the reviewed product name fallback.

property symbol: str

Return on-chain symbol with the reviewed product symbol fallback.

property description: str

Return the product-level description.

property short_description: str

Return a concise token structure description.

property manager_name: str

Return the verified fund sub-investment manager.

fetch_share_token_address(block_identifier='latest')

Return the direct Tranche token address.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Accepted for shared scanner compatibility.

Returns

Tranche token address.

Return type

eth_typing.evm.HexAddress

fetch_share_token()

Fetch direct Tranche ERC-20 metadata.

Returns

Token details for JTRSY.

Return type

eth_defi.token.TokenDetails

fetch_denomination_token_address()

Return no denomination token for the direct share token.

Returns

Always None: subscription assets belong to a linked vault.

Return type

Optional[eth_typing.evm.HexAddress]

fetch_denomination_token()

Return no denomination token metadata.

Returns

Always None.

Return type

Optional[eth_defi.token.TokenDetails]

fetch_compliance_hook(block_identifier=None)

Read the live transfer-compliance hook.

Parameters

block_identifier (Optional[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 configured hook.

Returns

Checksum hook address, including the zero address when disabled.

Return type

eth_typing.evm.HexAddress

fetch_linked_vault(asset, block_identifier=None)

Read the vault associated with a specific subscription asset.

This low-level relationship does not certify that the returned vault is publicly accessible or that it accepts a caller. It must not be used as a replacement for a tested Centrifuge subscription/redemption manager.

Parameters
  • asset (eth_typing.evm.HexAddress) – Asset address whose linked vault is queried.

  • block_identifier (Optional[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 association.

Returns

Checksum linked-vault address, possibly the zero address.

Return type

eth_typing.evm.HexAddress

fetch_share_price(block_identifier='latest')

Reject NAV estimation from the direct share-token surface.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Requested block, retained for API compatibility.

Raises

NotImplementedError – Always: the Tranche token exposes no valuation method.

Return type

decimal.Decimal

fetch_total_supply(block_identifier='latest')

Fetch the human-readable outstanding share supply.

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

Direct Tranche ERC-20 supply.

Return type

decimal.Decimal

fetch_total_assets(block_identifier='latest')

Reject TVL calculation without an authoritative NAV.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Requested block, retained for API compatibility.

Raises

NotImplementedError – Always: supply is not NAV.

Return type

decimal.Decimal

fetch_nav(block_identifier='latest')

Reject direct-token NAV calculation.

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Requested block, retained for API compatibility.

Raises

NotImplementedError – Always: valuation belongs to the linked pool route.

Return type

decimal.Decimal

fetch_info()

Return direct-token scan metadata.

Returns

Token, chain, hook and valuation-source details.

Return type

eth_defi.tokenised_fund.centrifuge.vault.CentrifugeTrancheVaultInfo

fetch_scan_record_extra_data()

Return explicit diagnostics for the deliberately unpriced token.

Returns

Scanner extra fields which prevent accidental public-flow claims.

Return type

dict[str, object]

fetch_portfolio(universe, block_identifier=None)

Return no token-contract portfolio.

Parameters
  • universe (eth_defi.vault.base.TradingUniverse) – Ignored because fund assets are not token holdings.

  • 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 fund assets are not token holdings.

Returns

Empty spot portfolio.

Return type

eth_defi.vault.base.VaultPortfolio

has_block_range_event_support()

Return whether public flow accounting is supported.

Returns

False because token mint/burn is authorised accounting.

Return type

bool

has_deposit_distribution_to_all_positions()

Return whether token deposits distribute to on-chain positions.

Returns

False because the Tranche token is not the fund vault.

Return type

bool

get_flow_manager()

Reject unimplemented direct-token flow accounting.

Raises

NotImplementedError – Always, because the token is not the dealing vault.

Return type

eth_defi.vault.base.VaultFlowManager

get_deposit_manager()

Reject public subscription/redemption operations.

Raises

NotImplementedError – Always, because public dealing must use a separately supported linked Centrifuge vault route.

Return type

eth_defi.vault.deposit_redeem.VaultDepositManager

fetch_deposit_closed_reason()

Explain why public subscriptions remain unavailable.

Returns

Direct-token flow safety reason.

Return type

str

fetch_redemption_closed_reason()

Explain why public redemptions remain unavailable.

Returns

Direct-token flow safety reason.

Return type

str

get_historical_reader(stateful)

Create the supply-only history reader.

Parameters

stateful (bool) – Requested reader state behaviour.

Returns

Historical reader that leaves NAV and TVL unavailable.

Return type

eth_defi.vault.base.VaultHistoricalReader

get_fee_data()

Return unavailable fund-fee data.

Returns

Broken fee data because the share token has no fund fee surface.

Return type

eth_defi.vault.fee.FeeData

get_management_fee(block_identifier)

Return no token-level 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 because fees are not token contract fields.

Returns

None.

Return type

Optional[float]

get_performance_fee(block_identifier)

Return no token-level 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 because fees are not token contract fields.

Returns

None.

Return type

Optional[float]

get_estimated_lock_up()

Return no inferred lock-up.

Returns

None because dealing terms belong to the linked vault.

Return type

Optional[datetime.timedelta]

Return the official JTRSY fund page.

Parameters

referral (Optional[str]) – Ignored.

Returns

Product homepage.

Return type

str

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

None results 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

Optional[decimal.Decimal]

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

Optional[datetime.datetime]

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

Optional[datetime.datetime]

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

Optional[float]

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().

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –

Return type

Optional[float]

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. None is therefore the safe default for unknown and protocol-specific vaults.

Returns

Adapter-specific capability object, or None when unsupported.

Return type

Optional[eth_defi.vault.deposit_redeem.VaultDepositManagerCapability]

get_fee_mode()

Get how this vault accounts its fees.

Return type

Optional[eth_defi.vault.fee.VaultFeeMode]

get_flags()

Get various vault state flags from the smart contract.

Returns

Flag set.

Do not modify in place.

Return type

set[eth_defi.vault.flag.VaultFlag]

get_notes()

Get a human readable message if we know somethign special is going on with this vault.

Return type

Optional[str]

get_protocol_name()

Return the name of the vault protocol.

Return type

str

get_risk()

Get risk profile of this vault.

Return type

Optional[eth_defi.vault.risk.VaultTechnicalRisk]

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().

Parameters

block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –

Return type

float

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 True merely because a vault implements custom accessors for ordinary management, performance, deposit, or withdraw fees. Return True only when some vault fee cannot be reflected in those standard fields as a fee-like value.

Returns

True if the vault has fees outside the shared fee model.

Return type

bool

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.