+
{quickSearches.map((token) => (
{token.label}
-
{token.description}
+
{token.description}
))}
diff --git a/frontend/src/services/api/tokenAggregation.ts b/frontend/src/services/api/tokenAggregation.ts
index 6512aac..80e1198 100644
--- a/frontend/src/services/api/tokenAggregation.ts
+++ b/frontend/src/services/api/tokenAggregation.ts
@@ -61,24 +61,76 @@ function toNumber(value: number | string | null | undefined): number | undefined
return undefined
}
+function decimalStringToNumber(value: string | null | undefined, decimals: number | undefined): number | null {
+ if (!value || decimals == null || decimals < 0) return null
+ try {
+ const raw = BigInt(value)
+ if (raw <= 0n) return 0
+ const scale = 10n ** BigInt(decimals)
+ const whole = raw / scale
+ const fraction = raw % scale
+ const normalized = Number(whole) + Number(fraction) / Number(scale)
+ return Number.isFinite(normalized) ? normalized : null
+ } catch {
+ return null
+ }
+}
+
+function normalizePossiblyRawLiquidityUsd(
+ liquidityUsd: number | undefined,
+ totalSupply: string | null | undefined,
+ decimals: number | undefined,
+ priceUsd: number | undefined,
+): number | undefined {
+ if (liquidityUsd == null || !(liquidityUsd > 0)) return liquidityUsd
+ if (!Number.isInteger(decimals) || decimals == null || decimals <= 0) return liquidityUsd
+
+ const supplyUnits = decimalStringToNumber(totalSupply, decimals)
+ const price = priceUsd != null && priceUsd > 0 ? priceUsd : 1
+ if (supplyUnits == null || supplyUnits <= 0) return liquidityUsd
+
+ const plausibleSupplyValue = supplyUnits * price
+ const normalizedLiquidity = liquidityUsd / 10 ** decimals
+
+ if (
+ Number.isFinite(plausibleSupplyValue) &&
+ Number.isFinite(normalizedLiquidity) &&
+ liquidityUsd > plausibleSupplyValue &&
+ normalizedLiquidity <= plausibleSupplyValue
+ ) {
+ return normalizedLiquidity
+ }
+
+ return liquidityUsd
+}
+
function normalizeTokenSnapshot(raw: RawTokenAggregationTokenResponse): TokenAggregationTokenSnapshot | null {
const token = raw.token
if (!token?.address) {
return null
}
+ const decimals = toNumber(token.decimals)
+ const priceUsd = toNumber(token.market?.priceUsd)
+ const liquidityUsd = normalizePossiblyRawLiquidityUsd(
+ toNumber(token.market?.liquidityUsd),
+ token.totalSupply,
+ decimals,
+ priceUsd,
+ )
+
return {
chainId: toNumber(token.chainId) ?? 138,
address: token.address,
name: token.name || undefined,
symbol: token.symbol || undefined,
- decimals: toNumber(token.decimals),
+ decimals,
totalSupply: token.totalSupply || undefined,
market: token.market
? {
- priceUsd: toNumber(token.market.priceUsd),
+ priceUsd,
volume24h: toNumber(token.market.volume24h),
- liquidityUsd: toNumber(token.market.liquidityUsd),
+ liquidityUsd,
lastUpdated: token.market.lastUpdated || null,
}
: null,
diff --git a/frontend/src/services/api/tokens.test.ts b/frontend/src/services/api/tokens.test.ts
index 7253a31..2e8a08a 100644
--- a/frontend/src/services/api/tokens.test.ts
+++ b/frontend/src/services/api/tokens.test.ts
@@ -29,11 +29,11 @@ describe('tokensApi', () => {
symbol: 'cUSDT',
name: 'Tether USD (Compliant)',
decimals: 6,
- totalSupply: '1000',
+ totalSupply: '928784229000000',
market: {
priceUsd: 1,
volume24h: 2500,
- liquidityUsd: 500000,
+ liquidityUsd: 2270037545568.842,
lastUpdated: '2026-04-26T01:00:00.000Z',
},
},
@@ -82,7 +82,7 @@ describe('tokensApi', () => {
expect(token.data?.symbol).toBe('cUSDT')
expect(token.data?.exchange_rate).toBe(1)
expect(token.data?.volume_24h).toBe(2500)
- expect(token.data?.liquidity_usd).toBe(500000)
+ expect(token.data?.liquidity_usd).toBe(2270037.545568842)
expect(token.data?.price_source).toBe('token-aggregation')
expect(holders.data[0].label).toBe('Treasury')
expect(transfers.data[0].token_symbol).toBe('cUSDT')
diff --git a/frontend/src/styles/globals.css b/frontend/src/styles/globals.css
index 59414c4..ca01ae5 100644
--- a/frontend/src/styles/globals.css
+++ b/frontend/src/styles/globals.css
@@ -18,11 +18,9 @@
body {
color: rgb(var(--foreground-rgb));
- background: linear-gradient(
- to bottom,
- transparent,
- rgb(var(--background-end-rgb))
- )
- rgb(var(--background-start-rgb));
+ background: #f8fafc;
}
+.dark body {
+ background: #030712;
+}