Philidor Docs
MethodologyReference Baskets

USDC Core DeFi Vaults

A reference basket of pure-USDC DeFi lending vaults at Philidor's Core risk tier (5 ≤ risk_score < 8). The middle-of-the-road starter template — broader universe than Prime so caps are tighter (15% single-name, 25% curator) to enforce diversification. Same auto-demotion mechanics as the Prime basket: an active-incident clamp on a Core vault drops it out at the next rebalance. Same conservative re-eval triggers (1.0 score-delta threshold, 30-day throttle).

Summary

A reference basket of pure-USDC DeFi lending vaults at Philidor's Core risk tier (5 ≤ risk_score < 8). The middle-of-the-road starter template — broader universe than Prime so caps are tighter (15% single-name, 25% curator) to enforce diversification. Same auto-demotion mechanics as the Prime basket: an active-incident clamp on a Core vault drops it out at the next rebalance. Same conservative re-eval triggers (1.0 score-delta threshold, 30-day throttle).

Constituent Type

Vault (each constituent is a DeFi vault holding a qualifying terminal-underlying asset)

Minimum constituents: 8.

Eligibility Rule

A vault is eligible when its Philidor risk tier is Core, its review_status is "reviewed", its asset_components array is exactly ["USDC"], and is_stablecoin = TRUE. Core vaults that drop to Edge tier (or are demoted by an active-incident clamp) are removed at the next rebalance; Core vaults that get upgraded to Prime move out of this basket and into the USDC Prime basket.

Structured form (the rebalancer reads this exact shape):

{
  "asset_category": [],
  "review_status": ["reviewed"],
  "terminal_underlying_category": [],
  "terminal_underlying_min_backing_offchain_pct": null,
  "tier": ["Core"]
}

Weighting Rule

Each Core constituent receives a raw weight proportional to its risk score above 5.0 (the Core tier floor); raw weights are then normalised so the basket sums to 100%. The Core universe is broader than Prime, so caps lean tighter (15% single-name) to ensure diversification.

Formula:

w_i ∝ max(0, risk_score_i − 5.0); normalize so Σ w_i = 1.0

Worked Example

ConstituentRisk ScoreRaw Weight (score − pivot)Normalised Weight
Constituent A9.004.0026.23%
Constituent B8.503.5022.95%
Constituent C8.003.0019.67%
Constituent D7.502.5016.39%
Constituent E7.252.2514.75%
Sum15.25100.00%

In this illustrative case every normalised weight is below the 15% single-name cap and above the 2% floor, so no cap-redistribution is needed. When a constituent exceeds a cap, the rebalancer iteratively trims it to the cap and redistributes the excess across the remaining names in proportion to their current weights, repeating until all caps and the floor are simultaneously satisfied (within 50 iterations — see invariant I5).

Caps

CapValueMeaning
Single-name15%No constituent may exceed this share of the basket.
Issuer25%Cross-chain deduplicated; aggregate exposure to one issuer is bounded.
Floor2%Any constituent below the floor is dropped before final normalisation.

Refresh Schedule

Rebalances run on a calendar schedule (the last business day of March, June, September, and December at 16:00 UTC) and additionally fire when any constituent crosses a tier boundary, when a hard-fail flag triggers, when an active-incident clamp applies, or when a constituent's risk score moves by ≥ 1.0. Routine APY drift below the 1.0 threshold does NOT trigger a rebalance — that is the conservative posture stablecoin-vault customers asked for. Rating-triggered rebalances are throttled to at most one every 30 days; calendar rebalances always fire and are not throttled.

Structured form (the rebalancer reads this exact shape):

{
  "calendar_day": "last_business_day",
  "calendar_months": [3, 6, 9, 12],
  "calendar_time_utc": "16:00",
  "rating_move_throttle_days": 30,
  "rating_move_triggers": [
    "tier_change",
    "score_delta_ge_1_0",
    "hard_fail_flag",
    "active_incident_clamp",
    "new_eligible_entrant",
    "methodology_version_change"
  ]
}

Halt Conditions

The rebalancer enforces the following halt-closed invariants. When any of these fails the rebalance aborts and the prior published version is preserved; alerts page the on-call.

IDDescription
I1Every constituent must have a non-null issuer_id and risk_score and review_status = "reviewed". Otherwise the constituent is rejected.
I2The eligible set must contain at least min_constituents names. If it falls below, the rebalance aborts and the prior published version is preserved.
I3Eligible-set turnover versus the prior version must not exceed 50%. A higher turnover triggers a "universe shock" abort with the prior version preserved.
I4The indexer must have a successful run within the last 6 hours. Stale ratings abort the rebalance and the prior version is preserved.
I5Cap-redistribution must converge within 50 iterations. Otherwise the rebalance aborts; equal-weight fallback only runs with an explicit operator flag.
I6The published weights must sum to 1.0 within 1e-6. The database CHECK constraint refuses to commit a version row that violates this.
I7Calendar and rating-move rebalances are mutually exclusive per basket via a Postgres advisory lock; a second concurrent rebalance exits cleanly.
I8Every published version is content-hash signed; the current_version_id pointer is moved atomically only after constituents and signature are written.
I9Every version is reproducible from frozen inputs stored in basket_version_inputs; CI replays the latest version and asserts byte-equality of canonical JSON.
I10The methodology doc_url must resolve with HTTP 200 before publish. A missing or 404 doc aborts the rebalance.

Version

Current methodology version: 1.0.0

Methodology document URL: https://docs.philidor.io/docs/methodology/baskets/usdc-core-vaults

Change Log

  • 1.0.0 — Initial published methodology.

On this page

Raw