All checks were successful
check / check (push) Successful in 22s
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.
58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
// Cached ENS reverse resolution.
|
|
// Resolves addresses to ENS names via ethers provider.lookupAddress(),
|
|
// caching results in localStorage with a 12-hour TTL.
|
|
|
|
const { getProvider } = require("./balances");
|
|
const { log } = require("./log");
|
|
|
|
const CACHE_TTL_MS = 43200000; // 12 hours
|
|
const CACHE_PREFIX = "ens:";
|
|
|
|
function getCached(address) {
|
|
const key = CACHE_PREFIX + address.toLowerCase();
|
|
try {
|
|
const raw = localStorage.getItem(key);
|
|
if (!raw) return undefined;
|
|
const entry = JSON.parse(raw);
|
|
if (Date.now() - entry.ts < CACHE_TTL_MS) {
|
|
return entry.name;
|
|
}
|
|
} catch {
|
|
// Corrupt cache entry — treat as miss.
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function setCache(address, name) {
|
|
const key = CACHE_PREFIX + address.toLowerCase();
|
|
localStorage.setItem(key, JSON.stringify({ name, ts: Date.now() }));
|
|
}
|
|
|
|
async function resolveEnsName(address, rpcUrl) {
|
|
const cached = getCached(address);
|
|
if (cached !== undefined) return cached;
|
|
|
|
const provider = getProvider(rpcUrl);
|
|
try {
|
|
const name = (await provider.lookupAddress(address)) || null;
|
|
setCache(address, name);
|
|
return name;
|
|
} catch (e) {
|
|
log.errorf("ENS reverse lookup failed", address, e.message);
|
|
// Don't cache failures — let subsequent lookups retry
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async function resolveEnsNames(addresses, rpcUrl) {
|
|
const results = new Map();
|
|
await Promise.all(
|
|
addresses.map(async (addr) => {
|
|
results.set(addr, await resolveEnsName(addr, rpcUrl));
|
|
}),
|
|
);
|
|
return results;
|
|
}
|
|
|
|
module.exports = { resolveEnsName, resolveEnsNames };
|