diff --git a/src/popup/views/addressDetail.js b/src/popup/views/addressDetail.js index 4eda88c..8e6f7ee 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 f3b6ccb..211f144 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, @@ -249,12 +250,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)" : ""; 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}
`; } 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; } }