Skip to content

the CCTP reading gets its own block, and every chains column has to cover the cohort - #2717

Merged
Flotapponnier merged 1 commit into
devfrom
fix/capital-cctp-block
Sep 29, 2026
Merged

Flotapponnier merged 1 commit into
devfrom
fix/capital-cctp-block

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Follow-up to #2716. Florent's reaction to the deployed page was that values are still missing everywhere. He was reacting to something real, and it was one column.

The column

Net USDC over CCTP covered 7 of 63 chains and had a column on the widest table on the page, so 56 of the 114 markers on that table were that one column. A column that does not apply to 89% of its rows reads as a broken table whatever the legend says.

The cause was capital-hub-tabs.tsx: rows.some((r) => r.cctpNet7d != null), so one row with a value showed the column for all sixty-three, while columnIsWorthShowing and its 50% floor sat in capital-hub-rules.ts applied to the protocols table only.

Not deleted, re-housed

Bench 281 scans seven chains as CCTP sources and that is a capital flow worth following, so it is now its own block under the chains table over those seven chains, with net, in and out, sortable, and the same in-scope caveat the Sources section makes (one bridge's ledger over one stablecoin, not total cross-chain flow; Net stables 30d is the bridge-agnostic reading). Seven rows of real numbers instead of sixty-three rows where seven carry a figure. Same treatment in the Markdown view.

notApplicable.cctp stays on the row in /api/capital: it has no column any more, but it still answers the same question in words for an API consumer.

The guard, so it cannot recur

Every optional chains column now goes through columnIsWorthShowing, on the value that would actually print. New printedValue(ranked, outside) counts a muted out-of-cohort figure as present, because a column at 38 ranked plus 20 muted is a full column and a null check on the ranked field alone would read 38/63 and drop it. Tested both ways.

Coverage today, all eight columns retained:

column covered
TVL 61/63 97%
DEX volume 24h 60/63 95%
stablecoin float 59/63 94%
fees 30d 58/63 92% (38 ranked + 20 muted)
revenue 30d 58/63 92%
net stables 30d 57/63 90% (26 ranked + 31 muted)
bridged value 42/63 67%
7d vs L2 median 42/63 67%
USDC over CCTP 7/63 11%, moved to its own block

Markers after

Chains table 114 to 58, and every one is honest:

  • 42 on the bridged pair: 20 sovereign L1s and Ethereum, two columns each
  • 10 on fees and revenue: the 5 chains with no DeFiLlama fee adapter, two columns each
  • 6 on stablecoin float

Page total 76, the remaining 18 being the open-interest tables (13: warm-up windows, Kalshi's mid-window step, venues outside a perp cohort) and the protocols table (5: the two categories under five members).

No cohort was loosened and no cell was filled from a neighbouring or cohort-level figure.

pnpm validate 240 specs, pnpm typecheck, eslint clean, 362 tests pass.

…over the cohort

Net USDC over CCTP covered 7 of 63 chains and had a column on the widest
table on the page, so 56 of the 114 markers on that table were one
column. A column that does not apply to 89% of its rows reads as a broken
table whatever the legend says, which is what Florent saw.

The reading is not deleted: bench 281 scans seven chains as CCTP sources
and that is a capital flow worth following, so it is now its own block
under the chains table over those seven chains, with net, in and out and
the same in-scope caveat. Seven rows of real numbers instead of
sixty-three rows where seven carry a figure.

The cause was `rows.some((r) => r.cctpNet7d != null)`: one row with a
value showed the column for all sixty-three, while columnIsWorthShowing
and its 50% floor sat unused on this table. Every optional chains column
now goes through it, on the value that would actually print: a new
`printedValue` counts a muted out-of-cohort figure as present, so fees at
38 ranked plus 20 muted reads as 58 of 63 and is not dropped by a naive
null check on the ranked field. Coverage today: TVL 61, stablecoin float
59, DEX volume 60, fees and revenue 58 each, net stables 57, bridged 42.
All eight columns stay.

Markers on the chains table fall from 114 to 58, all of them honest: 42
on the bridged pair (20 sovereign L1s and Ethereum, two columns each), 10
on fees and revenue (5 chains with no DefiLlama fee adapter, two columns
each), 6 on stablecoin float. No cohort was loosened and no cell was
filled from a neighbour.
@Flotapponnier
Flotapponnier merged commit 18eca0c into dev Sep 29, 2026
2 checks passed
@Flotapponnier
Flotapponnier deleted the fix/capital-cctp-block branch September 29, 2026 19:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant