@0x/contracts-test-utils: Allow negative values in toHex().

`@0x/contracts-test-utils`: Add `PPM_DENOMINATOR` and `PPM_100_PERCENT` constants.
This commit is contained in:
Lawrence Forman 2019-09-04 05:10:28 -04:00
parent b78705120e
commit 20ba23fe5f
3 changed files with 18 additions and 13 deletions

View File

@ -70,6 +70,10 @@
"note": "Add `toHex()`, `hexLeftPad()`, `hexRightPad()`, and 'hexInvert()' hex utils", "note": "Add `toHex()`, `hexLeftPad()`, `hexRightPad()`, and 'hexInvert()' hex utils",
"pr": 2109 "pr": 2109
}, },
{
"note": "Add `PPM_DENOMINATOR` and `PPM_100_PERCENT` constants.",
"pr": 2109
},
{ {
"note": "Increase the number of ganache accounts to 20", "note": "Increase the number of ganache accounts to 20",
"pr": 2109 "pr": 2109

View File

@ -80,4 +80,6 @@ export const constants = {
EIP712_DOMAIN_VERSION: '3.0.0', EIP712_DOMAIN_VERSION: '3.0.0',
DEFAULT_GAS_PRICE: 1, DEFAULT_GAS_PRICE: 1,
NUM_TEST_ACCOUNTS: 20, NUM_TEST_ACCOUNTS: 20,
PPM_DENOMINATOR: 1e6,
PPM_100_PERCENT: 1e6,
}; };

View File

@ -5,6 +5,7 @@ import * as ethUtil from 'ethereumjs-util';
import { constants } from './constants'; import { constants } from './constants';
const { WORD_LENGTH } = constants; const { WORD_LENGTH } = constants;
const WORD_CEIL = new BigNumber(2).pow(WORD_LENGTH * 8);
/** /**
* Concatenate all arguments as a hex string. * Concatenate all arguments as a hex string.
@ -45,19 +46,17 @@ export function hexInvert(n: string | BigNumber | number, size: number = WORD_LE
/** /**
* Convert a string, a number, or a BigNumber into a hex string. * Convert a string, a number, or a BigNumber into a hex string.
* Works with negative numbers, as well.
*/ */
export function toHex(n: string | BigNumber | number): string { export function toHex(n: string | BigNumber | number, size: number = WORD_LENGTH): string {
let hex = '0x00'; if (typeof n === 'string' && /^0x[0-9a-f]+$/i.test(n)) {
if (typeof n === 'number') { // Already a hex.
hex = `0x${n.toString(16)}`; return n;
} else if (BigNumber.isBigNumber(n)) {
hex = `0x${n.toString(16)}`;
} else {
if (/^0x/.test(n)) {
hex = n;
} else {
hex = `0x${parseInt(n, 10).toString(16)}`;
} }
let _n = new BigNumber(n);
if (_n.isNegative()) {
// Perform two's-complement.
_n = new BigNumber(hexInvert(toHex(_n.abs()), size).substr(2), 16).plus(1).mod(WORD_CEIL);
} }
return hex; return `0x${_n.toString(16)}`;
} }