From 4545a42ba0ad0f213f9c4f20d9f464f5278f7985 Mon Sep 17 00:00:00 2001 From: clawbot Date: Sat, 28 Feb 2026 08:35:32 -0800 Subject: [PATCH] fix: resolve token symbols from multiple sources (closes #51) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When tokenBalances doesn't contain an entry for a token (e.g. before balances are fetched), the symbol fell back to '?' in addressToken and send views. Add resolveSymbol() helper that checks tokenBalances → TOKEN_BY_ADDRESS (known tokens) → trackedTokens → truncated address as last resort. Fixes USDC and other known tokens showing '?' when balance data hasn't loaded yet. --- src/popup/views/addressToken.js | 8 ++++++-- src/popup/views/send.js | 18 +++++++++++++++--- src/shared/tokenList.js | 17 +++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/popup/views/addressToken.js b/src/popup/views/addressToken.js index 211f144..2a2f529 100644 --- a/src/popup/views/addressToken.js +++ b/src/popup/views/addressToken.js @@ -12,7 +12,7 @@ const { balanceLine, } = require("./helpers"); const { state, currentAddress, saveState } = require("../../shared/state"); -const { TOKEN_BY_ADDRESS } = require("../../shared/tokenList"); +const { TOKEN_BY_ADDRESS, resolveSymbol } = require("../../shared/tokenList"); const { formatUsd, getPrice, @@ -95,7 +95,11 @@ function show() { const tb = (addr.tokenBalances || []).find( (t) => t.address.toLowerCase() === tokenId.toLowerCase(), ); - symbol = tb ? tb.symbol : "?"; + symbol = resolveSymbol( + tokenId, + addr.tokenBalances, + state.trackedTokens, + ); amount = tb ? parseFloat(tb.balance || "0") : 0; price = getPrice(symbol); } diff --git a/src/popup/views/send.js b/src/popup/views/send.js index 6a7b630..a50dddb 100644 --- a/src/popup/views/send.js +++ b/src/popup/views/send.js @@ -10,7 +10,11 @@ const { const { state, currentAddress } = require("../../shared/state"); let ctx; const { getProvider } = require("../../shared/balances"); -const { KNOWN_SYMBOLS } = require("../../shared/tokenList"); +const { + KNOWN_SYMBOLS, + TOKEN_BY_ADDRESS, + resolveSymbol, +} = require("../../shared/tokenList"); const EXT_ICON = `` + @@ -73,7 +77,11 @@ function updateSendBalance() { const tb = (addr.tokenBalances || []).find( (t) => t.address.toLowerCase() === token.toLowerCase(), ); - const symbol = tb ? tb.symbol : "?"; + const symbol = resolveSymbol( + token, + addr.tokenBalances, + state.trackedTokens, + ); const bal = tb ? tb.balance || "0" : "0"; $("send-balance").textContent = "Current balance: " + bal + " " + symbol; @@ -124,7 +132,11 @@ function init(_ctx) { const tb = (addr.tokenBalances || []).find( (t) => t.address.toLowerCase() === token.toLowerCase(), ); - tokenSymbol = tb ? tb.symbol : "?"; + tokenSymbol = resolveSymbol( + token, + addr.tokenBalances, + state.trackedTokens, + ); tokenBalance = tb ? tb.balance || "0" : "0"; } diff --git a/src/shared/tokenList.js b/src/shared/tokenList.js index 45aa587..eff9dd6 100644 --- a/src/shared/tokenList.js +++ b/src/shared/tokenList.js @@ -3645,10 +3645,27 @@ async function getTopTokenPrices(n) { return prices; } +// Resolve a token symbol from multiple sources, never returning "?". +function resolveSymbol(tokenAddress, tokenBalances, trackedTokens) { + const lower = (tokenAddress || "").toLowerCase(); + const tb = (tokenBalances || []).find( + (t) => t.address.toLowerCase() === lower, + ); + if (tb && tb.symbol) return tb.symbol; + const known = TOKEN_BY_ADDRESS.get(lower); + if (known && known.symbol) return known.symbol; + const tracked = (trackedTokens || []).find( + (t) => t.address.toLowerCase() === lower, + ); + if (tracked && tracked.symbol) return tracked.symbol; + return lower.slice(0, 10) + "\u2026"; +} + module.exports = { TOKENS, TOKEN_BY_ADDRESS, KNOWN_SYMBOLS, getTopTokens, getTopTokenPrices, + resolveSymbol, };