research: UST1 collateral — Noble USDC ~3.5% yield vs Venus vFDUSD 6–8% APR (depeg, bank-run, protocol incidents) #574
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#574
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Research / decision only — do not implement a collateral switch in this issue.
Bundle into one investigation (do not split yield vs depeg vs protocol-incident tickets):
exchangeRateaccrual), including protocol incidents.Related live work: #502 (Phase 4 window + wrap), #506 (
/ust1vFDUSD↔UST1), #503 (ops / Venus-pause trigger), #508 (secondary UST1 AMM), #515 / #550 (CEX FDUSD labeled vFDUSD), #571 / #572 (Protocol Venus redeem rate — display only). IBC-hooks gate: #407.Not in scope: shipping a USDC/USDN CW20, changing
ust1-windowallowlist U5, adding indexer tickerusdc, opening IBC/CCTP from the dApp, or marketing a guaranteed APR.Current codebase
CL8Y’s economic dollar-ish hub is UST1, minted/redeemed only against bridged Venus FDUSD (vFDUSD) through the ust1-window. There is no USDC, Noble, USDN, CCTP, or IBC receive path in this repo.
/ust1deposit pay token = vFDUSD only; withdraw pay = UST1 only (U5). Execute is CW20Sendto ust1-window, not the AMM router (U3). Quotes from on-chaineffective_swap(U4).terra1mnl9azefrqpmu888ar2u6zrcwr80hxlt3avf4300r576cw5ar7esvxsvj3; UST1terra1f0eqgy9w7e5e7up97vjudqwx38tesf8ylx75x2lv3nwm0clry0pqmgfy72; windowterra1zxwpzpzpleatqn39r00grau4yt29sld8pw78s7ktvjafnj5nsaxq0h3rh2; oracleterra1fmht0t6svq3n24zx03nkfja0m40zhfyyxkdcvlrkl6u7gfe6aagq4gch8n. Params:fee_bps=100, per-tx 1000 UST1, rolling 24h 10000 UST1.0xC4eF4229FEc74Ccfe17B2bdeF7715fAC740BA0ba; underlying FDUSD0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409. Yield is vToken exchange-rate accrual (borrower interest ± incentives), not a lockup stake. This repo does not poll Venus today (planned display-only in #571/#572).scripts/check-ust1-wrap-ops-health.sh.set_pausedwhen Venus/BSC rate integrity is suspect; windowset_pausedfor window-local maintenance (O3 / runbook A2). Wrap-stack governanceterra1xsecn4…≠ DEX multisig (O6).OracleTicker::Vfdusdpolls FDUSD (MEXCFDUSDUSDT, CoinGeckofirst-digital-usd). Path/api/v1/oracle/price/vfdusd. X4: never used for DEXvolume_usd. P550-9 / X5: not$1, not the window rate. Nousdcticker.uusd/ulunaas pair assets.cw20-whitelist-policy.md: rebase / elastic-supply / balance-mutating tokens are forbidden as pair/escrow assets (pair credits declared transfer amounts, not balance deltas). A yield-bearing USDN-style rebase CW20 cannot be a factory pair leg without a non-rebasing wrapper.ibc_receive/ ack / timeout (SEC-D02/D03,make verify-no-ibc-hooks-in-contracts). Bridging Noble USDC/USDN onto Classic would be a new chain + bridge + wrap program, not a tokenlist edit.connect-srcis LCD/RPC/indexer + WalletConnect. Must not call BSC, Noble, Circle, or Venus HTTP from the dApp.Yield figures in the title are hypotheses. Spot-check (2026-08, public third-party, must be re-dated in the memo): Venus Core Pool FDUSD supply APY has printed well below 6–8% on some aggregators (single-digit / ~1% band); Noble Dollar (USDN) marketing has printed ~3.3–4.3% (T-bill / M^0 index, variable). The investigation must replace 3.5% and 6–8% with sourced time series, not treat them as constants.
Why this is needed
$0.87, Mar 2023, SVB reserve freeze) and FDUSD ($0.87–$0.91, Apr 2025, issuer-insolvency allegation) are not theoretical. UST1 mint at a stale window rate during a depeg is an inventory + solvency event (O4, oracle pause).$1pegs, or rebase pair legs — the same class of mix-up #515 / P550-9 already forbids.Constraints / guardrails
CreatePair, no window allowlist change, no CoolifyVITE_USDC_*, no indexerusdc/usdnticker, no IBC module in DEX wasm.$1for USDC, FDUSD, vFDUSD, USDN, or UST1 (X5 / P550-9). Peg history is part of the answer.effective_swap; CEX feeds stay advisory; VenusexchangeRateStored(if cited) is redeem FDUSD-out, not USD.cw20-whitelist-policy.md). If USDN rebases, the memo must say wrapper required or window-only, never AMM leg.Relevant files
docs/runbooks/ust1-window-ui.mddocs/runbooks/ust1-wrap-production-ops.mddeployments/mainnet-ust1-wrap/REGISTRY.mddocs/runbooks/cw20-whitelist-policy.mddocs/runbooks/indexer-external-oracle.mdvfdusd; X1–X6docs/security-model.mddocs/exploit-replay-matrix.mddocs/adr/0001-hybrid-quoting-and-routing.mdfrontend-dapp/src/pages/Ust1Page.tsx/ust1UIfrontend-dapp/src/services/terraclassic/ust1Window.tseffective_swap+ CW20 Sendfrontend-dapp/src/utils/ust1WindowGates.tsfrontend-dapp/src/utils/tokenRegistry.tstokenlist/tokenlist.jsonindexer/src/indexer/oracle.rsscripts/check-ust1-wrap-ops-health.shdocs/runbooks/ust1-secondary-amm-pair.mdskills/AGENTS_UST1_WINDOW_UI.mdskills/AGENTS_UST1_WRAP_PRODUCTION_OPS.mdskills/AGENTS_INDEXER_EXTERNAL_ORACLE.mdfdusd/usdcdocs/frontend.md/ust1vs/mintdocs/adr/0004-ust1-collateral-usdc-noble-vs-vfdusd.md(suggested)Upstream (read-only for this issue): ust1-window
effective_swap/ oracle updater; ustr-cmm treasury + wrap-mapper.Recommended direction
Write ADR
docs/adr/0004-ust1-collateral-usdc-noble-vs-vfdusd.md(Status: Proposed) plus a short pointer fromdocs/README.mdArchitecture. Optional agent skill stub only if the ADR is accepted later.Decompose each option into a risk stack (do not compare “USDC” vs “vFDUSD” as single tokens):
Required memo sections
$1lie; retail APR copy.If the ADR ever recommends a switch, spawn follow-up implementation issues (window, oracle, treasury, indexer tickers, AMM, Coolify, pause runbooks). Do not sneak them into this MR.
Verify script
scripts/qa/verify-issue-NNN.sh: required ADR headings present; noVITE_USDC/ indexerusdcticker introduced by the same MR unless the ADR status is Accepted and a linked implementation issue exists (this issue’s MR should be docs-only).Acceptance criteria
docs/README.md(or runbook) links the ADR; NFA / non-promissory language on any APR.Test plan (all research paths)
These are document and process tests, not chain deploys. Each path must appear in the ADR (or an appendix checklist) with pass/fail.
REGISTRY.md+ tokenlist +oracle.rs; confirm no USDC symbol in window clientsupplyRatePerBlock/ UI APY with UTC timestamp; state whether 6–8% is current, historical, or marketingblacklist/pausefired (historical: market depeg, not a contract pause)$1or wrong tickerusdcalias tovfdusdand forbids hard peg/ust1or/protocolNegative / skip paths
/ust1effective_swapas a Venus or USDC USD price → fail.Test plan — attack, hack, and abuse vectors
Research must evaluate each vector against both stacks and against today’s UST1/vFDUSD blast radius. Do not write exploits, PoCs, or attack procedures.
symbol=USDC/ path/price/usdc→ vfdusdfdusdalias (X2)/ust1from this researchVerification criteria
Issue is done when all of the following hold:
docs/adr/0004-ust1-collateral-usdc-noble-vs-vfdusd.md(or the path named in the MR) is merged with AC1–AC11.scripts/qa/verify-issue-<iid>.shexists and is wired in the Makefile (verify-issue-<iid>): greps required headings (Yield,USDC depeg,FDUSD depeg,Venus incidents,Noble/M0,Scorecard,Decision); greps ADR for U5 / O4 / X5 / rebase ban; fails ifindexergrows anusdcticker or frontend growsVITE_USDCin the same research MR.make verify-issue-<iid>passes on the docs MR.make verify-issue-506,make verify-issue-503(docs grep),make verify-issue-515/550if oracle docs were only cross-linked — no behavior change.Out of scope for “done”: implementing USDC/Noble, changing Venus pollers (#571/#572), seeding UST1/vFDUSD AMM (#508), or pausing the window.
marked as related to #407
marked as related to #502
marked as related to #503
marked as related to #506
marked as related to #508
marked as related to #515
marked as related to #550
marked as related to #572
mentioned in issue #575
Research note — #574 UST1 collateral: Noble USDC/USDN vs Venus vFDUSD
Status: research comment only (not the in-repo ADR). No window/oracle/indexer/factory change. No APR is a guaranteed return.
Research recommendation (2026-08-21): Stay on vFDUSD / Reject Noble USDC/USDN as UST1 window collateral. Dual inventory: reject (fails U5 / O4 without a new product spec). No implementation issues to spawn.
Title APRs are falsified for current conditions. Venus Core Pool FDUSD supply APY is in the ~0.9–1.3% band on aggregators today (not 6–8%). Noble Dollar (USDN) marketing/30d prints are ~3.3–3.4%, tracking short T-bills (not a locked stake). Ranking solely on APR would invert the title — and would still be the wrong ranking function.
1. Instruments (do not conflate)
$Mextension on Noble. This is the ~3.5% instrument.0xC4eF4229FEc74Ccfe17B2bdeF7715fAC740BA0ba), underlying FDUSD0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409. CL8Y window asset is the bridged CW20 of this vToken.Official mechanics:
$Mon Ethereum via M0 Portal (Wormhole NTT): https://github.com/noble-assets/dollarsupplyRatePerBlock: https://docs-v4.venus.io/guides/protocol-mathNFA: none of the APYs below is a promised UST1 return. Window settlement stays
effective_swap. Do not put an APR badge on/ust1or/protocol.2. Yield — title claims replaced (snapshot 2026-08-21)
Venus Core Pool FDUSD — 6–8% is not current
Methodology: aggregator “APY” ≈ annualized
supplyRatePerBlock(utilization-driven interest), not a 30/90d realized treasury return, not XVS incentives (currently reported 0), not vToken USD price. Official formula: https://docs-v4.venus.io/guides/protocol-mathWhere 6–8% could have come from: historical Binance Launchpool / Venus Prime incentive periods (proposal to add FDUSD as Prime with a 100k FDUSD grant): https://community.venus.io/t/proposal-add-fdusd-as-a-prime-market-to-the-venus-core-pool-on-bnb-chain/4989 — marketing/incentive, not 2026-08 Core Pool base APY.
Redeem-liquidity stress (A4): Allez Labs 2026-06-23 recommended FDUSD Core Pool collateral factor 75% → 50% because BSC DEX depth is exhausted above ~$100k (vs USDC/USDT >$5M): https://community.venus.io/t/allez-labs-risk-parameter-updates-2026-06-23/5835 — headline APY without utilization/redeem depth is incomplete.
On-chain check (not done in this comment):
vFDUSD.supplyRatePerBlock()at0xC4eF4229…on BSC; re-date before any ADR merge.Noble / USDN — ~3.5% is the right ballpark, variable, T-bill-linked
dollar.noble.xyzNoble docs: 102% overcollateralization is a governance parameter; yield is claimable rebase, not auto-wallet-balance on every chain: https://docs.noble.xyz/learn/usdn/overview/
Exact instrument for the title “Noble USDC ~3.5%”: USDN minted against M0
$M, not a third-party liquid-staker of native Noble USDC, and not holding raw USDC (0% yield).3. USDC depeg / bank-run — SVB 2023-03 (AC3)
Chronology (primary + official research):
Contract pause/blacklist: this episode was a market + primary-halt depeg, not a USDC
pause()/blacklist(). Circle still has both:blacklist/pause) documented in Circle v2.2 notes: https://www.circle.com/blog/announcing-usdc-v2-2Contagion (Fed note): Maker USDC PSM drained at a 950M daily cap; DAI, then GUSD/USDP, depegged with no SVB reserve exposure. Hard-coded 1:1 windows transmit issuer stress — the same class as leaving
ust1-windowlive on a stale rate.CL8Y mapping: issuer/bank-run → oracle
set_paused(O3 / A2) immediately; do not keep minting because “arb will fix it” (A11). Per-tx 1000 / 24h 10k UST1 caps are not peg insurance (A12 / O4).4. FDUSD depeg / bank-run — 2025-04 issuer-insolvency allegation (AC4)
Primary trigger was reputational / legal adjacency, not a published FDUSD reserve hole.
1 day (secondary). Issuer/third-party claimed redemptions continued ($25.8M cited in secondary writeups — treat as unverified here pending issuer primary).Issuer transparency (primary portal; Cloudflare blocked this agent fetch): https://www.firstdigitallabs.com/transparency — monthly attestations (Prescient Assurance). Treat attestations as point-in-time, not continuous audits. Bluechip (via CoinDesk) C grade: reserves “reasonably sound” but bankruptcy-remoteness / parent-debt concern.
Other FDUSD prints (not 2025-04 class):
CL8Y: FDUSD CEX feed (
OracleTicker::Vfdusd) is advisory (X4/X5, P550-9). A 13-cent print while the window still mints is an inventory/solvency event. Pause; do not hardcode$1.5. Venus incidents (AC5)
$76→$144→crash; borrow BTC/ETH against inflated XVS; liquidations >$200M; bad debt **$95–100M** (2k BTC + ~5.7k ETH)230M LUNA deposited; **$13.5M** borrowed; shortfall ~$11.2–14.2M; PauseGuardian ~15:15 UTC; 48h pausevTHEinflateexchangeRateviagetCashPrior()=balanceOf; supply cap only onmint; 3.81× XR; 53.2M THE vs 14.5M cap; ~$14.9M borrowedBridged-CW20 caveat (A6): Classic vFDUSD is a static bridged CW20. It does not automatically inherit BSC
exchangeRaterebases. Treasury redeem capacity is Venus liquidity + bridge honesty + FDUSD issuer, not a live XR oracle. Do not assume 1 bridged vFDUSD = 1 live BSC redeemable FDUSD without evidence.6. Noble / M0 / USDN / CCTP / IBC (AC6)
$M$Mvia Wormhole NTT (and Hyperlane “Portal Lite”)ReceiveMessagehistorically did not bindmessage.Senderthe way EVM TokenMessenger does — ** theoretically** fake burn → mint. Writeup says they did not confirm a live exploitibc_receive(SEC-D02). Arrival would be new wrap program, not a tokenlist rowHow USDC would reach Classic (architecture only — not a deploy plan): Circle USDC → CCTP v1 → Noble native USDC → IBC → some CosmWasm wrap → new CW20. USDN adds Ethereum
$M+ Wormhole Portal before Noble. Contrast: current path is BSC Venus vFDUSD → existing bridge → listed CW20. Do not add IBC callbacks to DEX wasm in any follow-up (SEC-D02, A8).7. CL8Y invariants (AC7)
set_paused. Window pause = local maintenance. Fail-closed.effective_swap≠ USDC ≠ USDN index. No$1. Nousdcticker alias tovfdusd.docs/runbooks/cw20-whitelist-policy.md: USDN cannot be a factory pair or limit-escrow asset. Window-only would still need a non-rebasing wrapper. Bridged vFDUSD is already static CW20 (allowed as a template class, not a risk blessing).Pause mapping (P10 / A1–A3, A11):
8. Scorecard + decision (AC8)
Decision: Stay on vFDUSD. Reject Noble USDC/USDN as UST1 collateral.
Not because “FDUSD is safer than USDC.” Circle’s issuer/attestation/regulatory stack is stronger on paper. The reject is because (1) the live product already settles vFDUSD, (2) USDN is rebase-incompatible and tiny, (3) USDC arrival is a new bridge program, (4) title yield advantage of Venus is false today, and (5) dual inventory without a new window is a fail.
Residual risks of staying: FDUSD trustee-reputation shocks; Venus Core donation/oracle class (vFDUSD not historically hit, architecture shared); thin FDUSD DEX depth; bridged CW20 / Venus redeem desync; no
$1in indexer.If a future ADR ever accepts a switch: spawn separate issues (window, oracle, treasury, indexer tickers, AMM, Coolify, pause runbooks). Do not sneak them into a research MR.
9. Attack-vector evaluation (no PoCs)
Both stacks inherit issuer run + primary halt + stale-window mint. Venus adds utilization lock + donation/XR + oracle stall. Noble/USDN adds CCTP/IBC/Wormhole + rebase accounting + M0/TTG keys. Circle adds address freeze that a Classic wrap would inherit. FDUSD/vToken freezes take other legal/custodial forms — do not treat either as “uncensorable.” Retail APR copy on
/ust1is A14 / NFA.10. Search log (P7 / “none found”)
Queries used 2026-08-21 (web + official docs; no browser RPC to BSC/Noble from the dApp):
USDC depeg March 2023 Silicon Valley Bank Circle·Circle official blog Silicon Valley Bank·FDIC Treasury Federal Reserve joint statement March 12 2023·FDUSD depeg April 2025 First Digital insolvency·CoinDesk Techteryx First Digital Trust lawsuit TUSD $456 million·FDUSD other depeg events besides April 2025·Venus Protocol FDUSD supply APY Core Pool·Venus Protocol XVS 2021·Venus Protocol LUNA 2022·Venus wUSDM donation ERC-4626·Venus THE donation 2026·Noble Dollar USDN M0 yield·M0 dashboard current yield·M0 protocol official audits·Noble USDC CCTP IBC·Circle CCTP Noble mint bug·Usual USD0 depeg M0·Circle USDC blacklist freeze·US 3-month Treasury bill yield August 2026USDN-specific pause/hack/depeg: no primary incident found in this window (Usual is a different M0 extension).
11. This comment vs issue “done”
This note is the GitLab citation dump (verification item 4). It does not close AC1–AC11. Still required for done: ADR
docs/adr/0004-ust1-collateral-usdc-noble-vs-vfdusd.md,scripts/qa/verify-issue-574.sh, docs-only MR,docs/README.mdlink, NFA language, noVITE_USDC/ indexerusdcticker.Closing, additional work not needed at this time