mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-05-29 20:09:26 -07:00
global: renames part 2
This commit is contained in:
@@ -9,23 +9,24 @@ import { satsBtcUsd, createPriceRatioCharts } from "./shared.js";
|
||||
* @returns {PartialOptionsGroup}
|
||||
*/
|
||||
export function createCointimeSection() {
|
||||
const { cointime, distribution, supply } = brk.metrics;
|
||||
const { cointime, cohorts, supply } = brk.metrics;
|
||||
const {
|
||||
pricing,
|
||||
prices: cointimePrices,
|
||||
cap,
|
||||
activity,
|
||||
supply: cointimeSupply,
|
||||
adjusted,
|
||||
reserveRisk,
|
||||
value,
|
||||
coinblocksDestroyed,
|
||||
} = cointime;
|
||||
const { all } = distribution.utxoCohorts;
|
||||
const { all } = cohorts.utxo;
|
||||
|
||||
// Reference lines for cap comparisons
|
||||
const capReferenceLines = /** @type {const} */ ([
|
||||
{ metric: supply.marketCap, name: "Market", color: colors.default },
|
||||
{
|
||||
metric: all.realized.realizedCap,
|
||||
metric: all.realized.cap.usd,
|
||||
name: "Realized",
|
||||
color: colors.realized,
|
||||
},
|
||||
@@ -33,48 +34,44 @@ export function createCointimeSection() {
|
||||
|
||||
const prices = /** @type {const} */ ([
|
||||
{
|
||||
pricePattern: pricing.trueMarketMean,
|
||||
ratio: pricing.trueMarketMeanRatio,
|
||||
pattern: cointimePrices.trueMarketMean,
|
||||
name: "True Market Mean",
|
||||
color: colors.trueMarketMean,
|
||||
},
|
||||
{
|
||||
pricePattern: pricing.vaultedPrice,
|
||||
ratio: pricing.vaultedPriceRatio,
|
||||
pattern: cointimePrices.vaulted,
|
||||
name: "Vaulted",
|
||||
color: colors.vaulted,
|
||||
},
|
||||
{
|
||||
pricePattern: pricing.activePrice,
|
||||
ratio: pricing.activePriceRatio,
|
||||
pattern: cointimePrices.active,
|
||||
name: "Active",
|
||||
color: colors.active,
|
||||
},
|
||||
{
|
||||
pricePattern: pricing.cointimePrice,
|
||||
ratio: pricing.cointimePriceRatio,
|
||||
pattern: cointimePrices.cointime,
|
||||
name: "Cointime",
|
||||
color: colors.cointime,
|
||||
},
|
||||
]);
|
||||
|
||||
const caps = /** @type {const} */ ([
|
||||
{ metric: cap.vaultedCap, name: "Vaulted", color: colors.vaulted },
|
||||
{ metric: cap.activeCap, name: "Active", color: colors.active },
|
||||
{ metric: cap.cointimeCap, name: "Cointime", color: colors.cointime },
|
||||
{ metric: cap.investorCap, name: "Investor", color: colors.investor },
|
||||
{ metric: cap.thermoCap, name: "Thermo", color: colors.thermo },
|
||||
{ metric: cap.vaulted.usd, name: "Vaulted", color: colors.vaulted },
|
||||
{ metric: cap.active.usd, name: "Active", color: colors.active },
|
||||
{ metric: cap.cointime.usd, name: "Cointime", color: colors.cointime },
|
||||
{ metric: cap.investor.usd, name: "Investor", color: colors.investor },
|
||||
{ metric: cap.thermo.usd, name: "Thermo", color: colors.thermo },
|
||||
]);
|
||||
|
||||
const supplyBreakdown = /** @type {const} */ ([
|
||||
{ pattern: all.supply.total, name: "Total", color: colors.bitcoin },
|
||||
{
|
||||
pattern: cointimeSupply.vaultedSupply,
|
||||
pattern: cointimeSupply.vaulted,
|
||||
name: "Vaulted",
|
||||
color: colors.vaulted,
|
||||
},
|
||||
{
|
||||
pattern: cointimeSupply.activeSupply,
|
||||
pattern: cointimeSupply.active,
|
||||
name: "Active",
|
||||
color: colors.active,
|
||||
},
|
||||
@@ -82,7 +79,7 @@ export function createCointimeSection() {
|
||||
|
||||
const coinblocks = /** @type {const} */ ([
|
||||
{
|
||||
pattern: all.activity.coinblocksDestroyed,
|
||||
pattern: coinblocksDestroyed,
|
||||
name: "Destroyed",
|
||||
title: "Coinblocks Destroyed",
|
||||
color: colors.destroyed,
|
||||
@@ -104,19 +101,19 @@ export function createCointimeSection() {
|
||||
// Colors aligned with coinblocks: Destroyed=red, Created=orange, Stored=green
|
||||
const cointimeValues = /** @type {const} */ ([
|
||||
{
|
||||
pattern: value.cointimeValueCreated,
|
||||
pattern: value.created,
|
||||
name: "Created",
|
||||
title: "Cointime Value Created",
|
||||
color: colors.created,
|
||||
},
|
||||
{
|
||||
pattern: value.cointimeValueDestroyed,
|
||||
pattern: value.destroyed,
|
||||
name: "Destroyed",
|
||||
title: "Cointime Value Destroyed",
|
||||
color: colors.destroyed,
|
||||
},
|
||||
{
|
||||
pattern: value.cointimeValueStored,
|
||||
pattern: value.stored,
|
||||
name: "Stored",
|
||||
title: "Cointime Value Stored",
|
||||
color: colors.stored,
|
||||
@@ -142,31 +139,31 @@ export function createCointimeSection() {
|
||||
title: "Cointime Prices",
|
||||
top: [
|
||||
price({
|
||||
metric: all.realized.realizedPrice,
|
||||
metric: all.realized.price,
|
||||
name: "Realized",
|
||||
color: colors.realized,
|
||||
}),
|
||||
price({
|
||||
metric: all.realized.investorPrice,
|
||||
metric: all.realized.investor.price,
|
||||
name: "Investor",
|
||||
color: colors.investor,
|
||||
}),
|
||||
...prices.map(({ pricePattern, name, color }) =>
|
||||
price({ metric: pricePattern, name, color }),
|
||||
...prices.map(({ pattern, name, color }) =>
|
||||
price({ metric: pattern, name, color }),
|
||||
),
|
||||
],
|
||||
},
|
||||
...prices.map(({ pricePattern, ratio, name, color }) => ({
|
||||
...prices.map(({ pattern, name, color }) => ({
|
||||
name,
|
||||
tree: createPriceRatioCharts({
|
||||
context: `${name} Price`,
|
||||
legend: name,
|
||||
pricePattern,
|
||||
ratio,
|
||||
pricePattern: pattern,
|
||||
ratio: pattern,
|
||||
color,
|
||||
priceReferences: [
|
||||
price({
|
||||
metric: all.realized.realizedPrice,
|
||||
metric: all.realized.price,
|
||||
name: "Realized",
|
||||
color: colors.realized,
|
||||
defaultActive: false,
|
||||
@@ -238,7 +235,7 @@ export function createCointimeSection() {
|
||||
unit: Unit.ratio,
|
||||
}),
|
||||
line({
|
||||
metric: activity.activityToVaultednessRatio,
|
||||
metric: activity.ratio,
|
||||
name: "L/V Ratio",
|
||||
color: colors.activity,
|
||||
unit: Unit.ratio,
|
||||
@@ -259,7 +256,7 @@ export function createCointimeSection() {
|
||||
title: "Coinblocks",
|
||||
bottom: coinblocks.map(({ pattern, name, color }) =>
|
||||
line({
|
||||
metric: pattern.height,
|
||||
metric: pattern.base,
|
||||
name,
|
||||
color,
|
||||
unit: Unit.coinblocks,
|
||||
@@ -288,7 +285,7 @@ export function createCointimeSection() {
|
||||
title,
|
||||
bottom: [
|
||||
line({
|
||||
metric: pattern.height,
|
||||
metric: pattern.base,
|
||||
name,
|
||||
color,
|
||||
unit: Unit.coinblocks,
|
||||
@@ -325,10 +322,10 @@ export function createCointimeSection() {
|
||||
title: "Cointime Value",
|
||||
bottom: [
|
||||
...cointimeValues.map(({ pattern, name, color }) =>
|
||||
line({ metric: pattern.height, name, color, unit: Unit.usd }),
|
||||
line({ metric: pattern.base, name, color, unit: Unit.usd }),
|
||||
),
|
||||
line({
|
||||
metric: vocdd.pattern.height,
|
||||
metric: vocdd.pattern.base,
|
||||
name: vocdd.name,
|
||||
color: vocdd.color,
|
||||
unit: Unit.usd,
|
||||
@@ -364,7 +361,7 @@ export function createCointimeSection() {
|
||||
name: "Base",
|
||||
title,
|
||||
bottom: [
|
||||
line({ metric: pattern.height, name, color, unit: Unit.usd }),
|
||||
line({ metric: pattern.base, name, color, unit: Unit.usd }),
|
||||
],
|
||||
},
|
||||
rollingWindowsTree({ windows: pattern.sum, title, unit: Unit.usd }),
|
||||
@@ -390,13 +387,13 @@ export function createCointimeSection() {
|
||||
title: vocdd.title,
|
||||
bottom: [
|
||||
line({
|
||||
metric: vocdd.pattern.height,
|
||||
metric: vocdd.pattern.base,
|
||||
name: vocdd.name,
|
||||
color: vocdd.color,
|
||||
unit: Unit.usd,
|
||||
}),
|
||||
line({
|
||||
metric: reserveRisk.vocdd365dMedian,
|
||||
metric: reserveRisk.vocddMedian1y,
|
||||
name: "365d Median",
|
||||
color: colors.time._1y,
|
||||
unit: Unit.usd,
|
||||
@@ -430,7 +427,7 @@ export function createCointimeSection() {
|
||||
title: "Reserve Risk",
|
||||
bottom: [
|
||||
line({
|
||||
metric: reserveRisk.reserveRisk,
|
||||
metric: reserveRisk.value,
|
||||
name: "Ratio",
|
||||
color: colors.reserveRisk,
|
||||
unit: Unit.ratio,
|
||||
@@ -461,13 +458,13 @@ export function createCointimeSection() {
|
||||
title: "Cointime-Adjusted Inflation",
|
||||
bottom: [
|
||||
dots({
|
||||
metric: supply.inflation,
|
||||
metric: supply.inflationRate.percent,
|
||||
name: "Base",
|
||||
color: colors.base,
|
||||
unit: Unit.percentage,
|
||||
}),
|
||||
dots({
|
||||
metric: adjusted.cointimeAdjInflationRate,
|
||||
metric: adjusted.inflationRate.percent,
|
||||
name: "Cointime-Adjusted",
|
||||
color: colors.adjusted,
|
||||
unit: Unit.percentage,
|
||||
@@ -488,7 +485,7 @@ export function createCointimeSection() {
|
||||
unit: Unit.ratio,
|
||||
}),
|
||||
line({
|
||||
metric: adjusted.cointimeAdjTxBtcVelocity,
|
||||
metric: adjusted.txVelocityBtc,
|
||||
name: "Cointime-Adjusted",
|
||||
color: colors.adjusted,
|
||||
unit: Unit.ratio,
|
||||
@@ -506,7 +503,7 @@ export function createCointimeSection() {
|
||||
unit: Unit.ratio,
|
||||
}),
|
||||
line({
|
||||
metric: adjusted.cointimeAdjTxUsdVelocity,
|
||||
metric: adjusted.txVelocityUsd,
|
||||
name: "Cointime-Adjusted",
|
||||
color: colors.vaulted,
|
||||
unit: Unit.ratio,
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
/** Build cohort data arrays from brk.metrics */
|
||||
|
||||
import { colors } from "../../utils/colors.js";
|
||||
import { entries } from "../../utils/array.js";
|
||||
import { brk } from "../../client.js";
|
||||
@@ -20,36 +18,34 @@ const ADDRESSABLE_TYPES = [
|
||||
const isAddressable = (key) =>
|
||||
ADDRESSABLE_TYPES.includes(/** @type {any} */ (key));
|
||||
|
||||
/**
|
||||
* Build all cohort data from brk tree
|
||||
*/
|
||||
export function buildCohortData() {
|
||||
const utxoCohorts = brk.metrics.distribution.utxoCohorts;
|
||||
const addressCohorts = brk.metrics.distribution.addressCohorts;
|
||||
const { addrCount } = brk.metrics.distribution;
|
||||
const utxoCohorts = brk.metrics.cohorts.utxo;
|
||||
const addressCohorts = brk.metrics.cohorts.address;
|
||||
const { addresses } = brk.metrics;
|
||||
const {
|
||||
TERM_NAMES,
|
||||
EPOCH_NAMES,
|
||||
MAX_AGE_NAMES,
|
||||
MIN_AGE_NAMES,
|
||||
UNDER_AGE_NAMES,
|
||||
OVER_AGE_NAMES,
|
||||
AGE_RANGE_NAMES,
|
||||
GE_AMOUNT_NAMES,
|
||||
LT_AMOUNT_NAMES,
|
||||
OVER_AMOUNT_NAMES,
|
||||
UNDER_AMOUNT_NAMES,
|
||||
AMOUNT_RANGE_NAMES,
|
||||
SPENDABLE_TYPE_NAMES,
|
||||
CLASS_NAMES,
|
||||
} = brk;
|
||||
|
||||
// Base cohort representing "all"
|
||||
const cohortAll = {
|
||||
name: "",
|
||||
title: "",
|
||||
color: colors.bitcoin,
|
||||
tree: utxoCohorts.all,
|
||||
addrCount: addrCount.all,
|
||||
addressCount: {
|
||||
inner: addresses.funded.all,
|
||||
delta: addresses.delta.all,
|
||||
},
|
||||
};
|
||||
|
||||
// Term cohorts
|
||||
const shortNames = TERM_NAMES.short;
|
||||
const termShort = {
|
||||
name: shortNames.short,
|
||||
@@ -66,141 +62,102 @@ export function buildCohortData() {
|
||||
tree: utxoCohorts.lth,
|
||||
};
|
||||
|
||||
// Max age cohorts (up to X time)
|
||||
const upToDate = entries(utxoCohorts.maxAge).map(([key, tree], i, arr) => {
|
||||
const names = MAX_AGE_NAMES[key];
|
||||
return {
|
||||
// Under age cohorts
|
||||
const underAge = entries(UNDER_AGE_NAMES).map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.underAge[key],
|
||||
}));
|
||||
|
||||
// Over age cohorts
|
||||
const overAge = entries(OVER_AGE_NAMES).map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.overAge[key],
|
||||
}));
|
||||
|
||||
const ageRange = entries(AGE_RANGE_NAMES).map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.ageRange[key],
|
||||
}));
|
||||
|
||||
const epoch = entries(EPOCH_NAMES).map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: names.long,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.epoch[key],
|
||||
}));
|
||||
|
||||
const utxosOverAmount = entries(OVER_AMOUNT_NAMES).map(
|
||||
([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
|
||||
// Min age cohorts (from X time)
|
||||
const fromDate = entries(utxoCohorts.minAge).map(([key, tree], i, arr) => {
|
||||
const names = MIN_AGE_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
|
||||
// Age range cohorts
|
||||
const dateRange = entries(utxoCohorts.ageRange).map(([key, tree], i, arr) => {
|
||||
const names = AGE_RANGE_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
|
||||
// Epoch cohorts
|
||||
const epoch = entries(utxoCohorts.epoch).map(([key, tree], i, arr) => {
|
||||
const names = EPOCH_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: names.long,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
|
||||
// UTXOs above amount
|
||||
const utxosAboveAmount = entries(utxoCohorts.geAmount).map(
|
||||
([key, tree], i, arr) => {
|
||||
const names = GE_AMOUNT_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
},
|
||||
tree: utxoCohorts.overAmount[key],
|
||||
}),
|
||||
);
|
||||
|
||||
// Addresses above amount
|
||||
const addressesAboveAmount = entries(addressCohorts.geAmount).map(
|
||||
([key, cohort], i, arr) => {
|
||||
const names = GE_AMOUNT_NAMES[key];
|
||||
const addressesOverAmount = entries(OVER_AMOUNT_NAMES).map(
|
||||
([key, names], i, arr) => {
|
||||
const cohort = addressCohorts.overAmount[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `Addresses ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: cohort,
|
||||
addrCount: {
|
||||
count: cohort.addrCount,
|
||||
_30dChange: cohort.addrCount30dChange,
|
||||
},
|
||||
addressCount: cohort.addressCount,
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
// UTXOs under amount
|
||||
const utxosUnderAmount = entries(utxoCohorts.ltAmount).map(
|
||||
([key, tree], i, arr) => {
|
||||
const names = LT_AMOUNT_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
},
|
||||
const utxosUnderAmount = entries(UNDER_AMOUNT_NAMES).map(
|
||||
([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.underAmount[key],
|
||||
}),
|
||||
);
|
||||
|
||||
// Addresses under amount
|
||||
const addressesUnderAmount = entries(addressCohorts.ltAmount).map(
|
||||
([key, cohort], i, arr) => {
|
||||
const names = LT_AMOUNT_NAMES[key];
|
||||
const addressesUnderAmount = entries(UNDER_AMOUNT_NAMES).map(
|
||||
([key, names], i, arr) => {
|
||||
const cohort = addressCohorts.underAmount[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `Addresses ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: cohort,
|
||||
addrCount: {
|
||||
count: cohort.addrCount,
|
||||
_30dChange: cohort.addrCount30dChange,
|
||||
},
|
||||
addressCount: cohort.addressCount,
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
// UTXOs amount ranges
|
||||
const utxosAmountRanges = entries(utxoCohorts.amountRange).map(
|
||||
([key, tree], i, arr) => {
|
||||
const names = AMOUNT_RANGE_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
},
|
||||
const utxosAmountRange = entries(AMOUNT_RANGE_NAMES).map(
|
||||
([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: `UTXOs ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.amountRange[key],
|
||||
}),
|
||||
);
|
||||
|
||||
// Addresses amount ranges
|
||||
const addressesAmountRanges = entries(addressCohorts.amountRange).map(
|
||||
([key, cohort], i, arr) => {
|
||||
const names = AMOUNT_RANGE_NAMES[key];
|
||||
const addressesAmountRange = entries(AMOUNT_RANGE_NAMES).map(
|
||||
([key, names], i, arr) => {
|
||||
const cohort = addressCohorts.amountRange[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: `Addresses ${names.long}`,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: cohort,
|
||||
addrCount: {
|
||||
count: cohort.addrCount,
|
||||
_30dChange: cohort.addrCount30dChange,
|
||||
},
|
||||
addressCount: cohort.addressCount,
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
// Spendable type cohorts - split by addressability
|
||||
const typeAddressable = ADDRESSABLE_TYPES.map((key, i, arr) => {
|
||||
const names = SPENDABLE_TYPE_NAMES[key];
|
||||
return {
|
||||
@@ -208,49 +165,45 @@ export function buildCohortData() {
|
||||
title: names.short,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.type[key],
|
||||
addrCount: addrCount[key],
|
||||
addressCount: {
|
||||
inner: addresses.funded[key],
|
||||
delta: addresses.delta[key],
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
const typeOther = entries(utxoCohorts.type)
|
||||
const typeOther = entries(SPENDABLE_TYPE_NAMES)
|
||||
.filter(([key]) => !isAddressable(key))
|
||||
.map(([key, tree], i, arr) => {
|
||||
const names = SPENDABLE_TYPE_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: names.short,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
.map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: names.short,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.type[key],
|
||||
}));
|
||||
|
||||
// Class cohorts
|
||||
const class_ = entries(utxoCohorts.class)
|
||||
const class_ = entries(CLASS_NAMES)
|
||||
.reverse()
|
||||
.map(([key, tree], i, arr) => {
|
||||
const names = CLASS_NAMES[key];
|
||||
return {
|
||||
name: names.short,
|
||||
title: names.long,
|
||||
color: colors.at(i, arr.length),
|
||||
tree,
|
||||
};
|
||||
});
|
||||
.map(([key, names], i, arr) => ({
|
||||
name: names.short,
|
||||
title: names.long,
|
||||
color: colors.at(i, arr.length),
|
||||
tree: utxoCohorts.class[key],
|
||||
}));
|
||||
|
||||
return {
|
||||
cohortAll,
|
||||
termShort,
|
||||
termLong,
|
||||
upToDate,
|
||||
fromDate,
|
||||
dateRange,
|
||||
underAge,
|
||||
overAge,
|
||||
ageRange,
|
||||
epoch,
|
||||
utxosAboveAmount,
|
||||
addressesAboveAmount,
|
||||
utxosOverAmount,
|
||||
addressesOverAmount,
|
||||
utxosUnderAmount,
|
||||
addressesUnderAmount,
|
||||
utxosAmountRanges,
|
||||
addressesAmountRanges,
|
||||
utxosAmountRange,
|
||||
addressesAmountRange,
|
||||
typeAddressable,
|
||||
typeOther,
|
||||
class: class_,
|
||||
|
||||
@@ -211,7 +211,7 @@ function singleAddressCountChart(cohort, title) {
|
||||
title: title("Address Count"),
|
||||
bottom: [
|
||||
line({
|
||||
metric: cohort.addrCount.count,
|
||||
metric: cohort.addressCount.inner,
|
||||
name: "Address Count",
|
||||
color: cohort.color,
|
||||
unit: Unit.count,
|
||||
@@ -299,7 +299,7 @@ function createSingleUtxoCount30dChangeSeries(cohort) {
|
||||
function createSingleAddrCount30dChangeSeries(cohort) {
|
||||
return [
|
||||
baseline({
|
||||
metric: cohort.addrCount._30dChange,
|
||||
metric: cohort.addressCount.delta.change._1m,
|
||||
name: "30d Change",
|
||||
unit: Unit.count,
|
||||
}),
|
||||
@@ -580,8 +580,8 @@ export function createGroupedHoldingsSectionAddress({ list, all, title }) {
|
||||
{
|
||||
name: "Address Count",
|
||||
title: title("Address Count"),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addrCount }) =>
|
||||
line({ metric: addrCount.count, name, color, unit: Unit.count }),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addressCount }) =>
|
||||
line({ metric: addressCount.inner, name, color, unit: Unit.count }),
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -592,9 +592,9 @@ export function createGroupedHoldingsSectionAddress({ list, all, title }) {
|
||||
{
|
||||
name: "Address Count",
|
||||
title: title("Address Count 30d Change"),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addrCount }) =>
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addressCount }) =>
|
||||
baseline({
|
||||
metric: addrCount._30dChange,
|
||||
metric: addressCount.delta.change._1m,
|
||||
name,
|
||||
unit: Unit.count,
|
||||
color,
|
||||
@@ -706,8 +706,8 @@ export function createGroupedHoldingsSectionAddressAmount({
|
||||
{
|
||||
name: "Address Count",
|
||||
title: title("Address Count"),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addrCount }) =>
|
||||
line({ metric: addrCount.count, name, color, unit: Unit.count }),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addressCount }) =>
|
||||
line({ metric: addressCount.inner, name, color, unit: Unit.count }),
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -718,9 +718,9 @@ export function createGroupedHoldingsSectionAddressAmount({
|
||||
{
|
||||
name: "Address Count",
|
||||
title: title("Address Count 30d Change"),
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addrCount }) =>
|
||||
bottom: mapCohortsWithAll(list, all, ({ name, color, addressCount }) =>
|
||||
baseline({
|
||||
metric: addrCount._30dChange,
|
||||
metric: addressCount.delta.change._1m,
|
||||
name,
|
||||
unit: Unit.count,
|
||||
color,
|
||||
|
||||
@@ -39,16 +39,16 @@ export function createPartialOptions() {
|
||||
cohortAll,
|
||||
termShort,
|
||||
termLong,
|
||||
upToDate,
|
||||
fromDate,
|
||||
dateRange,
|
||||
underAge,
|
||||
overAge,
|
||||
ageRange,
|
||||
epoch,
|
||||
utxosAboveAmount,
|
||||
addressesAboveAmount,
|
||||
utxosOverAmount,
|
||||
addressesOverAmount,
|
||||
utxosUnderAmount,
|
||||
addressesUnderAmount,
|
||||
utxosAmountRanges,
|
||||
addressesAmountRanges,
|
||||
utxosAmountRange,
|
||||
addressesAmountRange,
|
||||
typeAddressable,
|
||||
typeOther,
|
||||
class: class_,
|
||||
@@ -99,11 +99,11 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedCohortFolderWithAdjusted({
|
||||
name: "Compare",
|
||||
title: "Max Age",
|
||||
list: upToDate,
|
||||
title: "Under Age",
|
||||
list: underAge,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...upToDate.map(createCohortFolderWithAdjusted),
|
||||
...underAge.map(createCohortFolderWithAdjusted),
|
||||
],
|
||||
},
|
||||
// Older Than (≥ X old)
|
||||
@@ -112,11 +112,11 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedCohortFolderBasicWithMarketCap({
|
||||
name: "Compare",
|
||||
title: "Min Age",
|
||||
list: fromDate,
|
||||
title: "Over Age",
|
||||
list: overAge,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...fromDate.map(createCohortFolderBasicWithMarketCap),
|
||||
...overAge.map(createCohortFolderBasicWithMarketCap),
|
||||
],
|
||||
},
|
||||
// Range
|
||||
@@ -126,10 +126,10 @@ export function createPartialOptions() {
|
||||
createGroupedCohortFolderAgeRange({
|
||||
name: "Compare",
|
||||
title: "Age Ranges",
|
||||
list: dateRange,
|
||||
list: ageRange,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...dateRange.map(createCohortFolderAgeRange),
|
||||
...ageRange.map(createCohortFolderAgeRange),
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -145,7 +145,7 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedCohortFolderBasicWithMarketCap({
|
||||
name: "Compare",
|
||||
title: "Max Size",
|
||||
title: "Over Amount",
|
||||
list: utxosUnderAmount,
|
||||
all: cohortAll,
|
||||
}),
|
||||
@@ -158,11 +158,11 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedCohortFolderBasicWithMarketCap({
|
||||
name: "Compare",
|
||||
title: "Min Size",
|
||||
list: utxosAboveAmount,
|
||||
title: "Under Amount",
|
||||
list: utxosOverAmount,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...utxosAboveAmount.map(createCohortFolderBasicWithMarketCap),
|
||||
...utxosOverAmount.map(createCohortFolderBasicWithMarketCap),
|
||||
],
|
||||
},
|
||||
// Range
|
||||
@@ -171,11 +171,11 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedCohortFolderBasicWithoutMarketCap({
|
||||
name: "Compare",
|
||||
title: "Size Ranges",
|
||||
list: utxosAmountRanges,
|
||||
title: "Amount Ranges",
|
||||
list: utxosAmountRange,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...utxosAmountRanges.map(createCohortFolderBasicWithoutMarketCap),
|
||||
...utxosAmountRange.map(createCohortFolderBasicWithoutMarketCap),
|
||||
],
|
||||
},
|
||||
],
|
||||
@@ -191,7 +191,7 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedAddressCohortFolder({
|
||||
name: "Compare",
|
||||
title: "Max Balance",
|
||||
title: "Over Balance",
|
||||
list: addressesUnderAmount,
|
||||
all: cohortAll,
|
||||
}),
|
||||
@@ -204,11 +204,11 @@ export function createPartialOptions() {
|
||||
tree: [
|
||||
createGroupedAddressCohortFolder({
|
||||
name: "Compare",
|
||||
title: "Min Balance",
|
||||
list: addressesAboveAmount,
|
||||
title: "Under Balance",
|
||||
list: addressesOverAmount,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...addressesAboveAmount.map(createAddressCohortFolder),
|
||||
...addressesOverAmount.map(createAddressCohortFolder),
|
||||
],
|
||||
},
|
||||
// Range
|
||||
@@ -218,10 +218,10 @@ export function createPartialOptions() {
|
||||
createGroupedAddressCohortFolder({
|
||||
name: "Compare",
|
||||
title: "Balance Ranges",
|
||||
list: addressesAmountRanges,
|
||||
list: addressesAmountRange,
|
||||
all: cohortAll,
|
||||
}),
|
||||
...addressesAmountRanges.map(createAddressCohortFolder),
|
||||
...addressesAmountRange.map(createAddressCohortFolder),
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -434,9 +434,9 @@ export function statsAtWindow(pattern, window) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Rolling folder tree from a _1y24h30d7dPattern (4 rolling windows)
|
||||
* Create a Rolling folder tree from a _1m1w1y24hPattern (4 rolling windows)
|
||||
* @param {Object} args
|
||||
* @param {{ _24h: AnyMetricPattern, _7d: AnyMetricPattern, _30d: AnyMetricPattern, _1y: AnyMetricPattern }} args.windows
|
||||
* @param {{ _24h: AnyMetricPattern, _1w: AnyMetricPattern, _1m: AnyMetricPattern, _1y: AnyMetricPattern }} args.windows
|
||||
* @param {string} args.title
|
||||
* @param {Unit} args.unit
|
||||
* @returns {PartialOptionsGroup}
|
||||
@@ -450,8 +450,8 @@ export function rollingWindowsTree({ windows, title, unit }) {
|
||||
title: `${title} Rolling`,
|
||||
bottom: [
|
||||
line({ metric: windows._24h, name: "24h", color: colors.time._24h, unit }),
|
||||
line({ metric: windows._7d, name: "7d", color: colors.time._1w, unit }),
|
||||
line({ metric: windows._30d, name: "30d", color: colors.time._1m, unit }),
|
||||
line({ metric: windows._1w, name: "7d", color: colors.time._1w, unit }),
|
||||
line({ metric: windows._1m, name: "30d", color: colors.time._1m, unit }),
|
||||
line({ metric: windows._1y, name: "1y", color: colors.time._1y, unit }),
|
||||
],
|
||||
},
|
||||
@@ -463,12 +463,12 @@ export function rollingWindowsTree({ windows, title, unit }) {
|
||||
{
|
||||
name: "7d",
|
||||
title: `${title} 7d`,
|
||||
bottom: [line({ metric: windows._7d, name: "7d", color: colors.time._1w, unit })],
|
||||
bottom: [line({ metric: windows._1w, name: "7d", color: colors.time._1w, unit })],
|
||||
},
|
||||
{
|
||||
name: "30d",
|
||||
title: `${title} 30d`,
|
||||
bottom: [line({ metric: windows._30d, name: "30d", color: colors.time._1m, unit })],
|
||||
bottom: [line({ metric: windows._1m, name: "30d", color: colors.time._1m, unit })],
|
||||
},
|
||||
{
|
||||
name: "1y",
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
* @property {string} title
|
||||
* @property {Color} color
|
||||
* @property {PatternAll} tree
|
||||
* @property {Brk._30dCountPattern} addrCount
|
||||
* @property {Brk.DeltaInnerPattern} addressCount
|
||||
*
|
||||
* Full cohort: adjustedSopr + percentiles + RelToMarketCap (term.short)
|
||||
* @typedef {Object} CohortFull
|
||||
@@ -260,7 +260,7 @@
|
||||
* ============================================================================
|
||||
*
|
||||
* Addressable cohort with address count (for "type" cohorts - no RelToMarketCap)
|
||||
* @typedef {CohortBasicWithoutMarketCap & { addrCount: Brk._30dCountPattern }} CohortAddress
|
||||
* @typedef {CohortBasicWithoutMarketCap & { addressCount: Brk.DeltaInnerPattern }} CohortAddress
|
||||
*
|
||||
* ============================================================================
|
||||
* Cohort Group Types (by capability)
|
||||
@@ -328,7 +328,7 @@
|
||||
* @property {string} title
|
||||
* @property {Color} color
|
||||
* @property {AddressCohortPattern} tree
|
||||
* @property {Brk._30dCountPattern} addrCount
|
||||
* @property {Brk.DeltaInnerPattern} addressCount
|
||||
*
|
||||
* @typedef {UtxoCohortObject | AddressCohortObject | CohortWithoutRelative} CohortObject
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user