tokenised_fund.spiko.vault
Documentation for eth_defi.tokenised_fund.spiko.vault Python module.
Spiko USTBL tokenised fund adapter.
USTBL is a permissioned ERC-20 share in Spiko’s U.S. Treasury-bill money
market fund. It is not ERC-4626. The verified issuer Oracle publishes NAV per
share using the Chainlink AggregatorV3 interface, allowing safe read-only
tracking through eth_defi.vault.base.VaultBase.
See https://tech.spiko.io/posts/spiko-smart-contracts/ and https://github.com/spiko-tech/contracts/blob/main/contracts/oracle/Oracle.sol.
Module Attributes
Public flows must not be advertised for Spiko's permissioned lifecycle. |
|
USTBL's published annual management fee. |
Functions
|
Export USTBL's non-transferable USD accounting denomination. |
Classes
Read-only Ethereum adapter for Spiko USTBL. |
|
USTBL metadata exported to vault scan consumers. |
- SPIKO_PERMISSIONED_FLOW_REASON = 'Spiko USTBL subscriptions, transfers and redemptions require eligibility checks and issuer-operated daily servicing'
Public flows must not be advertised for Spiko’s permissioned lifecycle.
- USTBL_MANAGEMENT_FEE: float = 0.0025
USTBL’s published annual management fee. The reported NAV is net of this fee. https://www.spiko.io/use-cases/web3
- class SpikoVaultInfo
Bases:
eth_defi.vault.base.VaultInfoUSTBL metadata exported 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_spiko_usd_denomination(chain_id)
Export USTBL’s non-transferable USD accounting denomination.
- class SpikoVault
Bases:
eth_defi.vault.base.VaultBaseRead-only Ethereum adapter for Spiko USTBL.
The adapter calculates NAV from ERC-20 supply and the official issuer Oracle. It cannot perform investor dealing: transfers and servicing are controlled by Spiko’s permission manager and redemption workflow.
Create a verified USTBL adapter.
- Parameters
web3 – Ethereum Web3 connection.
spec – Ethereum chain and USTBL token identifier.
token_cache – Optional ERC-20 metadata cache.
features – Classification flags supplied by the shared factory.
default_block_identifier – Accepted for factory compatibility.
require_denomination_token – Accepted for
VaultBasecompatibility.
- Raises
ValueError – If the requested product is not Ethereum USTBL.
- __init__(web3, spec, token_cache=None, features=None, default_block_identifier=None, require_denomination_token=False)
Create a verified USTBL adapter.
- Parameters
web3 (web3.main.Web3) – Ethereum Web3 connection.
spec (eth_defi.vault.base.VaultSpec) – Ethereum chain and USTBL token identifier.
token_cache (Optional[dict]) – Optional ERC-20 metadata cache.
features (Optional[set[eth_defi.erc_4626.core.ERC4626Feature]]) – Classification flags supplied by the shared factory.
default_block_identifier (Optional[Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]]) – Accepted for factory compatibility.
require_denomination_token (bool) – Accepted for
VaultBasecompatibility.
- Raises
ValueError – If the requested product is not Ethereum USTBL.
- 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.
- property address: eth_typing.evm.HexAddress
Return the USTBL token address.
- Returns
Checksummed Ethereum address.
- property vault_address: eth_typing.evm.HexAddress
Return the shared scanner vault identifier.
- Returns
USTBL token address.
- property price_oracle_contract: web3.contract.contract.Contract
Return Spiko’s verified Chainlink-compatible NAV oracle.
- Returns
Oracle contract instance.
- property oracle_decimals: int
Read the NAV oracle decimal scale.
- Returns
Number of oracle decimal places.
- property description: str
Return Spiko’s public fund description.
- Returns
Concise fund strategy description.
- property short_description: str
Return a concise public listing description.
- Returns
USTBL eligibility-aware product summary.
Return USTBL’s share token address.
Fetch USTBL ERC-20 details.
- Returns
USTBL token metadata and conversion methods.
- Return type
- fetch_denomination_token_address()
Return no surrogate ERC-20 denomination token.
Spiko servicing supports eligibility-checked fiat and stablecoin settlement choices, but USTBL does not expose an ERC-4626
assettoken. A surrogate would wrongly advertise a public dealing route.- Returns
Always
None.- Return type
- fetch_denomination_token()
Return no on-chain denomination-token metadata.
- Returns
Always
Nonebecause no single public ERC-20 asset exists.- Return type
Convert oracle units to USD NAV per USTBL token.
- Parameters
raw_price (int) – Raw Chainlink-compatible oracle answer.
- Returns
Human-readable USD NAV/share.
- Return type
Read the official USTBL NAV/share.
- Parameters
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Ethereum block tag or historical block number.
- Returns
USD NAV per USTBL.
- Raises
ValueError – If the oracle returns no valid NAV observation.
- Return type
- fetch_total_supply(block_identifier='latest')
Read the outstanding USTBL supply.
- fetch_total_assets(block_identifier='latest')
Calculate estimated fund NAV from supply and issuer NAV/share.
Read USTBL total NAV.
- fetch_info()
Export verified on-chain USTBL integration metadata.
- Returns
Token, oracle and price-source identifiers.
- Return type
- fetch_scan_record_extra_data()
Expose valuation and restricted-flow diagnostics.
- fetch_portfolio(universe, block_identifier=None)
Return no directly observable underlying portfolio.
- Parameters
universe (eth_defi.vault.base.TradingUniverse) – Ignored because USTBL assets are off-chain.
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 holdings are not on-chain.
- Returns
Empty spot portfolio.
- Return type
- has_block_range_event_support()
Report unsupported generic flow-event accounting.
- Returns
Falsebecause servicing is issuer-operated.- Return type
- has_deposit_distribution_to_all_positions()
Report unavailable on-chain portfolio distribution.
- Returns
False.- Return type
- get_flow_manager()
Reject unsupported generic flow accounting.
- Raises
NotImplementedError – Always, as Spiko servicing is bespoke.
- Return type
- get_deposit_manager()
Reject public generic transaction support.
- Raises
NotImplementedError – Always, due to eligibility and daily servicing.
- Return type
- fetch_deposit_closed_reason()
Explain unavailable generic subscriptions.
- Returns
Eligibility and issuer-servicing explanation.
- Return type
- fetch_redemption_closed_reason()
Explain unavailable generic redemptions.
- Returns
Eligibility and issuer-servicing explanation.
- Return type
- get_historical_reader(stateful)
Construct the supply and NAV historical reader.
- Parameters
stateful (bool) – Whether to retain shared reader state.
- Returns
USTBL historical reader.
- Return type
- get_management_fee(block_identifier)
Return USTBL’s published annual management fee.
- get_performance_fee(block_identifier)
Return no separately published USTBL performance fee.
- get_fee_data()
Return published USTBL fee metadata.
- Returns
Management fee with no inferred dealing fees.
- Return type
- get_link(referral=None)
Return Spiko’s USTBL product page.
- 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_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_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