@chorus-one/substrate
Version:
All-in-one toolkit for building staking dApps on Substrate Network SDK blockchains(Polkadot, Kusama, etc.)
56 lines (44 loc) • 1.59 kB
text/typescript
import { checkMaxDecimalPlaces } from '@chorus-one/utils'
import BigNumber from 'bignumber.js'
export function macroToDenomAmount (
amount: string, // in macro denom (e.g. ATOM)
denomMultiplier: string
): string {
checkMaxDecimalPlaces(denomMultiplier)
if (BigInt(denomMultiplier) === BigInt(0)) {
throw new Error('denomMultiplier cannot be 0')
}
if (BigNumber(amount).isNaN()) {
throw new Error('invalid amount: ' + amount + ' failed to parse to number')
}
const macroAmount = BigNumber(denomMultiplier).multipliedBy(amount)
if (macroAmount.isNegative()) {
throw new Error('amount cannot be negative')
}
const decimalPlaces = macroAmount.decimalPlaces()
if (decimalPlaces !== null && decimalPlaces > 0) {
throw new Error(
`exceeded maximum denominator precision, amount: ${macroAmount.toString()}, precision: .${macroAmount.precision()}`
)
}
return macroAmount.toString(10)
}
export function denomToMacroAmount (
amount: string, // in denom (e.g. uatom, adydx)
denomMultiplier: string
): string {
checkMaxDecimalPlaces(denomMultiplier)
if (BigInt(denomMultiplier) === BigInt(0)) {
throw new Error('denomMultiplier cannot be 0')
}
if (BigNumber(amount).isNaN()) {
throw new Error('invalid amount: ' + amount + ' failed to parse to number')
}
return BigNumber(amount).dividedBy(denomMultiplier).toString(10)
}
export function getDenomMultiplier (denomMultiplier?: string): string {
if (denomMultiplier === undefined) {
throw new Error('denomMultiplier is not set')
}
return denomMultiplier
}