UNPKG

ripple-binary-codec

Version:
49 lines (45 loc) 1.31 kB
import { coreTypes } from './types' import BigNumber from 'bignumber.js' import { bytesToHex, hexToBytes } from '@xrplf/isomorphic/utils' /** * class for encoding and decoding quality */ class quality { /** * Encode quality amount * * @param arg string representation of an amount * @returns Serialized quality */ static encode(quality: string): Uint8Array { let decimal: BigNumber try { decimal = new BigNumber(quality) } catch (_err) { throw new Error(`${quality} is not a valid quality`) } const exponent = (decimal.e || 0) - 15 const qualityString = decimal.times(`1e${-exponent}`).abs().toString() const bytes = coreTypes.UInt64.from(BigInt(qualityString)).toBytes() bytes[0] = exponent + 100 return bytes } /** * Decode quality amount * * @param arg hex-string denoting serialized quality * @returns deserialized quality */ static decode(quality: string): BigNumber { const bytes = hexToBytes(quality).slice(-8) const exponent = bytes[0] - 100 let mantissa: BigNumber try { mantissa = new BigNumber(`0x${bytesToHex(bytes.slice(1))}`) } catch (_err) { throw new Error(`${quality} is not a valid quality`) } return mantissa.times(`1e${exponent}`) } } export { quality }