"""RMI v5 §T11 — Federated wallet labels domain. Aggregates wallet labels from 6 sources in parallel: 1. eth-labels.db — 115K EVM labels (local SQLite) 2. Etherscan CSV — 51K EVM labels (local CSV via DuckDB) 3. Ethereum labels CSV — 51K EVM labels (local CSV via DuckDB) 4. Solana labels CSV — 103K SOL labels (local CSV via DuckDB) 5. ClickHouse — wallet_memory.wallet_labels (live API) 6. MetaSleuth — live API at aml.blocksec.com (works) Each source has its own adapter in app/domain/labels/sources/. The FederatedLabelAPI orchestrator queries all sources concurrently with asyncio.gather(return_exceptions=True), deduplicates by (address, chain, label_type), and tags each label with provenance. Graceful degradation: if a source is unreachable, we log + skip it and return labels from whatever did work. Per RMIV5 v4.0 §T28 (P1): biggest moat — 5K internal labels → 200K+ via federation. """ from app.domain.labels.federated import ( FederatedLabelAPI, get_federated_api, ) from app.domain.labels.models import Label, LabelSource __all__ = [ "FederatedLabelAPI", "Label", "LabelSource", "get_federated_api", ]