diff --git a/backend/src/consts/btcAtomicPerBtc.ts b/backend/src/consts/btcAtomicPerBtc.ts new file mode 100644 index 0000000..761558e --- /dev/null +++ b/backend/src/consts/btcAtomicPerBtc.ts @@ -0,0 +1,3 @@ +import Decimal from 'decimal.js'; + +export const BTC_ATOMIC_PER_BTC = new Decimal(100_000_000); diff --git a/backend/src/types/BitcoinConfirmationTier.ts b/backend/src/types/BitcoinConfirmationTier.ts new file mode 100644 index 0000000..c84cff6 --- /dev/null +++ b/backend/src/types/BitcoinConfirmationTier.ts @@ -0,0 +1,4 @@ +export interface BitcoinConfirmationTier { + upToTotalFiat?: string; + minConfirmations: number; +} diff --git a/backend/src/utils/bitcoin/convertBtcAtomicToBtc.spec.ts b/backend/src/utils/bitcoin/convertBtcAtomicToBtc.spec.ts new file mode 100644 index 0000000..bbb1ea7 --- /dev/null +++ b/backend/src/utils/bitcoin/convertBtcAtomicToBtc.spec.ts @@ -0,0 +1,11 @@ +import { convertBtcAtomicToBtc } from './convertBtcAtomicToBtc'; + +describe('convertBtcAtomicToBtc', () => { + it('converts atomic units to BTC', () => { + expect(convertBtcAtomicToBtc('100000000')).toBe('1.00000000'); + }); + + it('converts a single atomic unit to BTC', () => { + expect(convertBtcAtomicToBtc('1')).toBe('0.00000001'); + }); +}); diff --git a/backend/src/utils/bitcoin/convertBtcAtomicToBtc.ts b/backend/src/utils/bitcoin/convertBtcAtomicToBtc.ts new file mode 100644 index 0000000..9bff2fb --- /dev/null +++ b/backend/src/utils/bitcoin/convertBtcAtomicToBtc.ts @@ -0,0 +1,9 @@ +import Decimal from 'decimal.js'; +import { BTC_ATOMIC_PER_BTC } from '../../consts/btcAtomicPerBtc'; + +export const convertBtcAtomicToBtc = ( + amountAtomic: string, + rounding: Decimal.Rounding = Decimal.ROUND_HALF_UP +): string => { + return new Decimal(amountAtomic).div(BTC_ATOMIC_PER_BTC).toDecimalPlaces(8, rounding).toFixed(8); +}; diff --git a/backend/src/utils/bitcoin/convertBtcToBtcAtomic.spec.ts b/backend/src/utils/bitcoin/convertBtcToBtcAtomic.spec.ts new file mode 100644 index 0000000..f93ad10 --- /dev/null +++ b/backend/src/utils/bitcoin/convertBtcToBtcAtomic.spec.ts @@ -0,0 +1,16 @@ +import { convertBtcToBtcAtomic } from './convertBtcToBtcAtomic'; + +describe('convertBtcToBtcAtomic', () => { + it('converts one BTC to atomic units', () => { + expect(convertBtcToBtcAtomic('1')).toBe('100000000'); + }); + + it('converts the smallest display unit to atomic units', () => { + expect(convertBtcToBtcAtomic('0.00000001')).toBe('1'); + }); + + it('returns an integer string without scientific notation', () => { + expect(convertBtcToBtcAtomic('0.00125907')).toBe('125907'); + expect(convertBtcToBtcAtomic('0.00125907')).not.toMatch(/e/i); + }); +}); diff --git a/backend/src/utils/bitcoin/convertBtcToBtcAtomic.ts b/backend/src/utils/bitcoin/convertBtcToBtcAtomic.ts new file mode 100644 index 0000000..4a72cab --- /dev/null +++ b/backend/src/utils/bitcoin/convertBtcToBtcAtomic.ts @@ -0,0 +1,6 @@ +import Decimal from 'decimal.js'; +import { BTC_ATOMIC_PER_BTC } from '../../consts/btcAtomicPerBtc'; + +export const convertBtcToBtcAtomic = (amountBtc: string): string => { + return new Decimal(amountBtc).mul(BTC_ATOMIC_PER_BTC).toDecimalPlaces(0, Decimal.ROUND_HALF_UP).toString(); +}; diff --git a/backend/src/utils/bitcoin/convertFiatToBtc.spec.ts b/backend/src/utils/bitcoin/convertFiatToBtc.spec.ts new file mode 100644 index 0000000..9c0041c --- /dev/null +++ b/backend/src/utils/bitcoin/convertFiatToBtc.spec.ts @@ -0,0 +1,11 @@ +import { convertFiatToBtc } from './convertFiatToBtc'; + +describe('convertFiatToBtc', () => { + it('formats small amounts without scientific notation', () => { + expect(convertFiatToBtc(0.01, 100_000)).toBe('0.00000010'); + }); + + it('converts fiat to BTC at the shop rate', () => { + expect(convertFiatToBtc(50_000, 100_000)).toBe('0.50000000'); + }); +}); diff --git a/backend/src/utils/bitcoin/convertFiatToBtc.ts b/backend/src/utils/bitcoin/convertFiatToBtc.ts new file mode 100644 index 0000000..dfe38cb --- /dev/null +++ b/backend/src/utils/bitcoin/convertFiatToBtc.ts @@ -0,0 +1,5 @@ +import Decimal from 'decimal.js'; + +export const convertFiatToBtc = (fiatAmount: number, fiatPerBtc: number): string => { + return new Decimal(fiatAmount).div(fiatPerBtc).toDecimalPlaces(8, Decimal.ROUND_HALF_UP).toFixed(8); +};