fix: Extract duplicated \formatTokenAmount\ to helper.ts (#209)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
openhands 2026-02-24 19:18:45 +00:00
parent ad781e2a23
commit f3f428f514
3 changed files with 21 additions and 31 deletions

View file

@ -2,6 +2,7 @@ import { ref, computed, onMounted, onUnmounted, type Ref } from 'vue';
import axios from 'axios';
import { DEFAULT_CHAIN_ID } from '@/config';
import { resolveGraphqlEndpoint, formatGraphqlError } from '@/utils/graphqlRetry';
import { parseTokenAmount } from '@/utils/helper';
import logger from '@/utils/logger';
const GRAPHQL_TIMEOUT_MS = 15_000;
@ -39,16 +40,6 @@ export interface ActivePositionShort {
kraikenDeposit: string;
}
function formatTokenAmount(rawWei: string, decimals = 18): number {
try {
const big = BigInt(rawWei);
const divisor = 10 ** decimals;
return Number(big) / divisor;
} catch {
return 0;
}
}
function formatDate(ts: string | null): string {
if (!ts) return 'N/A';
try {
@ -178,13 +169,13 @@ export function usePositionDashboard(positionId: Ref<string>) {
}
// Derived values
const depositKrk = computed(() => formatTokenAmount(position.value?.kraikenDeposit ?? '0'));
const taxPaidKrk = computed(() => formatTokenAmount(position.value?.taxPaid ?? '0'));
const depositKrk = computed(() => parseTokenAmount(position.value?.kraikenDeposit ?? '0'));
const taxPaidKrk = computed(() => parseTokenAmount(position.value?.taxPaid ?? '0'));
const currentValueKrk = computed(() => {
if (!position.value || !stats.value) return 0;
const share = Number(position.value.share);
const outstanding = formatTokenAmount(stats.value.outstandingStake);
const outstanding = parseTokenAmount(stats.value.outstandingStake);
return share * outstanding;
});
@ -245,7 +236,7 @@ export function usePositionDashboard(positionId: Ref<string>) {
return { count: lower, level, color };
});
const payoutKrk = computed(() => formatTokenAmount(position.value?.payout ?? '0'));
const payoutKrk = computed(() => parseTokenAmount(position.value?.payout ?? '0'));
const netPnlKrk = computed(() => {
if (!position.value) return 0;

View file

@ -2,6 +2,7 @@ import { ref, computed, onMounted, onUnmounted, type Ref } from 'vue';
import axios from 'axios';
import { DEFAULT_CHAIN_ID } from '@/config';
import { resolveGraphqlEndpoint, formatGraphqlError } from '@/utils/graphqlRetry';
import { parseTokenAmount } from '@/utils/helper';
import logger from '@/utils/logger';
const GRAPHQL_TIMEOUT_MS = 15_000;
@ -36,16 +37,6 @@ export interface WalletStats {
holderCount: number;
}
function formatTokenAmount(rawWei: string, decimals = 18): number {
try {
const big = BigInt(rawWei);
const divisor = 10 ** decimals;
return Number(big) / divisor;
} catch {
return 0;
}
}
export function useWalletDashboard(address: Ref<string>) {
const holderBalance = ref<string>('0');
const holderTotalEthSpent = ref<string>('0');
@ -145,13 +136,13 @@ export function useWalletDashboard(address: Ref<string>) {
}
// Derived values
const balanceKrk = computed(() => formatTokenAmount(holderBalance.value));
const balanceKrk = computed(() => parseTokenAmount(holderBalance.value));
const ethBacking = computed(() => {
if (!stats.value) return 0;
const balance = balanceKrk.value;
const reserve = formatTokenAmount(stats.value.lastEthReserve);
const totalSupply = formatTokenAmount(stats.value.kraikenTotalSupply);
const reserve = parseTokenAmount(stats.value.lastEthReserve);
const totalSupply = parseTokenAmount(stats.value.kraikenTotalSupply);
if (totalSupply === 0) return 0;
return balance * (reserve / totalSupply);
});
@ -160,21 +151,21 @@ export function useWalletDashboard(address: Ref<string>) {
if (!stats.value) return 0;
const balance = balanceKrk.value;
// floorPriceWei is price per token in wei → convert to ETH
const floorPriceEth = formatTokenAmount(stats.value.floorPriceWei);
const floorPriceEth = parseTokenAmount(stats.value.floorPriceWei);
return balance * floorPriceEth;
});
// Cost basis & P&L
const avgCostBasis = computed(() => {
const spent = formatTokenAmount(holderTotalEthSpent.value);
const acquired = formatTokenAmount(holderTotalTokensAcquired.value);
const spent = parseTokenAmount(holderTotalEthSpent.value);
const acquired = parseTokenAmount(holderTotalTokensAcquired.value);
if (acquired === 0) return 0;
return spent / acquired;
});
const currentPriceEth = computed(() => {
if (!stats.value?.currentPriceWei) return 0;
return formatTokenAmount(stats.value.currentPriceWei);
return parseTokenAmount(stats.value.currentPriceWei);
});
const unrealizedPnlEth = computed(() => {

View file

@ -68,6 +68,14 @@ export function formatTokenAmount(raw: string, decimals: number = 18, digits: nu
}
}
export function parseTokenAmount(rawWei: string, decimals = 18): number {
try {
return Number(formatUnits(BigInt(rawWei), decimals));
} catch {
return 0;
}
}
export function formatBigIntDivision(nominator: bigint, denominator: bigint, _digits: number = 2) {
if (!nominator) {
return 0;