erc_4626.vault_protocol.ember.offchain_metadata

Documentation for eth_defi.erc_4626.vault_protocol.ember.offchain_metadata Python module.

Ember vault offchain metadata.

  • Ember stores vault descriptions, fees, and manager info in their web app, not on-chain

  • Official API spec

  • Open-source contracts

  • The vault listing endpoint /api/v2/vaults?chain=ethereum returns all EVM vaults with metadata including descriptions, fee parameters, APY, tags, and manager info

  • We fetch and cache this data locally to avoid repeated API calls

  • Two-level caching: disk (2-day TTL) + in-process dictionary

API base: https://vaults.api.sui-prod.bluefin.io

Numeric encoding convention:

  • E9 suffix: value multiplied by 10^9

  • E18 suffix: value multiplied by 10^18

  • weeklyPerformanceFeeBpsE9: bps value in E9 format

Module Attributes

DEFAULT_API_BASE_URL

Ember vault API base URL, reverse-engineered from the Vite+React SPA at ember.so

Functions

fetch_ember_vault_metadata(web3, vault_address)

Fetch vault metadata from Ember's offchain API.

fetch_ember_vaults([cache_path, ...])

Fetch and cache all Ember offchain vault metadata.

Classes

EmberRewardToken

A reward token distributed by an Ember vault.

EmberVaultMetadata

Metadata about an Ember vault from offchain source.

DEFAULT_CACHE_PATH = PosixPath('/home/runner/.tradingstrategy/cache/ember')

Where we cache fetched Ember metadata files

DEFAULT_API_BASE_URL = 'https://vaults.api.sui-prod.bluefin.io/api/v2'

Ember vault API base URL, reverse-engineered from the Vite+React SPA at ember.so

class EmberRewardToken

Bases: TypedDict

A reward token distributed by an Ember vault.

symbol: str

Token symbol, e.g. BLUE

name: str

Token name, e.g. Bluefin Token

address: str

Token contract address

logo_url: Optional[str]

Token logo URL

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

Bases: TypedDict

Metadata about an Ember vault from offchain source.

Fetched from the Bluefin vaults API at vaults.api.sui-prod.bluefin.io. Official API spec at SwaggerHub.

  • Listing endpoint: GET /api/v2/vaults?chain=ethereum

name: str

Vault name, e.g. Crosschain USD Vault

long_name: Optional[str]

Full vault name from API longName field

description: Optional[str]

Full vault strategy description

strategy: Optional[str]

Strategy type, e.g. Stablecoin Strategy

status: Optional[str]

Vault status: active, paused, deprecated, beta

public_type: Optional[str]

Public classification, e.g. Defi Yield

logo_url: Optional[str]

Vault logo URL

management_fee: Optional[float]

Annual management fee as fraction (e.g. 0.02 = 2%)

weekly_performance_fee: Optional[float]

Weekly performance fee as fraction (e.g. 0.0001 = 0.01% per week)

withdrawal_period_days: Optional[int]

Withdrawal lock period in days

reported_apy: Optional[float]

Current reported APY as fraction (e.g. 0.08 = 8%)

target_apy: Optional[float]

Target APY as fraction, from reportedApy.targetApyE9

lending_apy: Optional[float]

Lending APY component as fraction, from reportedApy.lendingApyE9

reward_apy: Optional[float]

Reward APY component as fraction, from reportedApy.rewardApyE9

tvl_usd: Optional[float]

Total vault TVL in USD

manager_name: Optional[str]

Curator/manager name, e.g. Third Eye

manager_url: Optional[str]

Curator/manager website URL

manager_logo_url: Optional[str]

Curator/manager logo URL

tags: list[str]

Category tag names

total_depositors_count: Optional[int]

Total number of depositors (all-time)

active_depositors_count: Optional[int]

Currently active depositor count

created_at: Optional[int]

Vault creation timestamp (Unix seconds)

rewards: list[eth_defi.erc_4626.vault_protocol.ember.offchain_metadata.EmberRewardToken]

Reward tokens distributed by the vault

supported_coins: list[str]

Deposit asset symbols from chain-specific details

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

fetch_ember_vaults(cache_path=PosixPath('/home/runner/.tradingstrategy/cache/ember'), api_base_url='https://vaults.api.sui-prod.bluefin.io/api/v2', chain='ethereum', now_=None, max_cache_duration=datetime.timedelta(days=2))

Fetch and cache all Ember offchain vault metadata.

  • Fetches vaults for the given chain from a single API call

  • Single JSON cache file for all Ember EVM vaults (~9 total)

  • Multiprocess safe via file lock

Parameters
  • cache_path (pathlib.Path) – Directory for cache files (default ~/.tradingstrategy/cache/ember/)

  • api_base_url (str) – Ember API base URL

  • chain (str) – Chain name as used by the Ember API (e.g. "ethereum")

  • 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 EmberVaultMetadata

Return type

dict[str, eth_defi.erc_4626.vault_protocol.ember.offchain_metadata.EmberVaultMetadata]

fetch_ember_vault_metadata(web3, vault_address)

Fetch vault metadata from Ember’s offchain 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 Ember’s database

Return type

Optional[eth_defi.erc_4626.vault_protocol.ember.offchain_metadata.EmberVaultMetadata]