erc_4626.vault_protocol.accountable.offchain_metadata
Documentation for eth_defi.erc_4626.vault_protocol.accountable.offchain_metadata Python module.
Accountable Capital vault offchain metadata.
Accountable stores vault descriptions in their web app, not on-chain
We reverse-engineered the React SPA at
yield.accountable.capitaland discovered API endpoints that serve vault metadata including strategy descriptionsThe listing endpoint
/api/loanreturns paginated vault data with basic infoThe detail endpoint
/api/loan/{id}returns full metadata includingvault_strategyandcompany_infodescriptionsWe fetch and cache this data locally to avoid repeated API calls
Two-level caching: disk (2-day TTL) + in-process dictionary
Single cache file for all chains (Accountable has ~7 vaults total)
Accountable may remove a vault from its API after it has been discovered. The durable vault database must retain its latest available metadata copy; an API omission must not erase previously stored descriptions.
Module Attributes
Accountable yield app API base URL, reverse-engineered from their React SPA |
Functions
|
Extract a listing-friendly first sentence from a vault strategy. |
|
Fetch vault metadata from Accountable's offchain yield app API. |
|
Fetch and cache all Accountable offchain vault metadata. |
Classes
Metadata about an Accountable vault from offchain source. |
- DEFAULT_CACHE_PATH = PosixPath('/home/runner/.tradingstrategy/cache/accountable')
Where we cache fetched Accountable metadata files
- DEFAULT_API_BASE_URL = 'https://yield.accountable.capital/api'
Accountable yield app API base URL, reverse-engineered from their React SPA
- class AccountableVaultMetadata
Bases:
TypedDictMetadata about an Accountable vault from offchain source.
Fetched from the Accountable yield app API at
yield.accountable.capital. Discovered by reverse-engineering the React SPA JavaScript bundles.Listing endpoint:
GET /api/loanDetail endpoint:
GET /api/loan/{id}
The detail endpoint returns
vault_strategyandcompany_infofields that provide strategy and company descriptions.- loan_address: Optional[str]
Loan/strategy contract address used in the yield app URL (distinct from the ERC-4626 vault/share token address)
- __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.
- extract_first_sentence(text)
Extract a listing-friendly first sentence from a vault strategy.
Accountable’s API provides only a full
vault_strategyfield. Itscompany_infofield describes the manager, rather than the individual vault, so it must not be used for the vault listing summary.
- fetch_accountable_vaults(cache_path=PosixPath('/home/runner/.tradingstrategy/cache/accountable'), api_base_url='https://yield.accountable.capital/api', now_=None, max_cache_duration=datetime.timedelta(days=2))
Fetch and cache all Accountable offchain vault metadata.
Fetches all vaults from the listing endpoint across all chains
Fetches detail for each vault to get strategy descriptions
Single JSON cache file for all Accountable vaults (~7 total)
Multiprocess safe via file lock
- Parameters
cache_path (pathlib.Path) – Directory for cache files (default
~/.tradingstrategy/cache/accountable/)api_base_url (str) – Accountable API base URL
now – Override current time (for testing)
max_cache_duration (datetime.timedelta) – How long before refreshing cache (default 2 days)
now_ (Optional[datetime.datetime]) –
- Returns
Dict mapping checksummed vault address to
AccountableVaultMetadata- Return type
dict[str, eth_defi.erc_4626.vault_protocol.accountable.offchain_metadata.AccountableVaultMetadata]
- fetch_accountable_vault_metadata(web3, vault_address)
Fetch vault metadata from Accountable’s offchain yield app API.
Do both in-process and disk cache to avoid repeated fetches
- Parameters
web3 (web3.main.Web3) – Web3 instance (used to checksum address)
vault_address (eth_typing.evm.HexAddress) – Vault contract address
- Returns
Metadata dict or None if the vault is not in Accountable’s app database
- Return type
Optional[eth_defi.erc_4626.vault_protocol.accountable.offchain_metadata.AccountableVaultMetadata]