Add address color dots and cached ENS reverse lookups
Some checks failed
check / check (push) Has been cancelled
Some checks failed
check / check (push) Has been cancelled
Deterministic colored dots derived from address bytes (16-color palette) displayed before every address. ENS reverse resolution for transaction counterparties with 12-hour localStorage cache.
This commit is contained in:
57
src/shared/ens.js
Normal file
57
src/shared/ens.js
Normal file
@@ -0,0 +1,57 @@
|
||||
// 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);
|
||||
setCache(address, null);
|
||||
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 };
|
||||
Reference in New Issue
Block a user