// Small formatting helpers. Internally amounts are integer satoshis (Number;
// safe because max BTC supply ~2.1e15 sats < Number.MAX_SAFE_INTEGER).
export const SATS = 100_000_000;
// The Ark mark — Second's logo (second.tech): a triangle with an inner cutout
// (evenodd). ARK_MARK is the bare glyph in currentColor (sits inline like an
// emoji, themes automatically); ARK_ICON is the app-badge treatment (dark
// rounded square + white mark) for card headers.
const ARK_PATH = 'M218.4 50.9c-8.4-14.5-29.4-14.5-37.7 0L20.9 327.6c-8.4 14.5 2.1 32.7 18.9 32.7h319.5c16.8 0 27.3-18.2 18.9-32.7L218.4 50.9ZM73.9 305.5c-5.1 9.1 3.7 19.7 13.5 16.4l134.8-45.3c6.8-2.3 9.8-10.2 6.2-16.5l-55.3-95.8c-4.4-7.6-15.4-7.6-19.7.1L73.9 305.5Z';
export const ARK_MARK = (px = 16) =>
``;
export const ARK_ICON = (px = 16) =>
``;
export function btc(sats) {
return (Number(sats) / SATS).toFixed(8);
}
// "0.01234500" with the trailing-zero portion dimmed is done in CSS; here we
// just produce a clean fixed-8 string.
export function fmtBtc(sats) {
return btc(sats);
}
export function fmtSats(sats) {
return Number(sats).toLocaleString('en-US');
}
export function fmtUsd(sats, price) {
if (!price) return '';
const usd = (Number(sats) / SATS) * price;
return usd.toLocaleString('en-US', { style: 'currency', currency: 'USD' });
}
// Parse a user-entered amount. Accepts BTC (default) or sats.
export function parseAmount(value, unit) {
const n = Number(String(value).trim().replace(/,/g, ''));
if (!isFinite(n) || n < 0) return null;
return unit === 'sats' ? Math.round(n) : Math.round(n * SATS);
}
export function shortAddr(a, head = 10, tail = 8) {
if (!a || a.length <= head + tail + 1) return a;
return `${a.slice(0, head)}…${a.slice(-tail)}`;
}
export function shortTxid(t) {
return shortAddr(t, 8, 8);
}
export function timeAgo(unixSeconds) {
if (!unixSeconds) return 'pending';
const s = Math.max(0, Math.floor(Date.now() / 1000 - unixSeconds));
const units = [
[31536000, 'y'],
[2592000, 'mo'],
[86400, 'd'],
[3600, 'h'],
[60, 'm'],
];
for (const [secs, label] of units) {
if (s >= secs) return `${Math.floor(s / secs)}${label} ago`;
}
return `${s}s ago`;
}