{t("send_to", {
- amount: formatAmount(swap().expectedAmount),
+ amount: formatAmount(
+ BigNumber(swap().expectedAmount),
+ denomination(),
+ ),
denomination:
denomination() === denominations.sat
? "sats"
@@ -78,7 +82,7 @@ const InvoiceSet = () => {
class="btn"
onclick={() =>
clipboard(
- formatAmount(swap().expectedAmount),
+ formatAmount(swap().expectedAmount, denomination()),
t("copied"),
)
}>
diff --git a/src/status/SwapCreated.tsx b/src/status/SwapCreated.tsx
index b65d5532..9df98704 100644
--- a/src/status/SwapCreated.tsx
+++ b/src/status/SwapCreated.tsx
@@ -1,3 +1,4 @@
+import { BigNumber } from "bignumber.js";
import log from "loglevel";
import { Show } from "solid-js";
@@ -21,7 +22,10 @@ const SwapCreated = () => {
{t("pay_invoice_to", {
- amount: formatAmount(swap().sendAmount),
+ amount: formatAmount(
+ BigNumber(swap().sendAmount),
+ denomination(),
+ ),
denomination:
denomination() === denominations.sat ? "sats" : BTC,
})}
diff --git a/src/utils/denomination.ts b/src/utils/denomination.ts
index a84199d2..d8be0076 100644
--- a/src/utils/denomination.ts
+++ b/src/utils/denomination.ts
@@ -1,7 +1,5 @@
import { BigNumber } from "bignumber.js";
-import { denomination, maximum } from "../signals";
-
export const satFactor = 100_000_000;
export const denominations = {
@@ -9,30 +7,34 @@ export const denominations = {
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);
}
@@ -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;
diff --git a/src/utils/validation.ts b/src/utils/validation.ts
index ce38a64b..62ee9e42 100644
--- a/src/utils/validation.ts
+++ b/src/utils/validation.ts
@@ -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";
@@ -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)
);
};
diff --git a/tests/components/ClickableAmount.spec.jsx b/tests/components/ClickableAmount.spec.tsx
similarity index 62%
rename from tests/components/ClickableAmount.spec.jsx
rename to tests/components/ClickableAmount.spec.tsx
index 7b710838..3cd9dd30 100644
--- a/tests/components/ClickableAmount.spec.jsx
+++ b/tests/components/ClickableAmount.spec.tsx
@@ -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";
@@ -10,18 +11,15 @@ describe("ClickableAmount", () => {
test("should show label when defined", async () => {
const label = "min";
const { container } = render(() => (
- 1} />
+ false}
+ amount={() => 1}
+ />
));
expect(container.innerHTML.startsWith(t(label))).toBeTruthy();
});
- test("should not show label when undefined", async () => {
- const { container } = render(() => (
- 1} />
- ));
- expect(container.innerHTML.startsWith(" {
`("should format amount $denomination", ({ denomination }) => {
setDenomination(denomination);
- const amount = 1_000_00;
+ const amount = BigNumber(1_000_00);
const { container } = render(() => (
- amount} />
+ 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`
@@ -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(() => (
- amount} onClick={callback} />
+ amount}
+ />
));
- fireEvent.click(container.childNodes[0]);
+ const child = container.children[0];
+ fireEvent.click(child);
expect(callback).toHaveBeenCalledTimes(1);
expect(callback).toHaveBeenCalledWith(amount);
diff --git a/tests/utils/denomination.spec.ts b/tests/utils/denomination.spec.ts
index 1f61d90a..aa0fc6a2 100644
--- a/tests/utils/denomination.spec.ts
+++ b/tests/utils/denomination.spec.ts
@@ -1,3 +1,4 @@
+import { BigNumber } from "bignumber.js";
import { beforeAll, describe, expect, test } from "vitest";
import { setDenomination, setMaximum } from "../../src/signals";
@@ -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);
},
);
});
@@ -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,
+ );
},
);
});
@@ -67,7 +72,7 @@ describe("denomination utils", () => {
({ denomination, digits, amount }) => {
setMaximum(amount);
setDenomination(denomination);
- expect(calculateDigits()).toEqual(digits);
+ expect(calculateDigits(amount, denomination)).toEqual(digits);
},
);
});
@@ -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);
},
);