diff --git a/web-wallet/src/lib/components/Allocate/Allocate.svelte b/web-wallet/src/lib/components/Allocate/Allocate.svelte index bbba78145..134f1bacf 100644 --- a/web-wallet/src/lib/components/Allocate/Allocate.svelte +++ b/web-wallet/src/lib/components/Allocate/Allocate.svelte @@ -84,7 +84,7 @@ }); $: luxFee = gasLimit * gasPrice; - $: fee = formatter(luxToDusk(luxFee)); + $: fee = formatter(luxToDusk(BigInt(luxFee))); $: isFromUnshielded = shieldedAmount > shieldedBalance; $: isFromShielded = unshieldedAmount > unshieldedBalance; $: isNextButtonDisabled = !(isFromUnshielded || isFromShielded); @@ -229,8 +229,8 @@
{isFromUnshielded - ? `${formatter(luxToDusk(unshieldedBalance - BigInt(duskToLux(unshieldedAmount))))} DUSK` - : `${formatter(luxToDusk(shieldedBalance - BigInt(duskToLux(shieldedAmount))))} DUSK`} + ? `${formatter(luxToDusk(unshieldedBalance - duskToLux(unshieldedAmount)))} DUSK` + : `${formatter(luxToDusk(shieldedBalance - duskToLux(shieldedAmount)))} DUSK`} = minAmount && amount <= maxSpendable; - $: totalLuxFee = luxFee + (amount ? duskToLux(amount) : 0); - $: isFeeWithinLimit = BigInt(totalLuxFee) <= spendable; + $: totalLuxFee = BigInt(luxFee) + (amount ? duskToLux(amount) : 0n); + $: isFeeWithinLimit = totalLuxFee <= spendable; $: isNextButtonDisabled = !(isAmountValid && isGasValid && isFeeWithinLimit); $: addressValidationResult = validateAddress(address); diff --git a/web-wallet/src/lib/components/Stake/Stake.svelte b/web-wallet/src/lib/components/Stake/Stake.svelte index e0fe0d000..d07c1a095 100644 --- a/web-wallet/src/lib/components/Stake/Stake.svelte +++ b/web-wallet/src/lib/components/Stake/Stake.svelte @@ -125,7 +125,7 @@ }); $: luxFee = gasLimit * gasPrice; - $: fee = formatter(luxToDusk(luxFee)); + $: fee = formatter(luxToDusk(BigInt(luxFee))); $: maxSpendable = deductLuxFeeFrom(luxToDusk(spendable), luxFee); $: minStake = maxSpendable > 0 @@ -133,8 +133,8 @@ : minAllowedStake; $: isStakeAmountValid = stakeAmount >= minStake && stakeAmount <= maxSpendable; - $: totalLuxFee = luxFee + duskToLux(stakeAmount); - $: isFeeWithinLimit = BigInt(totalLuxFee) <= spendable; + $: totalLuxFee = BigInt(luxFee) + duskToLux(stakeAmount); + $: isFeeWithinLimit = totalLuxFee <= spendable; $: isNextButtonDisabled = flow === "stake" ? !(isStakeAmountValid && isGasValid && isFeeWithinLimit) diff --git a/web-wallet/src/lib/contracts/deductLuxFeeFrom.js b/web-wallet/src/lib/contracts/deductLuxFeeFrom.js index 651ba81a3..bcdd173fe 100644 --- a/web-wallet/src/lib/contracts/deductLuxFeeFrom.js +++ b/web-wallet/src/lib/contracts/deductLuxFeeFrom.js @@ -11,6 +11,6 @@ import { duskToLux, luxToDusk } from "$lib/dusk/currency"; * @returns {number} */ const deductLuxFeeFrom = (duskAmount, luxFee) => - +luxToDusk(duskToLux(duskAmount) - luxFee).toFixed(9); + +luxToDusk(duskToLux(duskAmount) - BigInt(luxFee)).toFixed(9); export default deductLuxFeeFrom; diff --git a/web-wallet/src/lib/contracts/executeSend.js b/web-wallet/src/lib/contracts/executeSend.js index f7603dedf..0e8a49b55 100644 --- a/web-wallet/src/lib/contracts/executeSend.js +++ b/web-wallet/src/lib/contracts/executeSend.js @@ -2,25 +2,7 @@ import { getKey } from "lamb"; import { Gas } from "$lib/vendor/w3sper.js/src/mod"; import { walletStore } from "$lib/stores"; - -const scaleFactor = BigInt(1e9); - -/** - * This `duskToLux` function will replace the one - * in `$lib/dusk/currency` when the migration to - * `w3sper.js` advances. - * - * @param {number} n - * @returns {bigint} - */ -function duskToLux(n) { - const [integerPart, decimalPart] = n.toString().split("."); - - return ( - BigInt(integerPart) * scaleFactor + - (decimalPart ? BigInt(decimalPart.padEnd(9, "0")) : 0n) - ); -} +import { duskToLux } from "$lib/dusk/currency"; /** @type {(to: string, amount: number, gasPrice:number, gasLimit:number) => Promise} */ const executeSend = (to, amount, gasPrice, gasLimit) => { diff --git a/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js b/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js index 51a8a549b..d7b849785 100644 --- a/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js +++ b/web-wallet/src/lib/dusk/currency/__tests__/duskToLux.spec.js @@ -4,7 +4,7 @@ import { duskToLux } from ".."; describe("duskToLux", () => { it("should convert an amount in Dusk to Lux", () => { - expect(duskToLux(1)).toBe(1e9); - expect(duskToLux(3_456_789.012)).toBe(3_456_789_012_000_000); + expect(duskToLux(1)).toBe(BigInt(1e9)); + expect(duskToLux(3_456_789.012)).toBe(BigInt(3_456_789_012_000_000)); }); }); diff --git a/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js b/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js index 8c15f4703..53803e8d9 100644 --- a/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js +++ b/web-wallet/src/lib/dusk/currency/__tests__/luxToDusk.spec.js @@ -3,12 +3,7 @@ import { describe, expect, it } from "vitest"; import { luxToDusk } from ".."; describe("luxToDusk", () => { - it("should convert a number amount in Lux to Dusk", () => { - expect(luxToDusk(1e9)).toBe(1); - expect(luxToDusk(123_456_789_012)).toBe(123.456789012); - }); - - it("should accept `BigInt`s as input", () => { + it("should take a lux value, as a bigInt, and return Dusk (as a number)", () => { expect(luxToDusk(BigInt(1e9))).toBe(1); expect(luxToDusk(123_456_789_012n)).toBe(123.456789012); }); diff --git a/web-wallet/src/lib/dusk/currency/duskToLux.js b/web-wallet/src/lib/dusk/currency/duskToLux.js index 01457c7ff..d7805d9f9 100644 --- a/web-wallet/src/lib/dusk/currency/duskToLux.js +++ b/web-wallet/src/lib/dusk/currency/duskToLux.js @@ -1,10 +1,16 @@ +const scaleFactor = BigInt(1e9); + /** - * Temporary conversion function until - * `dusk-wallet-js` exposes its own. - * * @param {number} n - * @returns {number} + * @returns {bigint} */ -const duskToLux = (n) => n * 1e9; +function duskToLux(n) { + const [integerPart, decimalPart] = n.toString().split("."); + + return ( + BigInt(integerPart) * scaleFactor + + (decimalPart ? BigInt(decimalPart.padEnd(9, "0")) : 0n) + ); +} export default duskToLux; diff --git a/web-wallet/src/lib/dusk/currency/luxToDusk.js b/web-wallet/src/lib/dusk/currency/luxToDusk.js index 1e9700a86..9a13f9430 100644 --- a/web-wallet/src/lib/dusk/currency/luxToDusk.js +++ b/web-wallet/src/lib/dusk/currency/luxToDusk.js @@ -1,8 +1,3 @@ -import { isType } from "lamb"; - -/** @type {(n: any) => n is number} */ -const isNumber = isType("Number"); - const scaleFactorAsNumber = 1e9; const scaleFactorAsBigInt = BigInt(scaleFactorAsNumber); @@ -10,18 +5,14 @@ const scaleFactorAsBigInt = BigInt(scaleFactorAsNumber); * Temporary conversion: in the near future * we will accept only BigInt as input. * - * @param {bigint | number} n + * @param {bigint} n * @returns {number} */ function luxToDusk(n) { - if (isNumber(n)) { - return n / scaleFactorAsNumber; - } else { - const integerPart = Number(n / scaleFactorAsBigInt); - const decimalPart = Number(n % scaleFactorAsBigInt); + const integerPart = Number(n / scaleFactorAsBigInt); + const decimalPart = Number(n % scaleFactorAsBigInt); - return integerPart + decimalPart / scaleFactorAsNumber; - } + return integerPart + decimalPart / scaleFactorAsNumber; } export default luxToDusk;