solana/explorer/src/utils/index.tsx

93 lines
2.2 KiB
TypeScript
Raw Normal View History

import React, { ReactNode } from "react";
import BN from "bn.js";
import {
HumanizeDuration,
HumanizeDurationLanguage,
} from "humanize-duration-ts";
// Switch to web3 constant when web3 updates superstruct
export const LAMPORTS_PER_SOL = 1000000000;
export const NUM_TICKS_PER_SECOND = 160;
export const DEFAULT_TICKS_PER_SLOT = 64;
export const NUM_SLOTS_PER_SECOND =
NUM_TICKS_PER_SECOND / DEFAULT_TICKS_PER_SLOT;
export const MS_PER_SLOT = 1000 / NUM_SLOTS_PER_SECOND;
2020-04-29 05:48:38 -07:00
export function assertUnreachable(x: never): never {
throw new Error("Unreachable!");
}
2020-04-29 05:48:38 -07:00
export function normalizeTokenAmount(
raw: string | number,
decimals: number
): number {
let rawTokens: number;
if (typeof raw === "string") rawTokens = parseInt(raw);
else rawTokens = raw;
return rawTokens / Math.pow(10, decimals);
}
export function lamportsToSol(lamports: number | BN): number {
if (typeof lamports === "number") {
return Math.abs(lamports) / LAMPORTS_PER_SOL;
}
let signMultiplier = 1;
if (lamports.isNeg()) {
signMultiplier = -1;
}
const absLamports = lamports.abs();
const lamportsString = absLamports.toString(10).padStart(10, "0");
const splitIndex = lamportsString.length - 9;
const solString =
lamportsString.slice(0, splitIndex) +
"." +
lamportsString.slice(splitIndex);
return signMultiplier * parseFloat(solString);
}
2020-05-22 12:09:28 -07:00
export function lamportsToSolString(
lamports: number | BN,
2020-05-22 12:09:28 -07:00
maximumFractionDigits: number = 9
2020-08-01 08:31:39 -07:00
): ReactNode {
const sol = lamportsToSol(lamports);
2020-05-22 12:09:28 -07:00
return (
2020-08-01 08:31:39 -07:00
<>
<span className="text-monospace">
{new Intl.NumberFormat("en-US", { maximumFractionDigits }).format(sol)}
</span>
</>
2020-05-22 12:09:28 -07:00
);
2020-04-29 05:48:38 -07:00
}
const HUMANIZER = new HumanizeDuration(new HumanizeDurationLanguage());
HUMANIZER.setOptions({
language: "short",
spacer: "",
delimiter: " ",
round: true,
units: ["d", "h", "m", "s"],
largest: 3,
});
HUMANIZER.addLanguage("short", {
y: () => "y",
mo: () => "mo",
w: () => "w",
d: () => "d",
h: () => "h",
m: () => "m",
s: () => "s",
ms: () => "ms",
decimal: ".",
});
export function slotsToHumanString(
slots: number,
slotTime = MS_PER_SLOT
): string {
return HUMANIZER.humanize(slots * slotTime);
}