All files / src/utils format.ts

100% Statements 36/36
100% Branches 20/20
100% Functions 7/7
100% Lines 34/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75                            18x   18x   18x 18x 18x   18x 12x 1x   11x 1x   10x 10x 1x   9x   9x 9x         9x   9x     18x 8x 1x   7x 1x   6x 6x 6x       6x 6x 1x     5x     18x   124x   18x   30x  
/*
 * Copyright © 2019 Lisk Foundation
 *
 * See the LICENSE file at the top-level directory of this distribution
 * for licensing information.
 *
 * Unless otherwise agreed in a custom licensing agreement with the Lisk Foundation,
 * no part of this software, including this file, may be copied, modified,
 * propagated, or distributed except according to the terms contained in the
 * LICENSE file.
 *
 * Removal or modification of this copyright notice is prohibited.
 *
 */
import { isGreaterThanMaxTransactionAmount } from '@liskhq/lisk-validator';
 
import { FIXED_POINT } from '../constants';
 
const LISK_MAX_DECIMAL_POINTS = 8;
const getDecimalPlaces = (amount: string): number =>
	(amount.split('.')[1] || '').length;
 
export const convertBeddowsToLSK = (beddowsAmount?: string): string => {
	if (typeof beddowsAmount !== 'string') {
		throw new Error('Cannot convert non-string amount');
	}
	if (getDecimalPlaces(beddowsAmount)) {
		throw new Error('Beddows amount should not have decimal points');
	}
	const beddowsAmountBigInt = BigInt(beddowsAmount);
	if (isGreaterThanMaxTransactionAmount(beddowsAmountBigInt)) {
		throw new Error('Beddows amount out of range');
	}
	const int = (beddowsAmountBigInt / BigInt(FIXED_POINT)).toString();
	const floating =
		Number(beddowsAmountBigInt % BigInt(FIXED_POINT)) / FIXED_POINT;
	const floatingPointsSplit = floating
		.toLocaleString(undefined, {
			maximumFractionDigits: LISK_MAX_DECIMAL_POINTS,
		})
		.split('.')[1];
	const res = floating !== 0 ? `${int}.${floatingPointsSplit}` : int;
 
	return res;
};
 
export const convertLSKToBeddows = (lskAmount?: string): string => {
	if (typeof lskAmount !== 'string') {
		throw new Error('Cannot convert non-string amount');
	}
	if (getDecimalPlaces(lskAmount) > LISK_MAX_DECIMAL_POINTS) {
		throw new Error('LSK amount has too many decimal points');
	}
	const splitAmount = lskAmount.split('.');
	const liskAmountInt = BigInt(splitAmount[0]);
	const liskAmountFloatBigInt = BigInt(
		(splitAmount[1] ?? '0').padEnd(LISK_MAX_DECIMAL_POINTS, '0'),
	);
	const beddowsAmountBigInt =
		liskAmountInt * BigInt(FIXED_POINT) + liskAmountFloatBigInt;
	if (isGreaterThanMaxTransactionAmount(beddowsAmountBigInt)) {
		throw new Error('LSK amount out of range');
	}
 
	return beddowsAmountBigInt.toString();
};
 
export const prependPlusToPublicKeys = (
	publicKeys: ReadonlyArray<string>,
): ReadonlyArray<string> => publicKeys.map(publicKey => `+${publicKey}`);
 
export const prependMinusToPublicKeys = (
	publicKeys: ReadonlyArray<string>,
): ReadonlyArray<string> => publicKeys.map(publicKey => `-${publicKey}`);