Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: flexible balance formatting #363

Merged
merged 5 commits into from
Apr 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion packages/core/src/balance/Balance.utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,20 @@ import {
convertToTxUnit,
asFemtoKilt,
TRANSACTION_FEE,
formatKiltBalanceDecimalPlacement,
} from './Balance.utils'

const TESTVALUE = new BN('123456789000')
const TESTVALUE_2 = new BN('123456789000000')
describe('formatKiltBalance', () => {
const TESTVALUE = new BN('123456789000')
const alterExistingOptions = {
decimals: 17,
withUnit: 'KIL',
}
const addingOptions = {
// When enables displays the full unit - micro KILT
withSiFull: false,
}
const baseValue = new BN('1')
it('formats the given balance', async () => {
expect(formatKiltBalance(TESTVALUE)).toEqual('123.4567 micro KILT')
Expand Down Expand Up @@ -43,7 +53,42 @@ describe('formatKiltBalance', () => {
formatKiltBalance(baseValue.mul(new BN(10).pow(new BN(27))))
).toEqual('1.0000 Tril KILT')
})
it('changes formatting options for given balances', () => {
expect(
formatKiltBalance(
baseValue.mul(new BN(10).pow(new BN(12))),
alterExistingOptions
)
).toEqual('10.0000 micro KIL')
expect(
formatKiltBalance(
baseValue.mul(new BN(10).pow(new BN(12))),
alterExistingOptions
)
).not.toEqual('1.0000 micro KILT')
expect(
formatKiltBalance(
baseValue.mul(new BN(10).pow(new BN(12))),
addingOptions
)
).toEqual('1.0000 mKILT')
})
})

describe('format', () => {
it('formats the decimal placements of given balance', () => {
expect(formatKiltBalanceDecimalPlacement(TESTVALUE, 3, 10)).toEqual(
'12.345'
)
expect(formatKiltBalanceDecimalPlacement(TESTVALUE, 8, 16)).toEqual(
'0.00001234'
)
expect(formatKiltBalanceDecimalPlacement(TESTVALUE_2, 2, 9)).toEqual(
'123456.78'
)
})
})

describe('convertToTxUnit', () => {
it('converts given value with given power to femto KILT', () => {
expect(new BN(convertToTxUnit(new BN(1), -15).toString())).toEqual(
Expand Down
31 changes: 28 additions & 3 deletions packages/core/src/balance/Balance.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,36 @@ import { formatBalance } from '@polkadot/util'

export const KILT_COIN = new BN(1)

export function formatKiltBalance(amount: BN): string {
return formatBalance(amount, {
// Exported options from polkadot/util
export interface Options {
decimals?: number
forceUnit?: string
withSi?: boolean
withSiFull?: boolean
withUnit?: boolean | string
}

export function formatKiltBalance(
amount: BN,
additionalOptions?: Options
): string {
const options = {
decimals: 15,
withSiFull: true,
withUnit: 'KILT',
})
...additionalOptions,
}
return formatBalance(amount, options)
}

export function formatKiltBalanceDecimalPlacement(
amount: BN,
decimal: number,
denomination: number
): string {
const factoring = new BN(10).pow(new BN(denomination - decimal))
const skimmedAmount = amount.div(new BN(factoring))
return (skimmedAmount.toNumber() / 10 ** decimal).toString()
}

export function convertToTxUnit(balance: BN, power: number): BN {
Expand All @@ -30,6 +54,7 @@ export default {
KILT_COIN,
TRANSACTION_FEE,
formatKiltBalance,
formatKiltBalanceDecimalPlacement,
asFemtoKilt,
convertToTxUnit,
}
4 changes: 2 additions & 2 deletions packages/core/src/balance/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import BalanceUtils from './Balance.utils'
import BalanceUtils, { Options } from './Balance.utils'
import * as Balance from './Balance.chain'

export { Balance, BalanceUtils }
export { Balance, BalanceUtils, Options }
export default Balance