Skip to content

Commit

Permalink
refactor: denomination.ts
Browse files Browse the repository at this point in the history
dont use signals here
use BigNumber when possible
move clockableamount spec to ts
  • Loading branch information
dni committed Jan 4, 2024
1 parent b31bc7d commit 0e4ce18
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 56 deletions.
35 changes: 23 additions & 12 deletions src/Create.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,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 @@ -74,8 +74,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 @@ -108,7 +108,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 @@ -133,7 +133,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 @@ -185,11 +188,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 @@ -247,8 +254,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 @@ -272,9 +282,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
4 changes: 3 additions & 1 deletion src/components/ClickableAmount.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { BigNumber } from "bignumber.js";
import { Show } from "solid-js";

import t from "../i18n";
import { denomination } from "../signals";
import { formatAmount } from "../utils/denomination";

const ClickableAmount = ({ label, onClick, amount }) => {
return (
<>
<Show when={label !== undefined}>{t(label)}: </Show>
<span onClick={() => onClick(amount())} class="btn-small btn-light">
{formatAmount(amount())}
{formatAmount(BigNumber(amount()), denomination())}
</span>
</>
);
Expand Down
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
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
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { fireEvent, render } from "@solidjs/testing-library";
import { BigNumber } from "bignumber.js";
import { describe, expect, test, vitest } from "vitest";

import ClickableAmount from "../../src/components/ClickableAmount";
Expand All @@ -10,30 +11,32 @@ describe("ClickableAmount", () => {
test("should show label when defined", async () => {
const label = "min";
const { container } = render(() => (
<ClickableAmount label={label} amount={() => 1} />
<ClickableAmount
label={label}
onClick={() => false}
amount={() => 1}
/>
));
expect(container.innerHTML.startsWith(t(label))).toBeTruthy();
});

test("should not show label when undefined", async () => {
const { container } = render(() => (
<ClickableAmount amount={() => 1} />
));
expect(container.innerHTML.startsWith("<span")).toBeTruthy();
});

test.each`
denomination
${denominations.btc}
${denominations.sat}
`("should format amount $denomination", ({ denomination }) => {
setDenomination(denomination);

const amount = 1_000_00;
const amount = BigNumber(1_000_00);
const { container } = render(() => (
<ClickableAmount amount={() => amount} />
<ClickableAmount
onClick={() => false}
label={"test"}
amount={() => amount}
/>
));
expect(container.childNodes[0].innerHTML).toEqual(formatAmount(amount));
const child = container.children[0];
expect(child.innerHTML).toEqual(formatAmount(amount, denomination));
});

test.each`
Expand All @@ -45,13 +48,18 @@ describe("ClickableAmount", () => {
({ denomination }) => {
setDenomination(denomination);

const amount = 1_000_00;
const amount = BigNumber(1_000_00);
const callback = vitest.fn();

const { container } = render(() => (
<ClickableAmount amount={() => amount} onClick={callback} />
<ClickableAmount
onClick={callback}
label={"test"}
amount={() => amount}
/>
));
fireEvent.click(container.childNodes[0]);
const child = container.children[0];
fireEvent.click(child);

expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(amount);
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

0 comments on commit 0e4ce18

Please sign in to comment.