# 資產頁優化(含股票代幣)· 交接規格 · 美編 · style 01 曜黑琉璃 範圍:使用者端 DApp `/portfolio/`(`app-pages/PortfolioPage.tsx`)。頂部「估計總值+走勢圖」照已確認的 `/workspace/eason-system/design/rebuild/fixes/portfolio-chart-spec.md` **不改**(`.phero` 兩欄、168×72/200×80、1D/7D/30D、`ptr-*` 狀態)。 可點原型:https://eason-stock-icons.pages.dev/proto/?s=pf (另有 `pf-stock` `pf-earn` `pf-loading` `pf-empty` `pf-conn`)。數字都是示範資料。 ## 1. 盤點(只讀) | 項目 | 原始碼 | 現況 | |---|---|---| | 持有代幣 | `lib/usePortfolioBalances.tsx` 的 `b()`:`lib/tokens` 固定清單 `nD[chainId]`(主網 BNB、WBNB、USDT、USDC、CAKE、BTCB、ETH;測試網 tBNB、WBNB、USDT、BUSD、CAKE)+自訂代幣 | **股票代幣(NVDAon、TSLAx…)不在清單,不會出現** | | 估值 | 同檔:PancakeSwap V2 Router 報 1 顆換 USDT(`fn`) | 股票代幣多在 V3 或其他池,V2 報價大多失敗 → 估值會是空的 | | 持倉概覽 | 同檔:質押(staking)、可領取獎勵、鎖倉可釋放(vesting、locker)、NFT | **幣股存款沒有算進來** | | 列表 | `PortfolioPage.tsx`:`hrow` 代幣、餘額、USD;零餘額可展開 | 沒有 24 小時漲跌、沒有分類、沒有資產分布 | | 狀態 | 未連接:連接提示+查看其他地址;空:「這個錢包目前沒有資產」;載入:三列骨架;讀取失敗:`readFail` | 有,但沒有股票相關文字 | ## 2. 問題清單 1. 有股票代幣也看不到(不在固定清單、估值用 V2)。幣安「資產」會列出所有持有的現貨,包括股票代幣。 2. 幣股存款(理財本金)不算在資產裡,總值少算。 3. 列表沒有 24 小時漲跌,看不出今天賺賠;沒有分類,代幣一多就亂。 4. 「持倉概覽」四格在測試網全是「—」,占一整屏卻沒資訊。 5. 股票休市時價格不動或亂跳,使用者不知道原因。 ## 3. 新版結構 ``` 我的資產(地址膠囊) ├─ 估計總值+走勢圖(不改) ├─ 資產分布條:加密貨幣 / 股票代幣 / 幣股存款(百分比) ├─ 分段:全部|加密貨幣|股票代幣|幣股存款 └─ 列表(全部時分三組,各組標題右側顯示小計) ├─ 加密貨幣列:幣種圖示、名稱、數量;右:價值、24h 漲跌 ├─ 股票代幣列:真實 Logo+發行商標籤、數量 · 休市/開盤;右:價值、24h 漲跌 → 點了開幣股詳情 └─ 幣股存款列:進度環(期限)、方案、月化 · 剩幾天 · 解鎖日(存入時鎖定的實際月化,例「月化 12% · 剩 49 天 · 12/14 解鎖」);右:本金、收益 EDOT → 點了開「我的持倉」 ``` 原本的「持倉概覽」(質押、獎勵、鎖倉、NFT)保留在列表下方,但只顯示有數值的項目;全部是空的就整塊不顯示。 ## 4. 排版 - 手機左右 20px,電腦內容欄 ≤1040px(走勢區照原規格寬度)。間距 8 的倍數;區塊之間 24。 - 資產分布卡:內距 16/20;條高 8、圓角 4、段間 2px;顏色 加密貨幣 #F5F5F7、股票代幣 #64D2FF、幣股存款 #F7931A;圖例 12.5px,百分比白色 600 等寬字。 - 分段:`.seg.sm`(高 32),四段等寬。 - 列:高 64、圖示 40、右欄靠右、等寬數字;24h 漲跌用文字色(綠/紅,11.5px 600),不用色塊(資產頁以價值為主)。 - 組標題 17/600,右側小計 13 #A1A1A6;股票組小計後加「美股休市」灰字。 - 幣股存款列的進度環:40px、橘色 conic 進度、中間期限數字(活期寫「活期」);已到期加綠標籤「可提領」。 ## 5. 狀態 | 狀態 | 畫面 | |---|---| | 未連接 | 卡片:錢包圖示+「連接錢包查看資產/加密貨幣、股票代幣和幣股存款會一起顯示」+連接錢包;下方「查看其他地址」輸入框(沿用) | | 載入中 | 總值骨架 180×40、走勢骨架 168×72、6 列骨架 | | 空 | 總值 $0.00、走勢「尚無走勢資料」(ptr-empty)、「這個錢包目前沒有資產/可以先兌換 USDT,或到幣股買入股票代幣」+[去兌換][看幣股行情] | | 某分類空 | 例股票代幣:「還沒有股票代幣」+看幣股行情 | | 單檔沒報價 | 價值「—」、漲跌不顯示、總值旁「部分」(沿用 `partial`) | | 查看他人地址 | 沿用「正在查看他人地址(唯讀)」列;幣股存款照樣顯示(唯讀,不能點操作) | | 測試網 | 股票代幣組顯示一行說明「股票代幣只在 BSC 主網」(見問題 2) | ## 6. 要問技術的問題 1. **股票代幣持有怎麼抓?** 建議:主網用 `stocks-56.json` 的 1,931 個地址分批 multicall `balanceOf`(每批約 200 個,約 10 次),只保留有餘額的;或用索引服務(BscScan tokentx 等)先找出持有的合約再讀餘額。哪個可行? 2. 測試網沒有股票代幣:資產頁在測試網要不要跨鏈讀主網餘額,還是只顯示「股票代幣只在 BSC 主網」? 3. **價格**:股票代幣改用 GeckoTerminal 的 simple price(跟行情同一來源),不要用 V2 Router? 4. 24 小時漲跌:加密貨幣用跑馬燈已有的幣安行情(`lib/binanceRest`)?股票用 GeckoTerminal `h24_price_change_percentage`? 5. 幣股存款怎麼算進總值:本金 USDT 全額算?累計收益 EDOT 照 `edotPrice` 算進去嗎?排隊中的 USDT 算嗎? 6. 走勢圖(`portfolioHistory`)要包含股票代幣和幣股存款嗎?歷史價格從哪裡來? 7. 休市/開盤狀態跟幣股行情共用同一個來源(見 coinstock-redesign-spec.md 問題 3)。 8. **利率(月化)**:已定案。幣股存款列顯示存入時鎖定的實際月化(不是前台區間),收益 = 本金 × 實際月化 ÷ 30 × 天數;上限月化 20%(合約 `MAX_RATE_BPS = 2000`、`PERIOD = 30 days`,後台也擋)。示範:90 天 1,600.00、30 天 32.00、活期 48.00,合計待領 1,680.00 EDOT。細節見 coinstock-redesign-spec.md §11。 9. **提前解鎖**:暫定不開放。資產頁的幣股存款列,未到期定期只顯示倒數和「到期後可提領」,沒有提前解鎖入口。合約開關保留、預設關閉;之後要開需要先補設計。見 coinstock-redesign-spec.md §12。