UNPKG

3.12 kBJavaScriptView Raw
1let randomHex = require('randomhex')
2let numberToBn = require('number-to-bn')
3let {isEmpty, isArray, isString, isNumber} = require('underscore')
4let BN = require('bn.js')
5let values = require('./values')
6let patterns = require('./patterns')
7
8let copyString = val => '' + val
9
10/**
11 * True if string starts with '0x'
12 * @param {string} val
13 * @return {boolean}
14 */
15let startsWithZeroX = val =>
16 isString(val) === true && patterns.zeroX.test(val) === true
17
18/**
19 * Removes '0x' from a string
20 * @param {string} val
21 * @return {string} checkAddressChecksum
22 */
23let removeLeadingZeroX = val =>
24 startsWithZeroX(val) === true ? val.replace(patterns.zeroX, '') : val
25
26/**
27 * Put the 0x at the beginning of a string
28 * @param {string} val
29 * @return {string}
30 */
31let prependZeroX = val =>
32 startsWithZeroX(val) === false ? values.zeroX + val : val
33
34/**
35 * Strips '0x' and turns it into a Buffer
36 * @param {string} val
37 * @return {buffer}
38 */
39let hexToBuffer = val => toBuffer(val)
40
41let bufferToHex = val => val.toString('hex')
42
43let bufferToZeroXHex = val => prependZeroX(bufferToHex(val))
44
45/**
46 * Random Buffer of a size
47 * @param {number} size
48 * @return {buffer}
49 */
50let randomHexBuffer = (size = values.hex.randomHexSize) =>
51 hexToBuffer(removeLeadingZeroX(randomHex(size)))
52
53/**
54 * True if a string is hex
55 * @param {string} val
56 * @return {boolean}
57 */
58let isHex = val => isString(val) === true && patterns.hex.test(val) === true
59
60/**
61 * True if two buffers have the same length and bytes
62 * @param {buffer} buf1
63 * @param {buffer} buf2
64 * @return {boolean}
65 */
66function equalBuffers(buf1, buf2) {
67 if (buf1.length !== buf2.length) {
68 return false
69 }
70
71 return buf1.every((byte, index) => {
72 return buf2[index] === byte
73 })
74}
75
76/**
77 * Gracefully try to convert anything into a buffer
78 * @param {object} val anything
79 * @param {string} encoding hex, utf8
80 * @return {buffer}
81 */
82function toBuffer(val, encoding) {
83 if (val === undefined || val === null) {
84 return Buffer.from([])
85 }
86
87 // buffer or array
88 if (isArray(val) === true || Buffer.isBuffer(val) === true) {
89 return Buffer.from(val)
90 }
91
92 if (isNumber(val) === true || BN.isBN(val) === true) {
93 // to array from BN is an array of bytes
94 return Buffer.from(numberToBn(val).toArray())
95 }
96
97 // string
98 if (isString(val) === true && isEmpty(encoding) === true) {
99 // hex
100 if (startsWithZeroX(val) === true || isHex(val) === true) {
101 return Buffer.from(removeLeadingZeroX(val), 'hex')
102 }
103 }
104
105 // anything else
106 return Buffer.from(val, encoding)
107}
108
109let isBuffer = val => Buffer.isBuffer(val)
110
111function toNumber(val) {
112 if (typeof val === 'number') {
113 return val
114 }
115
116 if (isHex(val) === true) {
117 return new BN(removeLeadingZeroX(val), 'hex').toNumber()
118 }
119
120 if (BN.isBN(val) === true) {
121 return val.toNumber()
122 }
123
124 throw new Error(`unknown format "${typeof val}" ${val}`)
125}
126
127module.exports = {
128 copyString,
129 startsWithZeroX,
130 removeLeadingZeroX,
131 prependZeroX,
132 hexToBuffer,
133 bufferToHex,
134 bufferToZeroXHex,
135 randomHexBuffer,
136 Buffer,
137 equalBuffers,
138 toBuffer,
139 isBuffer,
140 isHex,
141 toNumber
142}