vault.curator_export

Documentation for eth_defi.vault.curator_export Python module.

Build curator metadata and recent feed entries for the vault JSON export.

Resolves curator slugs from vault records to structured metadata (name, website, social URLs, logos) and recent feed entries from the post database. The result is a dict keyed by curator slug, stored at the top level of the vault metrics JSON bundle alongside core3_protocols.

Example:

from eth_defi.feed.database import VaultPostDatabase
from eth_defi.vault.curator_export import build_curators_for_export

feed_db = VaultPostDatabase(Path("vault-post-database.duckdb"))
curators = build_curators_for_export(
    ["gauntlet", "re7-labs", "hyperliquid"],
    feed_db=feed_db,
)
feed_db.close()

# curators["gauntlet"]["recent_posts"] → list of recent feed entries

Functions

build_curators_for_export(curator_slugs[, ...])

Build a curator-slug-keyed dict for the vault metrics JSON export.

Classes

CuratorExportRecord

Serialised curator record for the vault metrics JSON export.

CuratorFeedEntry

A single recent feed entry from a curator's tracked sources.

class CuratorFeedEntry

Bases: TypedDict

A single recent feed entry from a curator’s tracked sources.

Used inside CuratorExportRecord to surface recent social media and blog activity in the vault JSON bundle.

title: Optional[str]

Post title, or None for untitled posts (e.g. tweets).

snippet: str

Short preview text (first 200 chars), suitable for compact listings.

Derived from short_description. For the complete post body see full_text.

full_text: str

Full untruncated post body.

For X/Twitter this includes the complete note tweet text for tweets longer than 280 characters, not just the preview — see eth_defi.feed.twitter_api._extract_full_tweet_text(). Derived from full_text. For the 200-character preview see snippet.

Canonical URL to the original post, or None.

source_type: str

Source transport type: "twitter", "linkedin", or "rss".

published_at: str

ISO 8601 UTC timestamp when the post was published. Always set — falls back to fetch time when the source does not provide a publication timestamp.

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

Bases: TypedDict

Serialised curator record for the vault metrics JSON export.

Contains curator identity metadata and recent feed entries. Keyed by curator slug in the top-level curators dict of VaultMetricsExport.

slug: str

Curator slug (e.g. "gauntlet", "re7-labs").

name: str

Human-readable display name.

website: Optional[str]

Company website URL, or None.

short_description: Optional[str]

One-line description of the curator.

long_description: Optional[str]

Multi-paragraph Markdown description of the curator.

twitter: Optional[str]

Full Twitter/X profile URL (e.g. "https://x.com/gauntlet_xyz"), or None.

linkedin: Optional[str]

Full LinkedIn company URL, or None.

rss: Optional[str]

RSS or Atom feed URL, or None.

protocol_curator: bool

Whether this is a protocol-native curator (the protocol itself acts as curator) rather than a third-party risk manager.

canonical_feeder_id: Optional[str]

When this curator is an alias, the slug of the canonical feeder whose posts should be used. None for non-alias curators.

logos: eth_defi.vault.curator.CuratorLogos

Logo URLs for available 256x256 PNG variants.

recent_posts: list[eth_defi.vault.curator_export.CuratorFeedEntry]

Most recent feed entries, ordered newest first.

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

build_curators_for_export(curator_slugs, feed_db=None, max_posts_per_curator=10, public_url='')

Build a curator-slug-keyed dict for the vault metrics JSON export.

For each curator slug present in the exported vaults:

  1. Load metadata from curator YAML via build_curator_metadata_json(), or from the protocol YAML for protocol curators without a curator YAML file.

  2. Resolve canonical_feeder_id for alias curators so that feed posts are looked up under the correct feeder.

  3. Batch-query recent posts from the feed database.

  4. Convert timestamps to ISO 8601 strings and assemble the final CuratorExportRecord dicts.

When feed_db is None (e.g. the database file does not exist), all recent_posts lists will be empty.

Parameters
  • curator_slugs (collections.abc.Iterable[str]) – Iterable of curator slugs to include (typically extracted from curator_slug fields in the vault records).

  • feed_db (Optional[eth_defi.feed.database.VaultPostDatabase]) – Open vault post database for querying recent posts. Pass None to skip feed enrichment.

  • max_posts_per_curator (int) – Maximum number of recent posts per curator.

  • public_url (str) – Public base URL for constructing logo URLs.

Returns

Dict mapping curator slug to CuratorExportRecord.

Return type

dict[str, eth_defi.vault.curator_export.CuratorExportRecord]