feat(frontend): track treasury vFDUSD and USD price via session-once RPC #10

Closed
opened 2026-08-15 09:33:05 +00:00 by PlasticDigits · 10 comments
PlasticDigits commented 2026-08-15 09:33:05 +00:00 (Migrated from gitlab.com)

Summary

Show vFDUSD as a live treasury asset on the Treasury page, with a USD valuation from on-chain RPC/LCD — rate-limited and fetched at most once per browser session. Do not put vFDUSD through the existing Binance/DEX 60s poll loop.

Companion context: treasury already custodies bridged vFDUSD for ust1-window redeem (#6, #7). Mainnet token: terra1mnl9azefrqpmu888ar2u6zrcwr80hxlt3avf4300r576cw5ar7esvxsvj3 (6 decimals). On-chain Venus-normalized rate lives on ust1-oracle terra1fmht0t6svq3n24zx03nkfja0m40zhfyyxkdcvlrkl6u7gfe6aagq4gch8n (R / 1e18 = FDUSD per 1 vFDUSD). Related CR work: follow-up issue for UST1 circulating + key ratios.


Current codebase

Component Path Behavior today
Token metadata SSoT frontend/public/assets/tokenlist.json Native USTC/LUNC + CW20 USTR, ALPHA, USTRIX, SpaceUSD. No vFDUSD.
Treasury balances frontend/src/hooks/useTreasury.ts Iterates tokenlist.json; skips USTR; native via bank, CW20 via getTokenBalance(token, treasury). vFDUSD never queried.
Asset UI frontend/src/components/treasury/TreasuryAssetsCard.tsx Shows non-zero balances; USD via usePrices(); hides sub-$1 dust when a price exists; USTC excluded from rank badges.
Base USD prices frontend/src/services/price.ts + usePrices.ts LUNC/USTC from Binance → data-api → CoinGecko, refetch every 60s. Other CW20s via DEX simulate on LCD, keyed off base-price updates.
LCD hygiene frontend/src/services/contract.ts, LCD_CONFIG Rate limit 500ms, cache 10s, stale 60s, endpoint cooldown 30s. PriceService LCD path has fallbacks but no min-interval / session cache.
Price cache knobs frontend/src/utils/constants.ts → PRICE_CACHE basePrices: 60s, dexRates: 120s, staleTime: 30s. No session-once primitive.
Contract registry CONTRACTS in constants.ts ustrToken, treasury, ustcSwap, referral only. No vfdusd / ust1Oracle.
Token icons TokenIcon → /assets/tokens/{SYMBOL}.png Only LUNC.png is present; unknown symbols fall back to first letter.
Docs gap docs/DEPLOYMENT.md Checkbox still open: “Frontend updated with contract addresses (Phase 4 — wrap mapper / cLUNC / cUSTC)”. vFDUSD address is documented for contracts, not wired in the UI.

Why DEX pricing cannot be reused: vFDUSD is inventory for the window, not a Terra AMM pair. Adding it to the CW20 DEX loop would burn LCD quota and return null.


Why this is needed

  1. Treasury already holds bridged vFDUSD (window deposits Transfer it in). The public Treasury page omits the largest USD-stable collateral sleeve.
  2. Users cannot verify backing without a USD figure. Hardcoding $1 is wrong: Venus vFDUSD accrues (~1.22 FDUSD per vFDUSD at the 2026-08-08 seed).
  3. Public LCD/RPC nodes are fragile. A 60s poll (or BSC eth_call from every tab) will get the site rate-limited and can look like abuse.
  4. FDUSD/vFDUSD is slow-moving vs LUNC. One successful on-chain read per browser session is enough for a reserve display.

Without this, the asset grid and any later CR math understate collateral.


Constraints / guardrails

  • Do not call BSC RPC / Venus exchangeRateStored from the browser (CORS, keyless public RPC, easy to hammer).
  • Do not add vFDUSD to the Binance or DEX simulate poll loops.
  • Do not refetch vFDUSD USD on useTreasury’s 30s interval, window focus, or usePrices 60s tick.
  • At most one network attempt per tab session after a success (or after a recorded hard failure — see test plan). Use sessionStorage (or an equivalent session-scoped module cache). Reload / new tab may fetch again.
  • Reuse LCD_CONFIG rate limiting + endpoint fallbacks for the oracle query. Deduplicate in-flight requests.
  • Treat FDUSD as $1.00 USD for vFDUSD_USD = (R / 1e18) * 1. Do not add a second CEX poll “just for FDUSD” unless product later asks; if added it must also be session-once.
  • Reject non-finite, <= 0, or absurd R (e.g. R/1e18 outside a documented sanity band such as 0.5 … 10). On reject: show balance without a USD line; do not silently assume $1 per vFDUSD.
  • Oracle paused=true or missing R: same as price unavailable — no fake USD.
  • vFDUSD is real collateral. Include it in USD sort/rank (unlike USTC’s rank exclusion). Still apply the existing sub-$1 dust hide when a valid price exists.
  • Do not add cLUNC/cUSTC as treasury holdings here (wrappers of native already shown). Supply cards are a separate issue.
  • No secrets, no new backend, no indexer.

Relevant files

File Role
frontend/public/assets/tokenlist.json Add vFDUSD CW20 metadata (address, 6 decimals, no pool)
frontend/src/utils/constants.ts CONTRACTS.mainnet.vfdusd, ust1Oracle; session-cache / price knobs
frontend/src/hooks/useTreasury.ts Will pick up vFDUSD automatically once listed (confirm skip rules)
frontend/src/hooks/usePrices.ts Session-once oracle price; skip vFDUSD in DEX CW20 loop
frontend/src/services/price.ts LCD query helper for oracle state (or dedicated small service)
frontend/src/components/treasury/TreasuryAssetsCard.tsx USD line + ranking
frontend/src/types/price.ts Optional source: 'oracle'
frontend/public/assets/tokens/VFDUSD.png Icon (TokenIcon uppercases symbol)
docs/DEPLOYMENT.md / README.md Record frontend address wiring

Mainnet pins (do not invent new addresses):

Name Address
vFDUSD terra1mnl9azefrqpmu888ar2u6zrcwr80hxlt3avf4300r576cw5ar7esvxsvj3
ust1-oracle terra1fmht0t6svq3n24zx03nkfja0m40zhfyyxkdcvlrkl6u7gfe6aagq4gch8n
Treasury terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2

  1. Add vFDUSD to tokenlist.json (type: cw20, decimals: 6, no pool). Add CONTRACTS.*.vfdusd + ust1Oracle.
  2. In usePrices / priceService: if sessionStorage has a validated vFDUSD USD, return it. Else one LCD {"state":{}} (or equivalent documented query) on ust1Oracle, compute usd = R / 1e18, persist to session, never schedule a refetch.
  3. Explicitly exclude symbol === 'vFDUSD' from the tokenlist DEX for loop so a missing pool cannot trigger Garuda/Terraswap fallbacks.
  4. Treasury card: existing getUsdValue('vFDUSD') path; add VFDUSD.png.
  5. Keep balance polling as today (30s). Only the price is session-once.

Acceptance criteria

  • Treasury Assets lists vFDUSD when treasury CW20 balance > 0 (and >= $1 when a valid USD price exists).
  • USD line uses oracle R / 1e18 (FDUSD-per-vFDUSD × $1), not $1 per token and not a DEX quote.
  • DevTools: ≤ 1 oracle LCD/RPC call per browser tab session on success; treasury refetch / price tick / tab focus do not add more.
  • Concurrent mounts (Strict Mode / two cards) share one in-flight request.
  • LCD 429 / timeout / unhealthy endpoints: cooldown + fallbacks; no retry storm; no USD (or last session value if already cached).
  • paused oracle or invalid R: balance shown, USD hidden.
  • vFDUSD is not included in the DEX token-price loop.
  • Addresses match the table above; finder “View Contract” still points at the treasury.
  • Icon or letter fallback; no layout break.

Test plan (all paths)

Display / data

  • Treasury vFDUSD > 0 → row + formatted amount (6 decimals).
  • Balance 0 → hidden.
  • Valid price, USD >= 1 → USD line; sorts with other priced assets; eligible for rank badge.
  • Valid price, USD < 1 → hidden (existing dust rule).
  • Price unavailable, balance > 0 → row without USD (existing px <= 0 rule).
  • Loading / empty / error banners unchanged for other assets.

Session-once + rate limit

  • First visit: exactly one oracle query; sessionStorage written.
  • Navigate away and back in the same tab: zero new oracle queries; USD still shown.
  • useTreasury 30s refetch: balance may update; no new oracle query.
  • Hard reload: one new query allowed.
  • Two overlapping first-load calls: one network request.
  • LCD_CONFIG.minRequestInterval respected if any other LCD traffic is in flight.

Oracle / LCD failure

  • Primary LCD down → fallback endpoint; success still session-cached.
  • All LCD fail, no cache → no USD, no throw that blanks the whole asset grid.
  • All LCD fail, session cache present → use cache.
  • HTTP 429 → cooldown, no tight retry loop.
  • Malformed JSON / missing R / R=0 / R huge → treat as unavailable.
  • Oracle paused=true → no USD.

Regression

  • LUNC/USTC still use CEX poll; ALPHA/USTRIX/SpaceUSD still use DEX path.
  • USTR still skipped as a treasury holding.

Test plan (attack, hack, abuse)

Vector Risk Test / guard
Public RPC hammer Many tabs / refetch loops look like a botnet against LCD Confirm no interval, no refetchOnWindowFocus, no DEX fallbacks for vFDUSD; 10× refresh of SPA client routes without full reload does not multiply oracle calls
BSC RPC from browser CORS + abuse of bsc-dataseed / leaked operator URLs Code review: zero BSC URLs in frontend bundle
sessionStorage tampering Attacker sets vFDUSD=100000 → huge USD / CR Parse + sanity-band on read; discard non-finite / out-of-band; never trust cache without schema/version
XSS → sessionStorage Injected script poisons price Existing CSP/React escaping; cache key namespaced; still validate on read
Stale session through depeg / Venus event Hours-old R after oracle pause or incident If oracle paused is observed on a later balance path, do not keep showing USD from cache as “live”; acceptable: hide USD or label session-cached. Do not pretend 60s freshness
Oracle / LCD MITM or malicious node Fake R inflates reserves Fallback list; reject out-of-band R; never use query string / user input as oracle address
Tokenlist / address substitution Wrong CW20 shown as vFDUSD Pin mainnet address in constants + tokenlist; reject empty/non-terra1 address
$1 fallback on failure Failed query silently values inventory at 1:1, overstating CR Failure path must omit USD, not assume 1.0 per vFDUSD
DEX pool injection Future pool on vFDUSD triggers simulate spam / wrong quote Explicit skip by symbol and address even if someone adds pool
Dust / rank games Tiny transfer to force a row or steal gold badge Dust rule still applies when priced; rank uses USD not raw units

Verification criteria

  1. Mainnet Treasury page: vFDUSD row matches cw20 balance of treasury on finder for terra1mnl9…svj3.
  2. USD ≈ treasury_vfdusd * (oracle R / 1e18) (FDUSD ≈ $1), within rounding.
  3. Network panel: one oracle smart-query per session; no BSC; no vFDUSD DEX simulates.
  4. After session cache: SPA navigation + 30s treasury poll add no oracle calls.
  5. Forced LCD failure: grid remains; vFDUSD amount still correct if balance query works; USD absent or cached — never a fabricated $1/vFDUSD.
  6. tokenlist + CONTRACTS addresses match docs/DEPLOYMENT.md / ust1-window registry.
## Summary Show **vFDUSD** as a live treasury asset on the Treasury page, with a **USD valuation from on-chain RPC/LCD** — **rate-limited** and fetched **at most once per browser session**. Do not put vFDUSD through the existing Binance/DEX 60s poll loop. Companion context: treasury already custodies bridged vFDUSD for `ust1-window` redeem ([#6](https://gitlab.com/PlasticDigits2/ustr-cmm/-/issues/6), [#7](https://gitlab.com/PlasticDigits2/ustr-cmm/-/issues/7)). Mainnet token: `terra1mnl9azefrqpmu888ar2u6zrcwr80hxlt3avf4300r576cw5ar7esvxsvj3` (6 decimals). On-chain Venus-normalized rate lives on `ust1-oracle` `terra1fmht0t6svq3n24zx03nkfja0m40zhfyyxkdcvlrkl6u7gfe6aagq4gch8n` (`R / 1e18` = FDUSD per 1 vFDUSD). Related CR work: follow-up issue for UST1 circulating + key ratios. --- ## Current codebase | Component | Path | Behavior today | |-----------|------|----------------| | Token metadata SSoT | `frontend/public/assets/tokenlist.json` | Native USTC/LUNC + CW20 USTR, ALPHA, USTRIX, SpaceUSD. **No vFDUSD.** | | Treasury balances | `frontend/src/hooks/useTreasury.ts` | Iterates `tokenlist.json`; skips USTR; native via bank, CW20 via `getTokenBalance(token, treasury)`. vFDUSD never queried. | | Asset UI | `frontend/src/components/treasury/TreasuryAssetsCard.tsx` | Shows non-zero balances; USD via `usePrices()`; hides sub-$1 dust when a price exists; USTC excluded from rank badges. | | Base USD prices | `frontend/src/services/price.ts` + `usePrices.ts` | LUNC/USTC from Binance → data-api → CoinGecko, **refetch every 60s**. Other CW20s via DEX `simulate` on LCD, keyed off base-price updates. | | LCD hygiene | `frontend/src/services/contract.ts`, `LCD_CONFIG` | Rate limit 500ms, cache 10s, stale 60s, endpoint cooldown 30s. **PriceService LCD path has fallbacks but no min-interval / session cache.** | | Price cache knobs | `frontend/src/utils/constants.ts` → `PRICE_CACHE` | `basePrices: 60s`, `dexRates: 120s`, `staleTime: 30s`. No session-once primitive. | | Contract registry | `CONTRACTS` in `constants.ts` | `ustrToken`, `treasury`, `ustcSwap`, `referral` only. No `vfdusd` / `ust1Oracle`. | | Token icons | `TokenIcon` → `/assets/tokens/{SYMBOL}.png` | Only `LUNC.png` is present; unknown symbols fall back to first letter. | | Docs gap | `docs/DEPLOYMENT.md` | Checkbox still open: “Frontend updated with contract addresses (Phase 4 — wrap mapper / cLUNC / cUSTC)”. vFDUSD address is documented for contracts, not wired in the UI. | **Why DEX pricing cannot be reused:** vFDUSD is inventory for the window, not a Terra AMM pair. Adding it to the CW20 DEX loop would burn LCD quota and return `null`. --- ## Why this is needed 1. Treasury **already holds** bridged vFDUSD (window deposits `Transfer` it in). The public Treasury page omits the largest USD-stable collateral sleeve. 2. Users cannot verify backing without a USD figure. Hardcoding `$1` is wrong: Venus vFDUSD accrues (~1.22 FDUSD per vFDUSD at the 2026-08-08 seed). 3. Public LCD/RPC nodes are fragile. A 60s poll (or BSC `eth_call` from every tab) will get the site rate-limited and can look like abuse. 4. FDUSD/vFDUSD is slow-moving vs LUNC. **One successful on-chain read per browser session** is enough for a reserve display. Without this, the asset grid and any later CR math understate collateral. --- ## Constraints / guardrails - **Do not** call BSC RPC / Venus `exchangeRateStored` from the browser (CORS, keyless public RPC, easy to hammer). - **Do not** add vFDUSD to the Binance or DEX `simulate` poll loops. - **Do not** refetch vFDUSD USD on `useTreasury`’s 30s interval, window focus, or `usePrices` 60s tick. - **At most one network attempt per tab session** after a success (or after a recorded hard failure — see test plan). Use `sessionStorage` (or an equivalent session-scoped module cache). Reload / new tab may fetch again. - Reuse `LCD_CONFIG` rate limiting + endpoint fallbacks for the oracle query. Deduplicate in-flight requests. - Treat FDUSD as **$1.00 USD** for `vFDUSD_USD = (R / 1e18) * 1`. Do not add a second CEX poll “just for FDUSD” unless product later asks; if added it must also be session-once. - Reject non-finite, `<= 0`, or absurd `R` (e.g. `R/1e18` outside a documented sanity band such as `0.5 … 10`). On reject: show balance **without** a USD line; do **not** silently assume `$1` per vFDUSD. - Oracle `paused=true` or missing `R`: same as price unavailable — no fake USD. - vFDUSD is **real collateral**. Include it in USD sort/rank (unlike USTC’s rank exclusion). Still apply the existing sub-$1 dust hide when a valid price exists. - Do not add cLUNC/cUSTC as treasury *holdings* here (wrappers of native already shown). Supply cards are a separate issue. - No secrets, no new backend, no indexer. --- ## Relevant files | File | Role | |------|------| | `frontend/public/assets/tokenlist.json` | Add vFDUSD CW20 metadata (address, 6 decimals, no `pool`) | | `frontend/src/utils/constants.ts` | `CONTRACTS.mainnet.vfdusd`, `ust1Oracle`; session-cache / price knobs | | `frontend/src/hooks/useTreasury.ts` | Will pick up vFDUSD automatically once listed (confirm skip rules) | | `frontend/src/hooks/usePrices.ts` | Session-once oracle price; **skip** vFDUSD in DEX CW20 loop | | `frontend/src/services/price.ts` | LCD query helper for oracle `state` (or dedicated small service) | | `frontend/src/components/treasury/TreasuryAssetsCard.tsx` | USD line + ranking | | `frontend/src/types/price.ts` | Optional `source: 'oracle'` | | `frontend/public/assets/tokens/VFDUSD.png` | Icon (`TokenIcon` uppercases symbol) | | `docs/DEPLOYMENT.md` / `README.md` | Record frontend address wiring | Mainnet pins (do not invent new addresses): | Name | Address | |------|---------| | vFDUSD | `terra1mnl9azefrqpmu888ar2u6zrcwr80hxlt3avf4300r576cw5ar7esvxsvj3` | | ust1-oracle | `terra1fmht0t6svq3n24zx03nkfja0m40zhfyyxkdcvlrkl6u7gfe6aagq4gch8n` | | Treasury | `terra16j5u6ey7a84g40sr3gd94nzg5w5fm45046k9s2347qhfpwm5fr6sem3lr2` | --- ## Recommended direction 1. Add vFDUSD to `tokenlist.json` (`type: cw20`, `decimals: 6`, **no** `pool`). Add `CONTRACTS.*.vfdusd` + `ust1Oracle`. 2. In `usePrices` / `priceService`: if `sessionStorage` has a validated `vFDUSD` USD, return it. Else **one** LCD `{"state":{}}` (or equivalent documented query) on `ust1Oracle`, compute `usd = R / 1e18`, persist to session, never schedule a refetch. 3. Explicitly exclude `symbol === 'vFDUSD'` from the tokenlist DEX `for` loop so a missing pool cannot trigger Garuda/Terraswap fallbacks. 4. Treasury card: existing `getUsdValue('vFDUSD')` path; add `VFDUSD.png`. 5. Keep balance polling as today (30s). Only the **price** is session-once. --- ## Acceptance criteria - [ ] Treasury Assets lists vFDUSD when treasury CW20 balance `> 0` (and `>= $1` when a valid USD price exists). - [ ] USD line uses `oracle R / 1e18` (FDUSD-per-vFDUSD × $1), not `$1` per token and not a DEX quote. - [ ] DevTools: **≤ 1** oracle LCD/RPC call per browser tab session on success; treasury refetch / price tick / tab focus do not add more. - [ ] Concurrent mounts (Strict Mode / two cards) share one in-flight request. - [ ] LCD 429 / timeout / unhealthy endpoints: cooldown + fallbacks; no retry storm; no USD (or last session value if already cached). - [ ] `paused` oracle or invalid `R`: balance shown, USD hidden. - [ ] vFDUSD is **not** included in the DEX token-price loop. - [ ] Addresses match the table above; finder “View Contract” still points at the treasury. - [ ] Icon or letter fallback; no layout break. --- ## Test plan (all paths) **Display / data** - [ ] Treasury vFDUSD `> 0` → row + formatted amount (6 decimals). - [ ] Balance `0` → hidden. - [ ] Valid price, USD `>= 1` → USD line; sorts with other priced assets; eligible for rank badge. - [ ] Valid price, USD `< 1` → hidden (existing dust rule). - [ ] Price unavailable, balance `> 0` → row **without** USD (existing `px <= 0` rule). - [ ] Loading / empty / error banners unchanged for other assets. **Session-once + rate limit** - [ ] First visit: exactly one oracle query; `sessionStorage` written. - [ ] Navigate away and back in the same tab: **zero** new oracle queries; USD still shown. - [ ] `useTreasury` 30s refetch: balance may update; **no** new oracle query. - [ ] Hard reload: one new query allowed. - [ ] Two overlapping first-load calls: one network request. - [ ] `LCD_CONFIG.minRequestInterval` respected if any other LCD traffic is in flight. **Oracle / LCD failure** - [ ] Primary LCD down → fallback endpoint; success still session-cached. - [ ] All LCD fail, no cache → no USD, no throw that blanks the whole asset grid. - [ ] All LCD fail, session cache present → use cache. - [ ] HTTP 429 → cooldown, no tight retry loop. - [ ] Malformed JSON / missing `R` / `R=0` / `R` huge → treat as unavailable. - [ ] Oracle `paused=true` → no USD. **Regression** - [ ] LUNC/USTC still use CEX poll; ALPHA/USTRIX/SpaceUSD still use DEX path. - [ ] USTR still skipped as a treasury *holding*. --- ## Test plan (attack, hack, abuse) | Vector | Risk | Test / guard | |--------|------|----------------| | **Public RPC hammer** | Many tabs / refetch loops look like a botnet against LCD | Confirm no interval, no `refetchOnWindowFocus`, no DEX fallbacks for vFDUSD; 10× refresh of SPA client routes without full reload does not multiply oracle calls | | **BSC RPC from browser** | CORS + abuse of `bsc-dataseed` / leaked operator URLs | Code review: zero BSC URLs in frontend bundle | | **sessionStorage tampering** | Attacker sets `vFDUSD=100000` → huge USD / CR | Parse + sanity-band on read; discard non-finite / out-of-band; never trust cache without schema/version | | **XSS → sessionStorage** | Injected script poisons price | Existing CSP/React escaping; cache key namespaced; still validate on read | | **Stale session through depeg / Venus event** | Hours-old `R` after oracle pause or incident | If oracle `paused` is observed on a later *balance* path, do not keep showing USD from cache as “live”; acceptable: hide USD or label session-cached. Do not pretend 60s freshness | | **Oracle / LCD MITM or malicious node** | Fake `R` inflates reserves | Fallback list; reject out-of-band `R`; never use query string / user input as oracle address | | **Tokenlist / address substitution** | Wrong CW20 shown as vFDUSD | Pin mainnet address in constants + tokenlist; reject empty/non-`terra1` address | | **`$1` fallback on failure** | Failed query silently values inventory at 1:1, overstating CR | Failure path must **omit** USD, not assume 1.0 per vFDUSD | | **DEX pool injection** | Future `pool` on vFDUSD triggers simulate spam / wrong quote | Explicit skip by symbol **and** address even if someone adds `pool` | | **Dust / rank games** | Tiny transfer to force a row or steal gold badge | Dust rule still applies when priced; rank uses USD not raw units | --- ## Verification criteria 1. Mainnet Treasury page: vFDUSD row matches `cw20 balance` of treasury on finder for `terra1mnl9…svj3`. 2. USD ≈ `treasury_vfdusd * (oracle R / 1e18)` (FDUSD ≈ $1), within rounding. 3. Network panel: one oracle smart-query per session; no BSC; no vFDUSD DEX simulates. 4. After session cache: SPA navigation + 30s treasury poll add **no** oracle calls. 5. Forced LCD failure: grid remains; vFDUSD amount still correct if balance query works; USD absent or cached — never a fabricated `$1/vFDUSD`. 6. `tokenlist` + `CONTRACTS` addresses match `docs/DEPLOYMENT.md` / ust1-window registry.
PlasticDigits commented 2026-08-15 09:34:25 +00:00 (Migrated from gitlab.com)

mentioned in issue #11

mentioned in issue #11
PlasticDigits commented 2026-08-15 09:34:30 +00:00 (Migrated from gitlab.com)

Related liability/CR work: #11 (UST1 mint/burn/circ, cLUNC/cUSTC supply, collateralization from UST1 circulating). CR numerator should include vFDUSD USD from this issue once it ships.

Related liability/CR work: #11 (UST1 mint/burn/circ, cLUNC/cUSTC supply, collateralization from UST1 circulating). CR numerator should include vFDUSD USD from this issue once it ships.
PlasticDigits commented 2026-08-15 09:49:55 +00:00 (Migrated from gitlab.com)

mentioned in commit 737f560578

mentioned in commit 737f5605783feb36f3e1acd6d8d5e5a57a689ad6
PlasticDigits commented 2026-08-15 09:49:58 +00:00 (Migrated from gitlab.com)

mentioned in merge request !32

mentioned in merge request !32
PlasticDigits commented 2026-08-15 09:50:04 +00:00 (Migrated from gitlab.com)

Implemented on !32 (feat/treasury-ust1-legal-10-11-12).

Shipped: tokenlist + CONTRACTS pins, session-once ust1-oracle USD (rate / 1e18, also accepts R), DEX skip by symbol and address, in-flight dedupe, sessionStorage schema/sanity-band, no $1/vFDUSD fallback, LCD min-interval + fallbacks. Unit tests in frontend/src/utils/vfdusdOracle.test.ts. Playbook: skills/frontend-vfdusd-oracle/SKILL.md.

Implemented on !32 (`feat/treasury-ust1-legal-10-11-12`). Shipped: tokenlist + `CONTRACTS` pins, session-once ust1-oracle USD (`rate` / 1e18, also accepts `R`), DEX skip by symbol **and** address, in-flight dedupe, sessionStorage schema/sanity-band, no `$1/vFDUSD` fallback, LCD min-interval + fallbacks. Unit tests in `frontend/src/utils/vfdusdOracle.test.ts`. Playbook: `skills/frontend-vfdusd-oracle/SKILL.md`.
PlasticDigits commented 2026-08-15 10:23:19 +00:00 (Migrated from gitlab.com)

mentioned in commit 09a54333aa

mentioned in commit 09a54333aaaaf58423d04efe6a209b08e54d5cd7
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-15 10:23:20 +00:00
PlasticDigits commented 2026-08-15 12:41:07 +00:00 (Migrated from gitlab.com)

mentioned in issue #14

mentioned in issue #14
PlasticDigits commented 2026-08-17 01:06:21 +00:00 (Migrated from gitlab.com)

mentioned in issue #16

mentioned in issue #16
PlasticDigits commented 2026-08-24 06:12:59 +00:00 (Migrated from gitlab.com)

mentioned in issue #19

mentioned in issue #19
PlasticDigits commented 2026-08-24 06:12:59 +00:00 (Migrated from gitlab.com)

marked as related to #19

marked as related to #19
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/ustr-cmm#10
No description provided.