Carry Strategies (/carries)
Purpose: A screener for structured carry trades: positions where a trader deposits yield-bearing collateral on a lending protocol and borrows a cheaper asset against it, capturing the net spread. The page targets fixed-income portfolio managers and treasuries that want levered yield with a quantified risk profile.
ISR revalidation: 60 minutes.
Strategy Types
The page tracks strategies across three protocols (Fluid, Aave v3, SparkLend) using four structural types from Fluid's architecture plus the two e-mode shapes:
| Type | Structure | Example |
|---|---|---|
| T1 Single | Yield-bearing collateral vs. single borrowed token | sUSDe collateral, borrow GHO |
| T2 Smart-Col / Single Debt | LP position in a Fluid DEX pool as collateral, borrow single token | weETH/ETH pool collateral, borrow wstETH |
| T3 Single Col / Smart Debt | Single collateral, borrow against a DEX-pool smart-debt position | reUSD collateral, smart debt in a USDC/USDT pool |
| T4 Smart-Col / Smart-Debt | LP as collateral AND smart-debt LP | wstETH/ETH pool on both sides |
| Aave v3 E-mode | Correlated-asset e-mode position on Aave v3 | wstETH collateral, borrow WETH |
| SparkLend E-mode | Same shape as Aave e-mode, separate pool | rETH collateral, borrow WETH |
Each leg's APY is composed from on-chain index components and summed (full formulas in Metric Methodology). For T4 the carry nets two compounding pools: the smart-col earns fee APY plus weighted token appreciation, while the smart-debt pays weighted borrow cost minus fee APY (the borrower captures fees from the debt side).
Coverage: curated + auto-discovered vaults
The displayed rows are the union of two sources, deduplicated by vault address:
- Curated strategies — a hand-maintained registry in
carries/page.tsx, each with a hand-written description. - Auto-discovered Fluid vaults — every live Fluid vault whose supply-side TVL clears a $100k floor and that the app can render correctly, maintained in the
fluid_vault_registrytable by the ad-hocsync-fluid-vaults.tsjob (see Data Pipeline).
The sync pulls Fluid's API, computes supply USD TVL, classifies each vault into a T1–T4 config, and assigns a status:
| Status | Meaning | Shown? |
|---|---|---|
active | TVL ≥ floor and every token/pool it needs is covered | Yes |
below_floor | TVL < $100k | No |
blocked_adapter | A collateral/debt token's intrinsic yield isn't modelled yet | No |
blocked_pool | A smart-col/debt DEX pool isn't snapshotted yet | No |
blocked_review | Unrecognised token, unsupported type, or a different-pool T4 | No |
gone | Was in the registry but no longer returned by the Fluid API | No |
Blocked vaults are deliberately not shown. Displaying a carry whose collateral/debt yield the app cannot model correctly would mis-state it, and this is a credit-DD terminal. One concrete guard: a type-4 vault whose smart-collateral and smart-debt sit in different pools is blocked_review, because the current single-pool reader would read the collateral pool's (zero) debt reserves and report a wrong, often negative, debt APY. Auto-rows degrade gracefully where data is thin: risk parameters fall back to the registry's stored LTV, the capacity chip is suppressed, and the simulator's swap-cost quote degrades (rather than crashing) for tokens whose decimals aren't known.
CarriesTable
Bloomberg-style expandable table. Columns:
| Column | Description |
|---|---|
| Platform | Protocol (Fluid, Aave v3, SparkLend); e-mode shown as a subtitle |
| Collateral asset | Target (yield-earning) asset |
| Debt asset | Borrowed (funding) asset |
| Collateral APY | Target-leg realised trailing APY (7d / 30d toggle) |
| Debt APY | Funding-leg realised trailing APY |
| Carry | Net spread (collateral APY − debt APY) |
| Carry vol | Sample standard deviation of carry over the window |
| Sharpe | Carry mean ÷ carry vol (same-sample; see Metric Methodology) |
| Max-lev carry | Carry at maximum safe leverage given the vault's LLTV |
Window toggle: 7D / 30D, switching every same-sample column consistently. Filters: multi-select Platform and a searchable Collateral-asset filter, plus an ETH / BTC / USD collateral-type filter. Deep-link: ?carry=STRATEGY_KEY opens a specific row on load.
Row expansion
Expanding a row reveals a two-column layout: the chart stack on the left and the trade simulator on the right, with a CHART / ORACLE toggle at the top. For pool-leg strategies (T2/T3/T4) the SmartCol/SmartDebt decomposition cards show the live token composition on each side of the pool.
CarryChart (three stacked panels)
- Collateral vs funding APY — target-leg APY (foreground) and funding-leg APY (amber) over time, so a reader can see whether a widening spread came from the collateral yield rising, the debt rate falling, or both.
- Carry differential — the net carry (cyan), filled green above zero and red below, making periods of negative carry obvious.
- Cumulative return (equity curve) — green curve showing the growth of $1 at the selected leverage, derived from
cum = L·colCum − (L−1)·debtCumwith elapsed-aware compounding.
Timeframe pills: 24h, 7d, 1m, 6m, 1y, ytd. On 6-month-or-longer windows the chart switches from per-snapshot (6h) spot rates to the 24h rolling average (and the daily rollup tables) to remove intraday noise. Carry-panel axis: a symlog transform (forward asinh(v·100), inverse sinh(t)/100) keeps zero in frame while compressing rate spikes.
Chart leverage slider
A compact, draggable control inline in the cumulative-return panel header ("ADJUST LEVERAGE"). It defaults to max-loop leverage (1/(1−maxLTV)) and, on drag, recomputes the green equity curve live anywhere between 1× and max. It is a historical backtest control and is fully independent of the simulator's own leverage slider (a forward projection that defaults to 1×). Terminal-styled: a 1px hairline rail, faint integer ticks, a thin amber I-beam handle.
Trade simulator
The right column is a forward-projection calculator, decoupled from the charts (it owns its own state).
- Inputs: notional, holding period (days), target-APY and funding-APY assumptions (each with 7D / 30D / 90D trailing-window presets), and a leverage risk-slider (SAFE / CAUTION / DANGER zones derived from the vault LLTV).
- Outputs: NET APY hero, period RETURN (% and $), gross APY at the chosen leverage, and the cost of entering / exiting.
- Execution cost comes from
POST /api/sim/swap-cost, which prices the round-trip swaps via the 0x Swap API; it falls back to a fixed bps estimate when a live quote isn't available. Tiered cost warnings flag round-trips that are large relative to equity or to the projected gross return. - Risk readouts: health factor, liquidation distance, and a risk score, with a danger banner near max leverage.
- The math is
grownLeveragedPosition(see Metric Methodology): both legs compound independently, no rebalancing, equity floored at zero.
Capacity panels
- CapacityTightPanel — a banner at the top of the page when a strategy's borrow usage exceeds ~80% of the current dynamic cap (Fluid's expandable ceiling), with an email-capture form for a headroom alert.
- BorrowCapacityChart — a 48-hour forward projection of the Fluid dynamic borrow cap, shown only when usage is ≥50% of the current cap AND the cap hasn't reached its hard ceiling (below that, the chart carries no actionable signal and is suppressed).
Oracle tab
Toggling to ORACLE swaps the expansion for the oracle-transparency panel, which explains how the strategy's collateral and debt are priced and what that means for liquidation risk. It is lazy-loaded (the on-chain reads fire only when the tab is opened). Full detail in Oracle Transparency.