Skip to content

Commit 0e9643f

Browse files
sktbrdclaude
andcommitted
fix(treasury): honest-copy notes — thin-market Sendit, whose money is staked
Three notes that keep adjacent numbers from lying by omission: - Sendit's value gets a qualitative thin-market caveat (its screen price comes from one Uniswap pool with ~$0.44 of daily volume). No number in the UI — a fixed percentage would age into misinformation; the dated measurement (2026-08-23: full 474M exit realizes 88.6% of screen, 10% tranche 96.9%, reserve ~$115k) lives in the code comment. - The sponsorship card's Total staked says it is BACKERS' money — the same word 'staked' sits centimeters from the DeFi card's 'vault shares $0', and without the line the two read as a contradiction. - treasury.ts documents the page-headline consequence of marking any token unpriced: one null price nulls the whole total (a total missing a part is an unknown total, not a smaller one) — so the next person knows BEFORE flipping that switch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 20b4280 commit 0e9643f

5 files changed

Lines changed: 44 additions & 9 deletions

File tree

messages/en/treasury.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"description": "ERC-20 tokens held in the treasury",
2828
"empty": "No tokens found",
2929
"emptyDescription": "The treasury currently holds no ERC-20 tokens",
30-
"errorLoading": "Error loading token holdings: {error}"
30+
"errorLoading": "Error loading token holdings: {error}",
31+
"thinMarketNote": "market-price estimate from one low-volume pool — a full exit would realize less than shown"
3132
},
3233
"zoraCoin": {
3334
"title": "Zora Coins",
@@ -117,7 +118,8 @@
117118
"govCta": "Start redeem proposal",
118119
"accrualNote": "Fees materialize when someone interacts with a vault, not continuously — the figures can sit still for weeks, then jump all at once. An older small vault can carry more accrued fee than a big recent one.",
119120
"fromVaults": "Vault fee",
120-
"fromMor": "MOR rewards"
121+
"fromMor": "MOR rewards",
122+
"stakedNote": "Backers' money staked behind the riders — not the treasury's own position (that lives under In DeFi)."
121123
},
122124
"defi": {
123125
"title": "In DeFi",

messages/pt-br/treasury.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"description": "Tokens ERC-20 mantidos no tesouro",
2828
"empty": "Nenhum token encontrado",
2929
"emptyDescription": "O tesouro não tem tokens ERC-20 no momento",
30-
"errorLoading": "Erro ao carregar holdings de tokens: {error}"
30+
"errorLoading": "Erro ao carregar holdings de tokens: {error}",
31+
"thinMarketNote": "estimativa a preço de mercado de um pool de baixo volume — a saída integral realizaria menos que o valor de tela"
3132
},
3233
"zoraCoin": {
3334
"title": "Zora Coins",
@@ -117,7 +118,8 @@
117118
"govCta": "Abrir proposta de resgate",
118119
"accrualNote": "O rendimento materializa quando alguém interage com o vault, não de forma contínua — os números podem ficar parados por semanas e pular de uma vez. Um vault pequeno e antigo pode acumular mais que um grande e recente.",
119120
"fromVaults": "Taxa dos vaults",
120-
"fromMor": "Recompensas MOR"
121+
"fromMor": "Recompensas MOR",
122+
"stakedNote": "Dinheiro de apoiadores atrás dos riders — não é posição do tesouro (essa fica em Em DeFi)."
121123
},
122124
"defi": {
123125
"title": "Em DeFi",

src/components/treasury/SponsorshipYield.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,20 @@ export function SponsorshipYield({ brlRate = null }: { brlRate?: number | null }
211211
</ul>
212212
</div>
213213

214-
<div className="flex items-baseline justify-between gap-2.5 border-t border-border pt-3">
215-
<span className="text-xs text-muted-foreground">{t("totalTvl")}</span>
216-
<span className="font-mono text-sm font-semibold tabular-nums">
217-
{graph ? usd(totalTvl) : "—"}
218-
</span>
214+
<div className="border-t border-border pt-3">
215+
<div className="flex items-baseline justify-between gap-2.5">
216+
<span className="text-xs text-muted-foreground">{t("totalTvl")}</span>
217+
<span className="font-mono text-sm font-semibold tabular-nums">
218+
{graph ? usd(totalTvl) : "—"}
219+
</span>
220+
</div>
221+
{/* Same word ("staked"), different subject: this figure is the
222+
SUPPORTERS' money behind the riders. The treasury's own position
223+
sits centimeters below in the In DeFi card — without this line,
224+
"$79k staked" next to "vault shares $0" reads as a contradiction. */}
225+
<p className="mt-1 text-[11px] leading-snug text-muted-foreground/70">
226+
{t("stakedNote")}
227+
</p>
219228
</div>
220229

221230
{claimable.length > 0 ? (

src/components/treasury/TokenHoldingsClient.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import { useLocale, useTranslations } from "next-intl";
44
import Image from "next/image";
55
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
6+
import { TREASURY_TOKEN_ALLOWLIST } from "@/lib/config";
67
import { formatFiatUsd } from "@/lib/i18n/fiat";
78
import { toIntlLocale } from "@/lib/i18n/format";
89
import { FiatFallbackNote } from "./FiatFallbackNote";
@@ -106,6 +107,19 @@ export function TokenHoldingsClient({ tokens, error, brlRate = null }: TokenHold
106107
<div className="text-sm text-muted-foreground tabular-nums">
107108
{formatBalance(token.balance, token.decimals)} {token.symbol}
108109
</div>
110+
{/* Sendit trades in exactly one thin-volume Uniswap pool, so
111+
its screen price is a market estimate, not an exit value.
112+
Measured 2026-08-23 (UTC), QuoterV2 against the Sendit/WETH
113+
0.3% pool (reserve ~$115k, 24h vol $0.44): selling the full
114+
474M position in one swap realized 88.6% of screen price;
115+
a 10% tranche realized 96.9%. The note is deliberately
116+
qualitative — a number would age into misinformation. */}
117+
{token.contractAddress.toLowerCase() ===
118+
TREASURY_TOKEN_ALLOWLIST.SENDIT.toLowerCase() && (
119+
<div className="mt-0.5 max-w-[13rem] text-[11px] leading-snug text-muted-foreground/80">
120+
{t("tokens.thinMarketNote")}
121+
</div>
122+
)}
109123
</div>
110124
</li>
111125
))}

src/services/treasury.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ export const loadTreasurySnapshot = cache(
129129
const nativeEthUsd = ethBalance * (ethUsd ?? 0);
130130
// `null` = "we could not price this", which every consumer must render as
131131
// unavailable. It is never the same thing as a treasury worth $0.
132+
//
133+
// KNOW THIS BEFORE MARKING ANY TOKEN AS UNPRICED: a total missing one part
134+
// is not a smaller total — it is an UNKNOWN total. One `null` price here
135+
// nulls `usdTotal`, and the page's headline number becomes a dash. That is
136+
// deliberate (a confident wrong figure is worse), but it means "mark token
137+
// X as unpriceable" is a page-headline decision, not a row decision. If a
138+
// partial figure is ever wanted instead, use the DeFi card's pattern: a
139+
// labeled floor ("known so far"), never a silent subtraction.
132140
const usdTotal: number | null = priced ? tokensUsd + nativeEthUsd : null;
133141
const totalAuctionSales = Number(formatEther(auctionSalesWei));
134142

0 commit comments

Comments
 (0)