diff --git a/web/cashtab/src/hooks/__tests__/migrations.test.js b/web/cashtab/src/hooks/__tests__/migrations.test.js --- a/web/cashtab/src/hooks/__tests__/migrations.test.js +++ b/web/cashtab/src/hooks/__tests__/migrations.test.js @@ -2,6 +2,7 @@ import BigNumber from 'bignumber.js'; import BCHJS from '@psf/bch-js'; import useBCH from '../useBCH'; +import { fromSmallestDenomination } from '@utils/cashMethods'; describe('Testing functions for upgrading Cashtab', () => { it('Replacement currency.dust parameter parsing matches legacy DUST parameter', () => { @@ -115,4 +116,26 @@ const remainder = new BigNumber('12345678'); expect(parseInt(remainder)).toStrictEqual(12345678); }); + it('Replicates return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => { + const BCH = new BCHJS(); + const testSendAmount = '12345678'; + expect(fromSmallestDenomination(testSendAmount, 8)).toBe( + BCH.BitcoinCash.toBitcoinCash(testSendAmount), + ); + }); + it('Replicates largest possible digits return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => { + const BCH = new BCHJS(); + const testSendAmount = '1000000012345678'; + expect(fromSmallestDenomination(testSendAmount, 8)).toBe( + BCH.BitcoinCash.toBitcoinCash(testSendAmount), + ); + }); + + it('Replicates smallest unit value return value from instance of toBitcoinCash with fromSmallestDenomination and cashDecimals = 8', () => { + const BCH = new BCHJS(); + const testSendAmount = '1'; + expect(fromSmallestDenomination(testSendAmount, 8)).toBe( + BCH.BitcoinCash.toBitcoinCash(testSendAmount), + ); + }); }); diff --git a/web/cashtab/src/hooks/useWallet.js b/web/cashtab/src/hooks/useWallet.js --- a/web/cashtab/src/hooks/useWallet.js +++ b/web/cashtab/src/hooks/useWallet.js @@ -7,6 +7,7 @@ import usePrevious from '@hooks/usePrevious'; import useBCH from '@hooks/useBCH'; import BigNumber from 'bignumber.js'; +import { fromSmallestDenomination } from '@utils/cashMethods'; import localforage from 'localforage'; import { currency } from '@components/Common/Ticker'; import _ from 'lodash'; @@ -92,7 +93,7 @@ ); return { totalBalanceInSatoshis, - totalBalance: BCH.BitcoinCash.toBitcoinCash(totalBalanceInSatoshis), + totalBalance: fromSmallestDenomination(totalBalanceInSatoshis), }; }; diff --git a/web/cashtab/src/utils/__tests__/cashMethods.test.js b/web/cashtab/src/utils/__tests__/cashMethods.test.js new file mode 100644 --- /dev/null +++ b/web/cashtab/src/utils/__tests__/cashMethods.test.js @@ -0,0 +1,20 @@ +import { fromSmallestDenomination } from '@utils/cashMethods'; + +describe('Correctly executes cash utility functions', () => { + it(`Correctly converts smallest base unit to smallest decimal for cashDecimals = 2`, () => { + expect(fromSmallestDenomination(1, 2)).toBe(0.01); + }); + it(`Correctly converts largest base unit to smallest decimal for cashDecimals = 2`, () => { + expect(fromSmallestDenomination(1000000012345678, 2)).toBe( + 10000000123456.78, + ); + }); + it(`Correctly converts smallest base unit to smallest decimal for cashDecimals = 8`, () => { + expect(fromSmallestDenomination(1, 8)).toBe(0.00000001); + }); + it(`Correctly converts largest base unit to smallest decimal for cashDecimals = 8`, () => { + expect(fromSmallestDenomination(1000000012345678, 8)).toBe( + 10000000.12345678, + ); + }); +}); diff --git a/web/cashtab/src/utils/cashMethods.js b/web/cashtab/src/utils/cashMethods.js new file mode 100644 --- /dev/null +++ b/web/cashtab/src/utils/cashMethods.js @@ -0,0 +1,12 @@ +import { currency } from '@components/Common/Ticker'; +import BigNumber from 'bignumber.js'; + +export const fromSmallestDenomination = ( + amount, + cashDecimals = currency.cashDecimals, +) => { + const amountBig = new BigNumber(amount); + const multiplier = new BigNumber(10 ** (-1 * cashDecimals)); + const amountInBaseUnits = amountBig.times(multiplier); + return amountInBaseUnits.toNumber(); +};