Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: denomination.ts #420

Merged
merged 3 commits into from
Jan 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/components/Fees.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BigNumber } from "bignumber.js";
import { createEffect } from "solid-js";

import btcSvg from "../assets/btc.svg";
Expand Down Expand Up @@ -76,15 +77,19 @@ const Fees = () => {
<label>
{t("network_fee")}:{" "}
<span class="network-fee">
{formatAmount(minerFee(), true)}
{formatAmount(BigNumber(minerFee()), denomination(), true)}
<span
class="denominator"
data-denominator={denomination()}></span>
</span>
<br />
{t("fee")} ({boltzFee()}%):{" "}
<span class="boltz-fee">
{formatAmount(calculateBoltzFeeOnSend(sendAmount()), true)}
{formatAmount(
BigNumber(calculateBoltzFeeOnSend(sendAmount())),
denomination(),
true,
)}
<span
class="denominator"
data-denominator={denomination()}></span>
Expand Down
39 changes: 25 additions & 14 deletions src/pages/Create.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ const Create = () => {
const changeReceiveAmount = (evt: InputEvent) => {
const target = evt.currentTarget as HTMLInputElement;
const amount = target.value.trim();
const satAmount = convertAmount(Number(amount), denomination());
const sendAmount = calculateSendAmount(satAmount);
const satAmount = convertAmount(BigNumber(amount), denomination());
const sendAmount = calculateSendAmount(satAmount.toNumber());
setAmountChanged(sideReceive);
setReceiveAmount(BigNumber(satAmount));
setSendAmount(BigNumber(sendAmount));
Expand All @@ -77,8 +77,8 @@ const Create = () => {
const changeSendAmount = (evt: InputEvent) => {
const target = evt.currentTarget as HTMLInputElement;
const amount = target.value.trim();
const satAmount = convertAmount(Number(amount), denomination());
const receiveAmount = calculateReceiveAmount(satAmount);
const satAmount = convertAmount(BigNumber(amount), denomination());
const receiveAmount = calculateReceiveAmount(satAmount.toNumber());
setAmountChanged(sideSend);
setSendAmount(BigNumber(satAmount));
setReceiveAmount(BigNumber(receiveAmount));
Expand Down Expand Up @@ -111,7 +111,7 @@ const Create = () => {
const validatePaste = (evt: ClipboardEvent) => {
const clipboardData = evt.clipboardData || globalThis.clipboardData;
const pastedData = clipboardData.getData("Text").trim();
if (!getValidationRegex().test(pastedData)) {
if (!getValidationRegex(maximum(), denomination()).test(pastedData)) {
evt.stopPropagation();
evt.preventDefault();
}
Expand All @@ -136,7 +136,10 @@ const Create = () => {

if (lessThanMin || amount > maximum()) {
const params = {
amount: formatAmount(lessThanMin ? minimum() : maximum()),
amount: formatAmount(
BigNumber(lessThanMin ? minimum() : maximum()),
denomination(),
),
denomination: denomination(),
};
const label = lessThanMin ? "minimum_amount" : "maximum_amount";
Expand Down Expand Up @@ -188,11 +191,15 @@ const Create = () => {
createMemo(() => {
const rAmount = Number(receiveAmount());
if (rAmount > 0) {
setReceiveAmountFormatted(formatAmount(rAmount).toString());
setReceiveAmountFormatted(
formatAmount(BigNumber(rAmount), denomination()).toString(),
);
}
const sAmount = Number(sendAmount());
if (sAmount > 0) {
setSendAmountFormatted(formatAmount(sAmount).toString());
setSendAmountFormatted(
formatAmount(BigNumber(sAmount), denomination()).toString(),
);
}
});

Expand Down Expand Up @@ -234,13 +241,13 @@ const Create = () => {
<span
onClick={() => setAmount(minimum())}
class="btn-small btn-light">
{formatAmount(minimum())}
{formatAmount(BigNumber(minimum()), denomination())}
</span>{" "}
{t("max")}:{" "}
<span
onClick={() => setAmount(maximum())}
class="btn-small btn-light">
{formatAmount(maximum())}
{formatAmount(BigNumber(maximum()), denomination())}
</span>{" "}
</p>
<div class="icons">
Expand All @@ -251,8 +258,11 @@ const Create = () => {
autofocus
required
type="text"
placeholder={formatAmount(minimum())}
maxlength={calculateDigits()}
placeholder={formatAmount(
BigNumber(minimum()),
denomination(),
)}
maxlength={calculateDigits(maximum(), denomination())}
inputmode={
denomination() == "btc" ? "decimal" : "numeric"
}
Expand All @@ -276,9 +286,10 @@ const Create = () => {
required
type="text"
placeholder={formatAmount(
calculateReceiveAmount(minimum()),
BigNumber(calculateReceiveAmount(minimum())),
denomination(),
)}
maxlength={calculateDigits()}
maxlength={calculateDigits(maximum(), denomination())}
inputmode={
denomination() == "btc" ? "decimal" : "numeric"
}
Expand Down
8 changes: 6 additions & 2 deletions src/status/InvoiceSet.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BigNumber } from "bignumber.js";
import { Show } from "solid-js";

import ContractTransaction from "../components/ContractTransaction";
Expand Down Expand Up @@ -48,7 +49,10 @@ const InvoiceSet = () => {
<div>
<h2>
{t("send_to", {
amount: formatAmount(swap().expectedAmount),
amount: formatAmount(
BigNumber(swap().expectedAmount),
denomination(),
),
denomination:
denomination() === denominations.sat
? "sats"
Expand Down Expand Up @@ -78,7 +82,7 @@ const InvoiceSet = () => {
class="btn"
onclick={() =>
clipboard(
formatAmount(swap().expectedAmount),
formatAmount(swap().expectedAmount, denomination()),
t("copied"),
)
}>
Expand Down
6 changes: 5 additions & 1 deletion src/status/SwapCreated.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BigNumber } from "bignumber.js";
import log from "loglevel";
import { Show } from "solid-js";

Expand All @@ -21,7 +22,10 @@ const SwapCreated = () => {
<div>
<h2>
{t("pay_invoice_to", {
amount: formatAmount(swap().sendAmount),
amount: formatAmount(
BigNumber(swap().sendAmount),
denomination(),
),
denomination:
denomination() === denominations.sat ? "sats" : BTC,
})}
Expand Down
42 changes: 23 additions & 19 deletions src/utils/denomination.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,40 @@
import { BigNumber } from "bignumber.js";

import { denomination, maximum } from "../signals";

export const satFactor = 100_000_000;

export const denominations = {
sat: "sat",
btc: "btc",
};

export const getValidationRegex = (): RegExp => {
const digits = calculateDigits();
export const getValidationRegex = (
maximum: number,
denomination: string,
): RegExp => {
const digits = calculateDigits(maximum, denomination);
const regex =
denomination() === denominations.sat
denomination === denominations.sat
? `^[0-9]{1,${digits}}$`
: `^[0-9](.[0-9]{1,${digits}}){0,1}$`;
return new RegExp(regex);
};

export const formatAmount = (
amount: number,
amount: BigNumber,
denomination: string,
fixed: boolean = false,
): string => {
return formatAmountDenomination(denomination(), amount, fixed);
return formatAmountDenomination(amount, denomination, fixed);
};

export const formatAmountDenomination = (
denom: string,
amount: number,
amount: BigNumber,
denomination: string,
fixed: boolean = false,
): string => {
switch (denom) {
switch (denomination) {
case denominations.btc:
const amountBig = new BigNumber(amount).div(satFactor);
const amountBig = amount.div(satFactor);
if (fixed) {
return amountBig.toFixed(8);
}
Expand All @@ -53,20 +55,22 @@ export const formatAmountDenomination = (
}
};

export const convertAmount = (amount: number, denom: string): number => {
export const convertAmount = (amount: BigNumber, denom: string): BigNumber => {
switch (denom) {
case denominations.btc:
const amountBig = new BigNumber(amount).multipliedBy(satFactor);
return amountBig.toNumber();

const amountBig = amount.multipliedBy(satFactor);
return amountBig;
default:
return Number(amount);
return amount;
}
};

export const calculateDigits = () => {
let digits = maximum().toString().length;
if (denomination() === denominations.btc && digits < 10) {
export const calculateDigits = (
maximum: number,
denomination: string,
): number => {
let digits = maximum.toString().length;
if (denomination === denominations.btc && digits < 10) {
digits = 10;
} else {
digits += 1;
Expand Down
3 changes: 2 additions & 1 deletion src/utils/validation.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BigNumber } from "bignumber.js";
import { crypto, script } from "bitcoinjs-lib";
import { Scripts, reverseSwapScript, swapScript } from "boltz-core";
import { deployedBytecode as EtherSwapBytecode } from "boltz-core/out/EtherSwap.sol/EtherSwap.json";
Expand Down Expand Up @@ -180,7 +181,7 @@ const validateSwap = async (

return (
new URLSearchParams(bip21Split[1]).get("amount") ===
formatAmountDenomination(denominations.btc, swap.sendAmount)
formatAmountDenomination(BigNumber(swap.sendAmount), denominations.btc)
);
};

Expand Down
13 changes: 9 additions & 4 deletions tests/utils/denomination.spec.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { BigNumber } from "bignumber.js";
import { beforeAll, describe, expect, test } from "vitest";

import { setDenomination, setMaximum } from "../../src/signals";
Expand All @@ -21,7 +22,9 @@ describe("denomination utils", () => {
`(
"convert $amount in $denomination",
({ denomination, amount, converted }) => {
expect(convertAmount(amount, denomination)).toEqual(converted);
expect(
convertAmount(BigNumber(amount), denomination).toNumber(),
).toEqual(converted);
},
);
});
Expand All @@ -42,7 +45,9 @@ describe("denomination utils", () => {
"format $amount in $denomination",
({ denomination, amount, formatted }) => {
setDenomination(denomination);
expect(formatAmount(amount)).toEqual(formatted);
expect(formatAmount(BigNumber(amount), denomination)).toEqual(
formatted,
);
},
);
});
Expand All @@ -67,7 +72,7 @@ describe("denomination utils", () => {
({ denomination, digits, amount }) => {
setMaximum(amount);
setDenomination(denomination);
expect(calculateDigits()).toEqual(digits);
expect(calculateDigits(amount, denomination)).toEqual(digits);
},
);
});
Expand Down Expand Up @@ -98,7 +103,7 @@ describe("denomination utils", () => {
"validating regex for $amount in $denomination",
({ denomination, amount, valid }) => {
setDenomination(denomination);
let regex = getValidationRegex();
let regex = getValidationRegex(max, denomination);
expect(regex.test(amount)).toEqual(valid);
},
);
Expand Down