Explorar el Código

fix(asset): 释放总量使用后端 releasedTotal,以 iBit 展示

资产页锁仓 Tab 从 wallet-new 与 staking/wallet 读取已释放合计,不再误用冻结锁仓额或 USDT 折算。

Co-authored-by: Cursor <cursoragent@cursor.com>
jean hace 1 mes
padre
commit
1002513812

+ 2 - 0
code/src/api/staking.ts

@@ -47,6 +47,8 @@ export interface StakingWalletBalance {
   lockedBalance: string | number
   availableBalanceUsdt?: string | number
   lockedBalanceUsdt?: string | number
+  /** 历史累计已释放总量(与 coinUnit 同单位,如 iBit) */
+  releasedTotal?: string | number
 }
 
 /** 查询质押钱包指定币种可用/锁定余额(staking_wallet 表) */

+ 12 - 0
code/src/utils/stakingWallet.ts

@@ -8,6 +8,8 @@ export const STAKING_COIN_UNIT = 'IBIT'
 export interface StakingAccountSnapshot {
   available: string
   locked: string
+  /** 已释放总量(iBit 等原币,勿与 locked/frozenBalance 混淆) */
+  released: string
   availableUsdt: string
   lockedUsdt: string
 }
@@ -37,6 +39,7 @@ export function parseStakingFromWalletGet(raw: unknown): StakingAccountSnapshot
   const empty: StakingAccountSnapshot = {
     available: '0',
     locked: '0',
+    released: '0',
     availableUsdt: '0',
     lockedUsdt: '0',
   }
@@ -51,6 +54,7 @@ export function parseStakingFromWalletGet(raw: unknown): StakingAccountSnapshot
   return {
     available: String(row.balance ?? '0'),
     locked: String(row.frozenBalance ?? extra.frozen_balance ?? '0'),
+    released: String(extra.releasedTotal ?? extra.released_total ?? '0'),
     availableUsdt: String(row.balanceUsdt ?? extra.balance_usdt ?? '0'),
     lockedUsdt: String(row.frozenBalanceUsdt ?? extra.frozen_balance_usdt ?? '0'),
   }
@@ -71,6 +75,7 @@ function parseStakingWalletRow(raw: unknown): StakingAccountSnapshot {
   const empty: StakingAccountSnapshot = {
     available: '0',
     locked: '0',
+    released: '0',
     availableUsdt: '0',
     lockedUsdt: '0',
   }
@@ -79,6 +84,7 @@ function parseStakingWalletRow(raw: unknown): StakingAccountSnapshot {
   const row = (r.data && typeof r.data === 'object' ? r.data : r) as Record<string, unknown>
   const available = row.availableBalance ?? row.available_balance ?? row.balance
   const locked = row.lockedBalance ?? row.locked_balance ?? row.frozenBalance
+  const released = row.releasedTotal ?? row.released_total
   const availableUsdt =
     row.availableBalanceUsdt ?? row.available_balance_usdt ?? row.balanceUsdt ?? row.balance_usdt
   const lockedUsdt =
@@ -86,6 +92,7 @@ function parseStakingWalletRow(raw: unknown): StakingAccountSnapshot {
   return {
     available: String(available ?? '0'),
     locked: String(locked ?? '0'),
+    released: String(released ?? '0'),
     availableUsdt: String(availableUsdt ?? '0'),
     lockedUsdt: String(lockedUsdt ?? '0'),
   }
@@ -99,6 +106,7 @@ export function applyStakingOverviewBalances(
   const overview: StakingAccountSnapshot = {
     available: walletSnap.available,
     locked: walletSnap.locked,
+    released: walletSnap.released,
     availableUsdt: walletSnap.availableUsdt,
     lockedUsdt: walletSnap.lockedUsdt,
   }
@@ -113,6 +121,9 @@ export function applyStakingOverviewBalances(
       overview.locked = apiSnap.locked
       overview.lockedUsdt = apiSnap.lockedUsdt
     }
+    if (Number(overview.released) === 0 && Number(apiSnap.released) > 0) {
+      overview.released = apiSnap.released
+    }
   }
   return { overview, transferAvailable }
 }
@@ -126,6 +137,7 @@ export async function loadStakingWalletSnapshot(coinUnit: string = STAKING_COIN_
     return {
       available: '0',
       locked: '0',
+      released: '0',
       availableUsdt: '0',
       lockedUsdt: '0',
     }

+ 4 - 1
code/src/views/assets/AssetsView.vue

@@ -131,6 +131,8 @@ const followCloseBusyId = ref<string | null>(null)
 /** 总览 iBit / 锁仓:wallet-new 质押账户 balance、frozenBalance */
 const stakingOverviewAvailable = ref('0')
 const stakingOverviewLocked = ref('0')
+/** 已释放总量(后端 releasedTotal,勿用 frozenBalance) */
+const stakingOverviewReleased = ref('0')
 const stakingOrders = ref<StakingOrderItem[]>([])
 const stakingOrdersLoading = ref(false)
 const STAKING_ORDER_PREVIEW_SIZE = 5
@@ -515,6 +517,7 @@ async function loadAssets(opts?: { silent?: boolean }) {
     const merged = applyStakingOverviewBalances(walletStaking, apiStaking)
     stakingOverviewAvailable.value = merged.overview.available
     stakingOverviewLocked.value = merged.overview.locked
+    stakingOverviewReleased.value = merged.overview.released
     await Promise.all([
       loadSpotAssetList({ silent: true }),
       loadFundAssetList({ silent: true }),
@@ -1203,7 +1206,7 @@ function shortDate(value?: string) {
           <div class="staking-hero dark-card">
             <p class="label-sm">{{ t('assets.releaseTotal') }}</p>
             <div class="staking-main-balance">
-              <span class="staking-main-num">{{ obscure ? '****' : fmt(stakingOverviewLocked) }}</span>
+              <span class="staking-main-num">{{ obscure ? '****' : fmt(stakingOverviewReleased) }}</span>
               <span class="unit">{{ t('assets.ibitUnit') }}</span>
             </div>
             <div class="staking-total-row">