All checks were successful
check / check (push) Successful in 14s
Delete src/shared/tokens.js and migrate all consumers to src/shared/tokenList.js which has 511 tokens (vs ~150) sourced from CoinGecko with on-chain verified decimals. - prices.js: getTopTokenPrices now from tokenList - transactions.js: KNOWN_SYMBOLS now from tokenList (3.4x more symbols for spoof detection) - send.js: KNOWN_SYMBOLS for token dropdown filtering - approval.js: uses pre-built TOKEN_BY_ADDRESS map instead of constructing its own from TOKENS array - addToken.js: uses getTopTokens(25) for quick-pick buttons (only top 25 shown, not all 511)
80 lines
1.9 KiB
JavaScript
80 lines
1.9 KiB
JavaScript
// Price fetching with 5-minute cache, USD formatting, value aggregation.
|
|
|
|
const { getTopTokenPrices } = require("./tokenList");
|
|
|
|
const PRICE_CACHE_TTL = 300000; // 5 minutes
|
|
|
|
const prices = {};
|
|
let lastFetchedAt = 0;
|
|
|
|
async function refreshPrices() {
|
|
const now = Date.now();
|
|
if (now - lastFetchedAt < PRICE_CACHE_TTL) return;
|
|
try {
|
|
const fetched = await getTopTokenPrices(25);
|
|
Object.assign(prices, fetched);
|
|
lastFetchedAt = now;
|
|
} catch (e) {
|
|
// prices stay stale on error
|
|
}
|
|
}
|
|
|
|
function getPrice(symbol) {
|
|
return prices[symbol] || null;
|
|
}
|
|
|
|
function formatUsd(amount) {
|
|
if (amount === null || amount === undefined || isNaN(amount)) return "";
|
|
if (amount === 0) return "$0.00";
|
|
if (amount < 0.01) return "< $0.01";
|
|
return (
|
|
"$" +
|
|
amount.toLocaleString("en-US", {
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
})
|
|
);
|
|
}
|
|
|
|
function getAddressValueUsd(addr) {
|
|
if (!prices.ETH) return null;
|
|
let total = 0;
|
|
const ethBal = parseFloat(addr.balance || "0");
|
|
total += ethBal * prices.ETH;
|
|
for (const token of addr.tokenBalances || []) {
|
|
const tokenBal = parseFloat(token.balance || "0");
|
|
if (tokenBal > 0 && prices[token.symbol]) {
|
|
total += tokenBal * prices[token.symbol];
|
|
}
|
|
}
|
|
return total;
|
|
}
|
|
|
|
function getWalletValueUsd(wallet) {
|
|
if (!prices.ETH) return null;
|
|
let total = 0;
|
|
for (const addr of wallet.addresses) {
|
|
total += getAddressValueUsd(addr);
|
|
}
|
|
return total;
|
|
}
|
|
|
|
function getTotalValueUsd(wallets) {
|
|
if (!prices.ETH) return null;
|
|
let total = 0;
|
|
for (const wallet of wallets) {
|
|
total += getWalletValueUsd(wallet);
|
|
}
|
|
return total;
|
|
}
|
|
|
|
module.exports = {
|
|
prices,
|
|
refreshPrices,
|
|
getPrice,
|
|
formatUsd,
|
|
getAddressValueUsd,
|
|
getWalletValueUsd,
|
|
getTotalValueUsd,
|
|
};
|