research: UST1 collateral — Noble USDC ~3.5% yield vs Venus vFDUSD 6–8% APR (depeg, bank-run, protocol incidents) #575
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#575
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
Duplicate of #574