import BN from 'bn.js' import { Logger } from '../common' import { TEN } from './constant' const logger = Logger.from('entity/bignumber') export type BigNumberish = BN | string | number | bigint const MAX_SAFE = 0x1fffffffffffff export function parseBigNumberish(value: BigNumberish) { // BN if (value instanceof BN) { return value } // string if (typeof value === 'string') { if (value.match(/^-?[0-9]+$/)) { return new BN(value) } return logger.throwArgumentError('invalid BigNumberish string', 'value', value) } // number if (typeof value === 'number') { if (value % 1) { return logger.throwArgumentError('BigNumberish number underflow', 'value', value) } if (value >= MAX_SAFE || value <= -MAX_SAFE) { return logger.throwArgumentError('BigNumberish number overflow', 'value', value) } return new BN(String(value)) } // bigint if (typeof value === 'bigint') { return new BN(value.toString()) } return logger.throwArgumentError('invalid BigNumberish value', 'value', value) } export function tenExponentiate(shift: BigNumberish) { return TEN.pow(parseBigNumberish(shift)) } // round up export function divCeil(a: BN, b: BN): BN { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const dm = a.divmod(b) // Fast case - exact division if (dm.mod.isZero()) return dm.div // Round up return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1) }