mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-07-16 21:48:10 -07:00
heatmaps: part 12
This commit is contained in:
@@ -9,7 +9,21 @@ import { defaultTooltip } from "./tooltip.js";
|
||||
const BINS = 2400;
|
||||
const MIN_LOG = -8;
|
||||
const BINS_PER_DECADE = 200;
|
||||
const MAX_LOG = MIN_LOG + (BINS - 1) / BINS_PER_DECADE;
|
||||
const AMOUNT_CHOICES = [
|
||||
{ label: "1 sat", value: -8 },
|
||||
{ label: "10 sats", value: -7 },
|
||||
{ label: "100 sats", value: -6 },
|
||||
{ label: "1k sats", value: -5 },
|
||||
{ label: "10k sats", value: -4 },
|
||||
{ label: "100k sats", value: -3 },
|
||||
{ label: "0.01 BTC", value: -2 },
|
||||
{ label: "0.1 BTC", value: -1 },
|
||||
{ label: "1 BTC", value: 0 },
|
||||
{ label: "10 BTC", value: 1 },
|
||||
{ label: "100 BTC", value: 2 },
|
||||
{ label: "1k BTC", value: 3 },
|
||||
{ label: "10k BTC", value: 4 },
|
||||
];
|
||||
|
||||
export const oracleRawHeatmapOption = createOracleHeatmapOption("raw", "Raw");
|
||||
export const oracleEmaHeatmapOption = createOracleHeatmapOption("ema", "EMA");
|
||||
@@ -29,11 +43,19 @@ function createOracleHeatmapOption(mode, name) {
|
||||
fetchOraclePoints(mode, date, signal, onPoints),
|
||||
},
|
||||
grid: createAverageGrid({
|
||||
yStart: MIN_LOG,
|
||||
yEnd: MIN_LOG + BINS / BINS_PER_DECADE,
|
||||
yMin: MIN_LOG,
|
||||
yMax: MIN_LOG + BINS / BINS_PER_DECADE,
|
||||
nativeRows: BINS,
|
||||
yOrigin: "top",
|
||||
}),
|
||||
color: logIntensityColor({ light: INFERNO_LUT, dark: INFERNO_LUT }),
|
||||
axis: {
|
||||
y: {
|
||||
label: "amount",
|
||||
choices: AMOUNT_CHOICES,
|
||||
format: formatAmount,
|
||||
},
|
||||
},
|
||||
tooltip: defaultTooltip,
|
||||
};
|
||||
}
|
||||
@@ -78,8 +100,38 @@ function fetchOracleValues(mode, date, signal, onValue) {
|
||||
function toOraclePoints(values) {
|
||||
return {
|
||||
kind: "implicit",
|
||||
yStart: MAX_LOG,
|
||||
yStep: -1 / BINS_PER_DECADE,
|
||||
yStart: MIN_LOG,
|
||||
yStep: 1 / BINS_PER_DECADE,
|
||||
values,
|
||||
};
|
||||
}
|
||||
|
||||
/** @param {number} value */
|
||||
function formatAmount(value) {
|
||||
const rounded = Math.round(value);
|
||||
if (Math.abs(value - rounded) < 0.001) {
|
||||
const choice = AMOUNT_CHOICES.find((choice) => choice.value === rounded);
|
||||
if (choice) return choice.label;
|
||||
}
|
||||
const btc = 10 ** value;
|
||||
if (btc >= 1) return `${formatCompact(btc)} BTC`;
|
||||
return `${formatCompact(btc * 100_000_000)} sats`;
|
||||
}
|
||||
|
||||
/** @param {number} value */
|
||||
function formatCompact(value) {
|
||||
if (value >= 1000) return `${formatNumber(value / 1000)}k`;
|
||||
return formatNumber(value);
|
||||
}
|
||||
|
||||
/** @param {number} value */
|
||||
function formatNumber(value) {
|
||||
if (value >= 100) return String(Math.round(value));
|
||||
if (value >= 10) return trimNumber(value.toFixed(1));
|
||||
return trimNumber(value.toFixed(2));
|
||||
}
|
||||
|
||||
/** @param {string} value */
|
||||
function trimNumber(value) {
|
||||
return value.replace(/\.?0+$/, "");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user