2019-05-14 18:25:46 -04:00
|
|
|
"use strict";
|
|
|
|
|
|
|
|
import { BigNumber, BigNumberish } from "@ethersproject/bignumber";
|
2019-08-25 02:39:20 -04:00
|
|
|
import { formatFixed, parseFixed } from "@ethersproject/bignumber";
|
2019-05-14 18:25:46 -04:00
|
|
|
|
2019-08-01 18:04:06 -04:00
|
|
|
import { Logger } from "@ethersproject/logger";
|
|
|
|
import { version } from "./_version";
|
|
|
|
const logger = new Logger(version);
|
2019-05-14 18:25:46 -04:00
|
|
|
|
|
|
|
const names = [
|
|
|
|
"wei",
|
|
|
|
"kwei",
|
|
|
|
"mwei",
|
|
|
|
"gwei",
|
|
|
|
"szabo",
|
|
|
|
"finney",
|
|
|
|
"ether",
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
// Some environments have issues with RegEx that contain back-tracking, so we cannot
|
|
|
|
// use them.
|
|
|
|
export function commify(value: string | number): string {
|
2019-11-01 23:33:51 +09:00
|
|
|
const comps = String(value).split(".");
|
2019-05-14 18:25:46 -04:00
|
|
|
|
|
|
|
if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || (comps[1] && !comps[1].match(/^[0-9]*$/)) || value === "." || value === "-.") {
|
2019-08-01 18:04:06 -04:00
|
|
|
logger.throwArgumentError("invalid value", "value", value);
|
2019-05-14 18:25:46 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure we have at least one whole digit (0 if none)
|
|
|
|
let whole = comps[0];
|
|
|
|
|
|
|
|
let negative = "";
|
|
|
|
if (whole.substring(0, 1) === "-") {
|
|
|
|
negative = "-";
|
|
|
|
whole = whole.substring(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure we have at least 1 whole digit with no leading zeros
|
|
|
|
while (whole.substring(0, 1) === "0") { whole = whole.substring(1); }
|
|
|
|
if (whole === "") { whole = "0"; }
|
|
|
|
|
|
|
|
let suffix = "";
|
|
|
|
if (comps.length === 2) { suffix = "." + (comps[1] || "0"); }
|
2020-07-13 07:28:56 -04:00
|
|
|
while (suffix.length > 2 && suffix[suffix.length - 1] === "0") {
|
|
|
|
suffix = suffix.substring(0, suffix.length - 1);
|
|
|
|
}
|
2019-05-14 18:25:46 -04:00
|
|
|
|
2019-11-01 23:33:51 +09:00
|
|
|
const formatted = [];
|
2019-05-14 18:25:46 -04:00
|
|
|
while (whole.length) {
|
|
|
|
if (whole.length <= 3) {
|
|
|
|
formatted.unshift(whole);
|
|
|
|
break;
|
|
|
|
} else {
|
2019-11-01 23:33:51 +09:00
|
|
|
const index = whole.length - 3;
|
2019-05-14 18:25:46 -04:00
|
|
|
formatted.unshift(whole.substring(index));
|
|
|
|
whole = whole.substring(0, index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return negative + formatted.join(",") + suffix;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function formatUnits(value: BigNumberish, unitName?: string | BigNumberish): string {
|
|
|
|
if (typeof(unitName) === "string") {
|
2019-11-01 23:33:51 +09:00
|
|
|
const index = names.indexOf(unitName);
|
2019-05-14 18:25:46 -04:00
|
|
|
if (index !== -1) { unitName = 3 * index; }
|
|
|
|
}
|
|
|
|
return formatFixed(value, (unitName != null) ? unitName: 18);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseUnits(value: string, unitName?: BigNumberish): BigNumber {
|
2020-10-07 19:50:27 -04:00
|
|
|
if (typeof(value) !== "string") {
|
|
|
|
logger.throwArgumentError("value must be a string", "value", value);
|
|
|
|
}
|
2019-05-14 18:25:46 -04:00
|
|
|
if (typeof(unitName) === "string") {
|
2019-11-01 23:33:51 +09:00
|
|
|
const index = names.indexOf(unitName);
|
2019-05-14 18:25:46 -04:00
|
|
|
if (index !== -1) { unitName = 3 * index; }
|
|
|
|
}
|
|
|
|
return parseFixed(value, (unitName != null) ? unitName: 18);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function formatEther(wei: BigNumberish): string {
|
|
|
|
return formatUnits(wei, 18);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function parseEther(ether: string): BigNumber {
|
|
|
|
return parseUnits(ether, 18);
|
|
|
|
}
|
|
|
|
|