From da428a3815b0c3a70c571e597036ac99c2518996 Mon Sep 17 00:00:00 2001 From: user Date: Fri, 27 Feb 2026 14:24:32 -0800 Subject: [PATCH 1/3] fix: preserve ENS names on lookup failure, add debug logging (closes #22) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues that could cause ENS names to disappear: 1. refreshBalances: on ENS lookup error, addr.ensName was set to null, wiping any previously resolved name. Now keeps the existing value on error — only overwrites on successful lookup. 2. ens.js cache: failed lookups were cached as null for 12 hours, preventing retries even after transient errors resolved. Now skips caching on failure so subsequent lookups retry immediately. Added debug logging to ENS reverse lookups in refreshBalances. --- src/shared/balances.js | 18 +++++++++++++++--- src/shared/ens.js | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/shared/balances.js b/src/shared/balances.js index 732812a..7ad0872 100644 --- a/src/shared/balances.js +++ b/src/shared/balances.js @@ -123,15 +123,27 @@ async function refreshBalances(wallets, rpcUrl, blockscoutUrl, trackedTokens) { }), ); - // ENS reverse lookup + // ENS reverse lookup — only overwrite on success so that + // transient RPC errors don't wipe a previously resolved name. updates.push( provider .lookupAddress(addr.address) .then((name) => { addr.ensName = name || null; + log.debugf( + "ENS reverse", + addr.address, + "->", + addr.ensName, + ); }) - .catch(() => { - addr.ensName = null; + .catch((e) => { + log.errorf( + "ENS reverse failed", + addr.address, + e.message, + ); + // Keep existing addr.ensName if we had one }), ); diff --git a/src/shared/ens.js b/src/shared/ens.js index 9b06aa6..d0dcc01 100644 --- a/src/shared/ens.js +++ b/src/shared/ens.js @@ -39,7 +39,7 @@ async function resolveEnsName(address, rpcUrl) { return name; } catch (e) { log.errorf("ENS reverse lookup failed", address, e.message); - setCache(address, null); + // Don't cache failures — let subsequent lookups retry return null; } } From bf9a4830310993d6fcdde8f51df4ea06cbdccb10 Mon Sep 17 00:00:00 2001 From: user Date: Fri, 27 Feb 2026 14:28:20 -0800 Subject: [PATCH 2/3] fix: show wallet/address titles in send, txStatus, and home tx list (closes #26, closes #27, closes #28) - send.js: show addressTitle() above ENS name and address in From field - txStatus.js: show addressTitle() in To address when it's a local wallet - home.js: show addressTitle() for counterparties in tx list when they are local wallet addresses --- src/popup/views/home.js | 4 +++- src/popup/views/send.js | 17 +++++++++++++++-- src/popup/views/txStatus.js | 8 ++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/popup/views/home.js b/src/popup/views/home.js index 78fbff2..cb7cd24 100644 --- a/src/popup/views/home.js +++ b/src/popup/views/home.js @@ -6,6 +6,7 @@ const { isoDate, timeAgo, addressDotHtml, + addressTitle, escapeHtml, truncateMiddle, } = require("./helpers"); @@ -110,8 +111,9 @@ function renderHomeTxList(ctx) { const amountStr = tx.value ? escapeHtml(tx.value + " " + tx.symbol) : escapeHtml(tx.symbol); + const title = addressTitle(counterparty, state.wallets); const maxAddr = Math.max(32, 36 - Math.max(0, amountStr.length - 10)); - const displayAddr = truncateMiddle(counterparty, maxAddr); + const displayAddr = title || truncateMiddle(counterparty, maxAddr); const addrStr = escapeHtml(displayAddr); const dot = addressDotHtml(counterparty); const err = tx.isError ? " (failed)" : ""; diff --git a/src/popup/views/send.js b/src/popup/views/send.js index d96d5b7..6a7b630 100644 --- a/src/popup/views/send.js +++ b/src/popup/views/send.js @@ -1,6 +1,12 @@ // Send view: collect To, Amount, Token. Then go to confirmation. -const { $, showFlash, addressDotHtml, escapeHtml } = require("./helpers"); +const { + $, + showFlash, + addressDotHtml, + addressTitle, + escapeHtml, +} = require("./helpers"); const { state, currentAddress } = require("../../shared/state"); let ctx; const { getProvider } = require("../../shared/balances"); @@ -44,8 +50,15 @@ function updateSendBalance() { const dot = addressDotHtml(addr.address); const link = `https://etherscan.io/address/${addr.address}`; const extLink = `${EXT_ICON}`; + const title = addressTitle(addr.address, state.wallets); let fromHtml = ""; - if (addr.ensName) { + if (title) { + fromHtml += `
${dot}${escapeHtml(title)}
`; + if (addr.ensName) { + fromHtml += `
${escapeHtml(addr.ensName)}
`; + } + fromHtml += `
${escapeHtml(addr.address)}${extLink}
`; + } else if (addr.ensName) { fromHtml += `
${dot}${escapeHtml(addr.ensName)}
`; fromHtml += `
${escapeHtml(addr.address)}${extLink}
`; } else { diff --git a/src/popup/views/txStatus.js b/src/popup/views/txStatus.js index a36fd31..a755b84 100644 --- a/src/popup/views/txStatus.js +++ b/src/popup/views/txStatus.js @@ -5,6 +5,7 @@ const { showView, showFlash, addressDotHtml, + addressTitle, escapeHtml, } = require("./helpers"); const { state, saveState } = require("../../shared/state"); @@ -37,6 +38,13 @@ function toAddressHtml(address) { const dot = addressDotHtml(address); const link = `https://etherscan.io/address/${address}`; const extLink = `${EXT_ICON}`; + const title = addressTitle(address, state.wallets); + if (title) { + return ( + `
${dot}${escapeHtml(title)}
` + + `
${escapeHtml(address)}${extLink}
` + ); + } return `
${dot}${escapeHtml(address)}${extLink}
`; } From 2abb720d54392c74dc681fe0958f79f897f59490 Mon Sep 17 00:00:00 2001 From: user Date: Fri, 27 Feb 2026 14:30:09 -0800 Subject: [PATCH 3/3] fix: show wallet/address titles in addressDetail and addressToken tx lists (closes #29) --- src/popup/views/addressDetail.js | 5 ++++- src/popup/views/addressToken.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/popup/views/addressDetail.js b/src/popup/views/addressDetail.js index 3f4f4f1..20676aa 100644 --- a/src/popup/views/addressDetail.js +++ b/src/popup/views/addressDetail.js @@ -4,6 +4,7 @@ const { showFlash, balanceLinesForAddress, addressDotHtml, + addressTitle, escapeHtml, truncateMiddle, } = require("./helpers"); @@ -190,12 +191,14 @@ function renderTransactions(txs) { ? tx.to : tx.from; const ensName = ensNameMap.get(counterparty) || null; + const title = addressTitle(counterparty, state.wallets); const dirLabel = tx.directionLabel; const amountStr = tx.value ? escapeHtml(tx.value + " " + tx.symbol) : escapeHtml(tx.symbol); const maxAddr = Math.max(32, 36 - Math.max(0, amountStr.length - 10)); - const displayAddr = ensName || truncateMiddle(counterparty, maxAddr); + const displayAddr = + title || ensName || truncateMiddle(counterparty, maxAddr); const addrStr = escapeHtml(displayAddr); const dot = addressDotHtml(counterparty); const err = tx.isError ? " (failed)" : ""; diff --git a/src/popup/views/addressToken.js b/src/popup/views/addressToken.js index 1284029..274a5f7 100644 --- a/src/popup/views/addressToken.js +++ b/src/popup/views/addressToken.js @@ -6,6 +6,7 @@ const { showView, showFlash, addressDotHtml, + addressTitle, escapeHtml, truncateMiddle, balanceLine, @@ -250,12 +251,14 @@ function renderTransactions(txs) { for (const tx of txs) { const counterparty = tx.direction === "sent" ? tx.to : tx.from; const ensName = ensNameMap.get(counterparty) || null; + const title = addressTitle(counterparty, state.wallets); const dirLabel = tx.directionLabel; const amountStr = tx.value ? escapeHtml(tx.value + " " + tx.symbol) : escapeHtml(tx.symbol); const maxAddr = Math.max(32, 36 - Math.max(0, amountStr.length - 10)); - const displayAddr = ensName || truncateMiddle(counterparty, maxAddr); + const displayAddr = + title || ensName || truncateMiddle(counterparty, maxAddr); const addrStr = escapeHtml(displayAddr); const dot = addressDotHtml(counterparty); const err = tx.isError ? " (failed)" : "";